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