· 7 years ago · Sep 10, 2018, 12:54 PM
1var AWS_CloudWatch_JS = Class.create();
2
3var SUCCESS = Packages.com.service_now.mid.probe.tpcon.OperationStatusType.SUCCESS;
4var FAILURE = Packages.com.service_now.mid.probe.tpcon.OperationStatusType.FAILURE;
5var AWSRawMetric = Packages.com.snc.oi.metric.connector.AWSRawMetric;
6var AWSMetricConnector = Packages.com.snc.oi.metric.connector.AWSMetricConnector;
7var MetricFactory = Packages.com.service_now.metric.MetricFactory;
8var RawMetric = Packages.com.service_now.metric.model.RawMetric;
9var StringUtil = Packages.com.glide.util.StringUtil;
10var regions = this.probe.getAdditionalParameter("regions");
11var accountId = this.probe.getAdditionalParameter("account_id");
12var accessKey = this.probe.getCredentialAttribute("access_key");
13var secretKey = this.probe.getCredentialAttribute("secret_key");
14
15var METRIC_SOURCE_NAME = "AWS CloudWatch Metrics";
16var MAX_EVENTS_TO_FETCH = 3000;
17var ONE_MINUTE_IN_MILLISECONDS = 60000;
18var errorMessage = "";
19
20AWS_CloudWatch_JS.prototype = Object.extendsObject(AProbe, {
21 retrieveKpi: function() {
22 var scriptStartTime = new Date();
23 var period = parseInt(this.probe.getAdditionalParameter("period_sec"));
24 var offset = 60 * 1000 * parseInt(this.probe.getAdditionalParameter("offset_min"));
25 var maxFetchTime = 60 * 1000 * parseInt(this.probe.getAdditionalParameter("max_fetch_interval_min"));
26 var lastKpiSignature = parseInt(this.probe.getParameter("last_kpi_signature"));
27 var errorMessageToReturn;
28 var fetchStartTime;
29 var metricCount;
30 var retVal = {};
31 var fetchEndTime = this.roundDownToMinute(new Date().getTime()) - offset;
32 var metricList;
33 try {
34 var metricConnector = new AWSMetricConnector(regions, period, accessKey, secretKey, accountId);
35 if (lastKpiSignature == null
36 || fetchEndTime - lastKpiSignature > maxFetchTime) {
37 fetchStartTime = fetchEndTime - maxFetchTime;
38 ms.log("No previous fetch or too long ago");
39 } else {
40 fetchStartTime = lastKpiSignature;
41 }
42
43 ms.log("fetch start time: " + new Date(fetchStartTime));
44 ms.log("fetch end time: " + new Date(fetchEndTime));
45
46 var metricHandler = MetricFactory.getMetricHandler();
47 metricList = metricConnector.getRawMetrics(fetchStartTime, fetchEndTime);
48
49 if (metricList != null) {
50 for(var i =0 ; i < metricList.size(); i++) {
51 var rawMetric = this.toRawMetric(metricList.get(i));
52 metricHandler.handleMetric(rawMetric);
53 }
54 }
55
56 ms.log(metricList.size() + " metrics handled");
57
58 } catch (err) {
59 errorMessageToReturn = err.message;
60 }
61 retVal = this.getReturnVal(errorMessageToReturn);
62
63 retVal['metric_duration'] = '' + Number((new Date().getTime() - scriptStartTime.getTime()));
64 retVal['metric_source'] = METRIC_SOURCE_NAME;
65 retVal['metric_count'] = metricList.size();
66 retVal['last_kpi_signature'] = fetchEndTime.toString();
67 return retVal;
68 },
69
70 toRawMetric: function(awsRawMetric) {
71 return new RawMetric(awsRawMetric.getMetricType(), awsRawMetric.getNode(), awsRawMetric.getValue(), awsRawMetric.getTimestamp(), awsRawMetric.getCiIdentifier(), awsRawMetric.getSource());
72 },
73
74 getReturnVal: function(errorMessageToReturn) {
75 var retVal = {};
76 if (StringUtil.notNil(errorMessageToReturn) && errorMessageToReturn !== undefined) {
77 retVal['status'] = "" + FAILURE.toString();
78 retVal['error_message'] = errorMessageToReturn + "";
79 ms.log("AWS_CloudWatch_JS: STATUS: ERROR: " + errorMessageToReturn);
80 } else {
81 retVal['status'] = "" + SUCCESS.toString();
82 ms.log("AWS_CloudWatch_JS: STATUS: SUCCESS");
83 }
84
85 return retVal;
86 },
87
88 roundDownToMinute: function(timeInMilli) {
89 return 60000.0*Math.floor(timeInMilli/60000.0);
90 },
91
92 // test the connection with the target monitor
93 testConnection : function() {
94
95 ms.log("Connector testing connection");
96
97 var retVal = {};
98 var errorMsg = "";
99
100 if (StringUtil.nil(regions)) {
101 errorMsg = "Regions field is empty.";
102 this.addError(errorMsg);
103 retVal['error_message'] = errorMsg;
104 retVal['status'] = FAILURE.toString();
105 return retVal;
106 }
107 if (StringUtil.nil(accountId)) {
108 errorMsg = "AccountId field is empty.";
109 this.addError(errorMsg);
110 retVal['error_message'] = errorMsg;
111 retVal['status'] = FAILURE.toString();
112 return retVal;
113 }
114
115 try {
116 var metricConnector = new AWSMetricConnector(regions, 300, accessKey, secretKey, accountId);
117
118 var startTime = Date.now().toString();
119 var endTime = new Date(Date.now() + ONE_MINUTE_IN_MILLISECONDS).getTime().toString();
120
121 if (metricConnector.testRawMetrics(startTime, endTime)){
122 retVal['status'] = SUCCESS.toString();
123 } else{
124 errorMsg = "No metrics were retrieved from AWS.";
125 this.addError(errorMsg);
126 retVal['error_message'] = errorMsg;
127 retVal['status'] = FAILURE.toString();
128 }
129
130 } catch (e) {
131 this.addError(e.toString());
132 retVal['status'] = FAILURE.toString();
133 }
134
135 ms.log("Connector testConnection " + retVal['status'] );
136 retVal = this.getReturnVal(errorMessage);
137 return retVal;
138 },
139
140 execute: function() {
141
142 ms.log("Connector: execute connection ...");
143
144 var retVal = {};
145
146 retVal['status'] = SUCCESS.toString();
147
148 return retVal;
149 },
150
151 addError : function(message){
152 if (errorMessage === "")
153 errorMessage = message;
154 else
155 errorMessage += "\n" + message;
156 ms.log(message);
157 },
158
159type: "AWS_CloudWatch_JS"
160});