Name

global.Diagnostics

Description

Gather various system diagnostic information including node status information

Script

gs.include("PrototypeServer");

var Diagnostics = Class.create();
Diagnostics.prototype = {

  initialize: function() {
      this.fillConditions();
      this.fillNodes();
      this.fillEventCounts();
      this.fillLogCounts();
      this.fillEmailCounts();
      this.fillLogSizes();
      this.nodeIndex = -1;
  },

  nextNode: function() {
      if (this.nodeIndex <= this.nodes.length)
          this.nodeIndex++;

      return (this.nodeIndex < this.nodes.length);
  },

  getNode: function() {
      if (this.nodeIndex < this.nodes.length)
          return this.nodes[this.nodeIndex];

      return null;
  },

  fillConditions: function() {
      this.conditions = {};
      var gr = new GlideRecord('sys_properties');
      gr.addQuery('name', 'STARTSWITH', 'diagnostics.condition.');
      gr.query();
      while (gr.next()) {
          var n = gr.name.toString().substring(22);
          var v = gr.value.toString();
          this.conditions[n] = v;
      }
  },

  fillNodes: function() {
      this.nodes = [];
      var gr = new GlideRecord('sys_cluster_state');
      gr.query();
      while (gr.next()) {
          var node = this._fillNode(gr);
          if (node)
              this.nodes.push(node);
      }
  },

  _fillNode: function(gr) {
      var systemId = gr.system_id.toString();
      var node;

      if (systemId == GlideServlet.getSystemID()) {
          node = this._fillFromLocal(gr);
      } else {
          node = this._fillFromClusterState(gr);
      }

      node.nameLink = "<a class='linked' href='sys_cluster_state.do?sys_id=" + gr.sys_id.toString() +
          "&sys_target=node_stats.stats&XML=&sysparm_stack=no' target='_new'>" + node.name + "</a>";

      return node;
  },

  _fillFromLocal: function(gr) {
      var node = {};
      node.name = gr.system_id.toString();
      node.status = gr.status.toString();
      node.lastDate = gr.nowDateTime();
      node.lastDateDiff = gs.dateDiff(node.lastDate, gs.nowDateTime(), true);

      node.stats = this._getInitNodeStats();

      try {
          var xml = new XMLHelper(new GlideXMLStats().toStringWithInclude(gs.getProperty("glide.cluster.xmlstats")));
          node.stats = xml.toObject();
      } catch (ex) {
          gs.log("ERROR: " + ex);
      }

      return node;
  },

  _fillFromClusterState: function(gr) {
      var node = {};
      node.name = gr.system_id.toString();
      node.status = gr.status.toString();
      node.lastDate = gr.most_recent_message.getDisplayValue();
      node.lastDateDiff = gs.dateDiff(node.lastDate, gs.nowDateTime(), true);

      node.stats = this._getInitNodeStats();

      if (!gr.node_stats.stats.nil()) {
          try {
              var xml = new XMLHelper(gr.node_stats.stats.toString());
              node.stats = xml.toObject();
          } catch (ex) {
              gs.log("ERROR: " + ex);
          }
      }

      return node;
  },

  _getInitNodeStats: function() {
      nodeStats = {};
      nodeStats['system.memory.max'] = '?';
      nodeStats['system.memory.in.use'] = '?';

      return nodeStats;
  },

  fillEventCounts: function() {
      var agg = new GlideAggregate('sysevent');
      agg.addQuery('state', '=', 'ready');
      agg.addAggregate("COUNT");
      agg.query();
      this.eventCount = 0;
      if (agg.next())
          this.eventCount = agg.getAggregate("COUNT");
  },

  fillLogCounts: function() {
      var agg = new GlideAggregate('syslog');
      agg.addQuery('sys_created_on', '>', gs.minutesAgo(60));
      agg.addAggregate("COUNT");
      this.logCount = 0;
      agg.query();
      if (agg.next())
          this.logCount = agg.getAggregate("COUNT");
  },

  fillEmailCounts: function() {
      var oneHourAgo = gs.minutesAgo(60);
      var agg = new GlideAggregate('sys_email');
      agg.addQuery('type', 'received');
      agg.addQuery('sys_created_on', '>', oneHourAgo);
      agg.addAggregate("COUNT");
      agg.query();
      this.emailReceivedCount = 0;
      if (agg.next())
          this.emailReceivedCount = agg.getAggregate("COUNT");

      agg = new GlideAggregate('sys_email');
      agg.addQuery('type', 'sent');
      agg.addQuery('sys_created_on', '>', oneHourAgo);
      agg.addAggregate("COUNT");
      agg.query();
      this.emailSentCount = 0;
      if (agg.next())
          this.emailSentCount = agg.getAggregate("COUNT");

      this.pop3Status = '';
      this.smtpStatus = '';
      var gr = new GlideRecord('sys_status');
      gr.addQuery('name', 'glide.pop3.status');
      gr.query();
      if (gr.next())
          this.pop3Status = gr.value.toString();

      gr.initialize();
      gr.addQuery('name', 'glide.smtp.status');
      gr.query();
      if (gr.next())
          this.smtpStatus = gr.value.toString();
      else
          this.smtpStatus = gs.getMessage('No emails sent yet');
  },

  fillLogSizes: function() {

  },

  type: 'Diagnostics'
}

Sys ID

508f4cbc0a25810200b051fed91e04c6

Offical Documentation

Official Docs: