-
Notifications
You must be signed in to change notification settings - Fork 0
/
graphite-script.js
139 lines (114 loc) · 3.65 KB
/
graphite-script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var http = require('http');
var args = require('commander')
.version('0.0.1')
.option('-i, --instance_target [target]', 'Instance count target', 'sensu.aws.autoscale.lmm-prod.instance_count')
.option('-q, --queue_target [target]', 'Message queue target', 'sensu.prod.rabbitmq.nva-a-rabbitmq-p01.queues.SwaptionValuationQueueRequestQueue.messages')
.option('-a, --queued_message_avg [number]', 'Average messages queued over time period', 5, parseInt)
.option('-t, --time_period [time period]', 'Message queue time period to average','-5min')
.option('-g, --graphite_hostname [hostname]', 'Graphite server hostname', 'stats')
.option('-p, --graphite_port [port]', 'Graphite server port', 80, parseInt)
.option('-b, --baseline_instances [port]', 'Baseline instances', 2, parseInt)
.parse(process.argv);
var config = {
instancesUrl : '/render?format=json&target=' + args.instance_target + '&from=-1min',
messagesUrl : '/render?format=json&target=' + args.queue_target + '&from=' + args.time_period,
threshold : args.queued_message_avg,
baseline_instances : args.baseline_instances
};
function getInstances(callback) {
var options = {
host: args.graphite_hostname,
port: args.graphite_port,
path: config.instancesUrl,
method: 'GET'
};
var req = http.request(options, function(res) {
var data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
if (res.statusCode === 200) {
var jsonData = JSON.parse(data);
var instances = jsonData[0].datapoints[0][0];
callback(null, instances);
} else {
callback("Server returned " + res.statusCode + "\n" + instancesUrl, null);
}
});
});
req.on('error', function(e) {
callback(e, null);
});
req.end();
}
function getAvgMessageLoad(callback) {
var options = {
host: args.graphite_hostname,
port: args.graphite_port,
path: config.messagesUrl,
method: 'GET'
};
var req = http.request(options, function(res) {
var data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
if (res.statusCode === 200) {
var jsonData = JSON.parse(data);
var points = jsonData[0].datapoints;
var sumPoints = 0;
var numPoints = points.length;
var count = 0;
while(count < numPoints) {
sumPoints += points[count][0];
count++;
}
var avg = sumPoints/numPoints;
callback(null, avg);
} else {
callback("Server returned " + res.statusCode + "\n" + messagesUrl, null);
}
});
});
req.on('error', function(e) {
callback(e, null);
});
req.end();
}
function getScaleDirection() {
getInstances(function(err, instances) {
if (err) {
console.log({ code: -1, message: err });
process.exit(1);
}
getAvgMessageLoad(function(err, average) {
if (err) {
console.log({ code: -1, message: err });
process.exit(1);
}
// -100 == scale downl
// 0 == neutral
// 100 == scale up
var scale_dir = 0;
var scale_msg = "NEUTRAL";
if (average > config.threshold) {
if (instances <= config.baseline_instances) {
scale_dir = 100;
scale_msg = "UP";
}
} else {
if (instances > config.baseline_instances) {
scale_dir = -100;
scale_msg = "DOWN";
}
}
console.log('[SCALE ' + scale_msg + '] AverageMsgLoad: ' + average + ', RunningInstances: ' + instances)
process.exit(scale_dir);
});
});
}
getScaleDirection();