Name

sn_itom_integ_app.GetIntegrationsRate

Description

No description available

Script

var GetIntegrationsRate = Class.create();
GetIntegrationsRate.prototype = {
  initialize: function() {},
  getIntegrationsRate: function(rateType) {
      var result = {};

      switch (rateType) {
          case "metrics":
              var gr_check = new GlideRecord("sn_agent_check");
              //get check of type "metrics"
              gr_check.addQuery("check_def.check_script_type", "8bc00b53532a330034b8ddeeff7b12a1");
              gr_check.query();
              var policiesArray = [];
              var resultPolicies = {};
              try {
                  while (gr_check.next()) {
                      //get the policy sys id
                      var currentPolicy = gr_check.getValue("monitoring_policy");
                      if (currentPolicy) policiesArray.push(currentPolicy);
                  }
                  if (policiesArray.length) {
                      var isAgentPolicyMonitoringCiExist = gs.tableExists('sn_agent_policy_monitored_cis');
                      var isAgentPolicyClientsExist = gs.tableExists('sn_agent_policy_clients');
                      for (var i = 0; i < policiesArray.length; i++) {
                          var currPolicySysId = policiesArray[i];
                          if (isAgentPolicyMonitoringCiExist) {
                              var aggM = new GlideAggregate("sn_agent_policy_monitored_cis");
                              aggM.addQuery("policy", "=", currPolicySysId);
                              aggM.addQuery("agent_id.status", "0");
                              aggM.addQuery("agent_id.data_collection", "0");
                              // Add Aggregate
                              aggM.addAggregate('COUNT(DISTINCT', 'agent_id');
                              aggM.setGroup(true);
                              aggM.groupBy('policy');
                              aggM.query();
                              while (aggM.next()) {
                                  var agentsCount = aggM.getAggregate('COUNT(DISTINCT', 'agent_id');
                                  resultPolicies[currPolicySysId] = {
                                      policySysId: currPolicySysId,
                                      activeAgentsCount: Number(agentsCount)
                                  };
                              }
                          }
                          //if we couldn't find any result in the new table above, let's try the old table
                          if (!resultPolicies[currPolicySysId] && isAgentPolicyClientsExist) {
                              var gr_agent = new GlideRecord("sn_agent_policy_clients");
                              //get only non empty agents lists
                              gr_agent.addQuery("agents_list", "!=", "");
                              gr_agent.addQuery("policy", "=", currPolicySysId);
                              gr_agent.query();
                              var activeAgents, activeAgentsCount;
                              while (gr_agent.next()) {
                                  activeAgents = gr_agent.getValue("agents_list") || "";
                                  if (activeAgents) {
                                      activeAgentsCount = activeAgents.split(",").length;
                                      resultPolicies[currPolicySysId] = {
                                          policySysId: currPolicySysId,
                                          activeAgentsCount: activeAgentsCount
                                      };
                                  }
                              }
                          }
                      }
                      result = resultPolicies;
                  } else {
                      result = {};
                  }
              } catch (e) {
                  result = e.message;
              }
              return result;
          case "events":
              var HOURS_AMOUNT = 12;
              var TABLE_NAME = 'em_event';
              var query = 'time_of_eventRELATIVEGT@hour@ago@' + HOURS_AMOUNT;
              var events = [];

              // Create an aggregate object
              var aggEvent = new GlideAggregate(TABLE_NAME);

              // Get only data from past x hours
              aggEvent.addEncodedQuery(query);
              // Add Aggregate
              aggEvent.addAggregate('COUNT', 'event_class');
              aggEvent.setGroup(true);
              aggEvent.groupBy('event_class');
              aggEvent.groupBy('source');
              aggEvent.query();

              var getLastEventTime = function(source, name) {
                  var eventQuery = query + '^event_class=' + name + '^source=' + source;
                  var aggTime = new GlideRecord(TABLE_NAME);

                  aggTime.addEncodedQuery(eventQuery);
                  aggTime.orderByDesc('time_of_event');
                  aggTime.setLimit(1);
                  aggTime.query();

                  return aggTime.next() ? aggTime.getValue('time_of_event') : "N/A";
              };
              try {
                  while (aggEvent.next()) {
                      var count = aggEvent.getAggregate('COUNT', 'event_class');
                      var name = aggEvent.getValue('event_class');
                      var source = aggEvent.getValue('source');
                      var rate = count / (HOURS_AMOUNT * 60);
                      rate = +rate.toFixed(2);

                      events.push({
                          instanceName: name,
                          instanceSourceName: source,
                          eventsRate: rate,
                          eventsCount: count,
                          lastEventTime: getLastEventTime(source, name)
                      });
                  }
                  result = events;
              } catch (e) {
                  result = e.message;
              }
              return result;

          case "logs":

              //helper function to get the dataInputSysId field name (sys id of the field)
              var getDataInputSysIdFieldName = function() {
                  var dataInputSysId = '7ceff902d2cf0938f2d0d3b7a0018d55';
                  try {
                      var res = sn_idx_docstore.DocStoreTable.getFields('sn_occ_log_viewer_parent');
                      res = res.find(function(x) {
                          return x.label === 'dataInputSysId';
                      });
                      return res.name || dataInputSysId;
                  } catch (e) {
                      return dataInputSysId;
                  }
              };


              var HOURS_AMOUNT_LOGS = 12;
              var TABLE_NAME_LOGS = 'sn_occ_log_viewer_parent';
              var queryLogs = 'timeRELATIVEGT@hour@ago@' + HOURS_AMOUNT_LOGS;
              var logs = {};
              var DiFieldSysId = getDataInputSysIdFieldName();

              // Create an aggregate object
              var aggLog = new GlideAggregate(TABLE_NAME_LOGS);

              // Get only data from past x hours
              aggLog.addEncodedQuery(queryLogs);
              // Add Aggregate
              aggLog.addAggregate('COUNT', DiFieldSysId);
              aggLog.setGroup(true);
              aggLog.groupBy(DiFieldSysId);
              aggLog.query();

              //helper function to get the last log time (UTC timestamp)
              var getLastLogTime = function(fieldName, sysId, queryLogs) {
                  //get logs from the last x hours for currect data input
                  var logQuery = queryLogs + '^' + fieldName + '=' + sysId;
                  var aggTime = new GlideRecord(TABLE_NAME_LOGS);

                  aggTime.addEncodedQuery(logQuery);
                  aggTime.orderByDesc('time');
                  aggTime.setLimit(1);
                  aggTime.query();
                  //convert to UTC and timestamp format
                  return aggTime.next() ? aggTime.getValue('time') : "N/A";
              };


              try {
                  while (aggLog.next()) {
                      var countLogs = aggLog.getAggregate('COUNT', DiFieldSysId);
                      var DiSysId = aggLog.getValue(DiFieldSysId);
                      //get logs per minute
                      var rateLogs = countLogs / (HOURS_AMOUNT_LOGS * 60);
                      rateLogs = +rateLogs.toFixed(2);

                      logs[DiSysId] = {
                          dataInputSysId: DiSysId,
                          logsCount: countLogs,
                          logsRate: rateLogs,
                          lastLogTime: getLastLogTime(DiFieldSysId, DiSysId, queryLogs)
                      };

                  }
                  result = logs;
              } catch (e) {
                  result = e.message;
              }
              return result;
  		//the next case is not in use, and only here for a future reference. In this way we bring the results directly
  		//from ElasticSearch. In order for this to work, we also need to add the relevant cross-scope priviliges, for
  		//allowing our scoped app to access the script include sn_occ.ElasticSearchRequest that is in Health Log Analytics app
          case "elasticSearchLogs":

              var parameters = {
                  pretty: true,
                  size: 0
              };
              var method = 'post';

              var body = {
                  "query": {
                      "range": {
                          "time": {
                              "gt": "now-12h"
                          }
                      }
                  },
                  "aggs": {
                      "logs_count_by_DIsysId": {
                          "terms": {
                              "field": "dataInputSysId"
                          },
                          "aggs": {
                              "latest_log": {
                                  "max": {
                                      "field": "time"
                                  }
                              }
                          }
                      }
                  }
              };
              var HOURS_AMOUNT_E_LOGS = 12;
              try {
                  var api = new sn_occ.ElasticSearchRequest();
                  var urlSuffix = "/_search";
                  var requestBody = JSON.stringify(body);
                  var esResult = api.executeHttp(method, urlSuffix, requestBody, parameters);
                  var resultsBody = JSON.parse(esResult.response_body);
                  var logsResults = {};
                  //var aggResults = EsResults.result.aggregations.buckets;
                  var buckets = (((resultsBody || {}).aggregations || []).logs_count_by_DIsysId || {}).buckets;
                  if (buckets) {
                      buckets.forEach(function(bucket) {
                          logsResults[bucket.key] = {
                              dataInputSysId: bucket.key,
                              logsCount: bucket.doc_count,
                              logsRate: +(bucket.doc_count / (HOURS_AMOUNT_E_LOGS * 60)).toFixed(2),
                              lastLogTime: (bucket.latest_log || {}).value
                          };
                      });
                  }
                  result = logsResults;
              } catch (e) {
                  result = e.message;
              }
              return result;

          default:
              return gs.getMessage("Failed. Rate type parameter has unknown value");
      }
  },
  type: 'GetIntegrationsRate'
};

Sys ID

03c82e0c770221109eee601f2c5a99f4

Offical Documentation

Official Docs: