Name

global.ServiceSeveritySync

Description

Syncronizes the severity of a service to be the same in both tables em_impact_status and cmdb_ci_service_auto

Script

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

  initialize: function() {},

  syncSeverityOfMonitoredServices: function() {
      var grCmdbCiServiceAuto = new GlideRecord("cmdb_ci_service_auto");
      var servicesBatch = {};
  	var servicesBatchNames = {};
  	
      var maxBatchSize = 500;
      var maxServicesToChange = 15000;
      var currBatchSize = 0;
      grCmdbCiServiceAuto.addQuery("operational_status", 1);
      grCmdbCiServiceAuto.query();
      if (grCmdbCiServiceAuto.getRowCount() > maxServicesToChange)
          gs.warn("ServiceSeveritySync: The number of services to check has reached the maximum limit (15,000 Services).");
      else {
          // for every monitored operational service
          while (grCmdbCiServiceAuto.next()) {
              // batching services
              if (currBatchSize < maxBatchSize) {
                  servicesBatch[grCmdbCiServiceAuto.getUniqueValue()] = grCmdbCiServiceAuto.getValue("severity");
                  servicesBatchNames[grCmdbCiServiceAuto.getUniqueValue()] = grCmdbCiServiceAuto.getValue("name");
                  currBatchSize++;
                  continue;
              }
              this.checkAndSyncServices(servicesBatch, servicesBatchNames);
              servicesBatch = {};
              currBatchSize = 0;
          }
          this.checkAndSyncServices(servicesBatch, servicesBatchNames);
      }
  },

  checkAndSyncServices: function(servicesBatch, servicesBatchNames) {
      var servicesNotFoundInImpact = {};
      for (var i in servicesBatch) {
          servicesNotFoundInImpact[i] = '';
      }

      var time = new GlideDateTime();
      var severity;
      var serviceSysId;
      var grEmImpactStatus = new GlideRecord("em_impact_status");
      grEmImpactStatus.addQuery("element_id", Object.keys(servicesBatch));
      grEmImpactStatus.addQuery("vt_end", ">=", time);
      grEmImpactStatus.query();
      // for every record in impact status
      while (grEmImpactStatus.next()) {
          // we are interested only in the records of business services (query brings also records 'service'-'connected service')
          if (grEmImpactStatus.getValue("element_id") != grEmImpactStatus.getValue("business_service"))
              continue;
          severity = grEmImpactStatus.getValue("severity");
          serviceSysId = grEmImpactStatus.getValue("business_service");
          // check their severities and change accordingly
          if (servicesBatch[serviceSysId] != severity) {
              this.fixSeverityInServiceTable(serviceSysId, severity, servicesBatchNames[serviceSysId]);
          }

          // mark that service was found in impact
          delete servicesNotFoundInImpact[serviceSysId];
      }

      // go over services that does not appear in em_impact_status and verify that they have severity "OK"
      for (var serviceSysIdIterator in servicesNotFoundInImpact) {
          if (servicesBatch[serviceSysIdIterator] != '5') {
              this.fixSeverityInServiceTable(serviceSysIdIterator, '5', servicesBatchNames[serviceSysIdIterator]);
          }

      }

  },


  fixSeverityInServiceTable: function(serviceSysId, severity, serviceName) {
      var gr = new GlideRecord("cmdb_ci_service_auto");
      gr.get("sys_id", serviceSysId);
      gs.error("ServiceSeveritySync: The severity of the service " + serviceName + " " + serviceSysId +
          " in cmdb_ci_service_auto was changed from " + gr.getValue("severity") + " to " + severity +
          " because it was not synced with em_impact_status.");
      gr.setValue("severity", severity);
      gr.update();
  },



  type: 'ServiceSeveritySync'
};

Sys ID

ee39156a7347101061e5157964f6a723

Offical Documentation

Official Docs: