Name

global.EventHeartbeat

Description

No description available

Script

var EventHeartbeat = Class.create();
EventHeartbeat.prototype = {
  EVENT_NAME : 'glide.heartbeat',
  LAST_BEAT_ID : 'glide.event_heartbeat.last_id',
  LAST_BEAT : 'glide.event_heartbeat.last_beat',
  LAST_DELAY : 'glide.event_heartbeat.last_delay',
  CURRENT_AGE : 'glide.event_heartbeat.current_age',
  VERSION_KEY : 'glide.event_heartbeat.version',
  VERSION_NUMBER: '1.0',

  initialize: function() {
      this.shouldRun = gs.getProperty('glide.installation.developer') != 'true';
  },

  getStatus: function(name) {
      var gr = new GlideRecord('sys_status');
      gr.addQuery('name', name);
      gr.orderByDesc('sys_updated_on');
      gr.setLimit(1);
      gr.query();
      if (gr.next())
          return gr.value + '';
  },

  beat : function() {
      if (!this.shouldRun)
          return;
      var lb = this.getStatus(this.LAST_BEAT_ID);
      var shouldBeat = true;
      if (lb)
          shouldBeat = this.processOldBeat(lb);

      if (!shouldBeat)
          return;

      var gr = new GlideRecord('sysevent');
      gr.name = this.EVENT_NAME;
      gr.user_id = gs.getUserId();
      gr.state = 'ready';
      var id = gr.insert();
      this.postStatus(this.LAST_BEAT_ID, id);
      this.postStatus(this.VERSION_KEY, this.VERSION_NUMBER);
  },

  processOldBeat: function(sys_id) {
      var gr = new GlideRecord('sysevent');
      if (!gr.get(sys_id))
          return true;

      var status = gr.state + '';
      if ('ready' == status || status.indexOf('q') == 0) {
          var created = gr.sys_created_on.getGlideObject().getNumericValue();
          var age = new GlideDateTime().getNumericValue() - created;

          gs.print('EventHeartbeat created: ' + gr.sys_created_on + ', not yet processed, age: ' + age + 'ms');
          this.postStatus(this.CURRENT_AGE, age);
          return false;
      }

      if ('error' == status)
          return true;

      if ('processed' == status) {
          var processed = gr.processed.getGlideObject().getNumericValue();
          var created = gr.sys_created_on.getGlideObject().getNumericValue();
          var delta = processed - created;

          gs.print('EventHeartbeat created: ' + gr.sys_created_on + ", processed: " + gr.processed + ', delay: ' + delta + 'ms');

          this.postStatus(this.LAST_BEAT, gr.sys_created_on);
          this.postStatus(this.LAST_DELAY, delta);
          this.postStatus(this.CURRENT_AGE, delta);

          return true;
      }

      // should never get here but what the heck
      return true;
  },

  postStatus : function(name, value) {
      var gr = new GlideRecord('sys_status');
      var exists = gr.get('name', name);

      gr.name = name;
      gr.value = value;

      if (exists)
          gr.update();
      else
          gr.insert();
  },

  type: 'EventHeartbeat'
};

Sys ID

7e8aa32037132100763d2bb6dcbe5dd7

Offical Documentation

Official Docs: