-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
105 lines (96 loc) · 3.73 KB
/
index.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
const Oppsy = require('oppsy');
const defaults = {
interval: 1000 * 15,
verbose: false,
logMemory: 'info', //info, warning
logCpu: 'info', //info, warning
logRequests: 'info', //info, warning
failedRequestThreshold: 10,
memoryThreshold: 80,
avgResponseTimeThreshold: 2000,
cpuThresholds: [1.0, 1.0, 1.0] // 1, 5 and 15-minute load averages
};
const register = function(server, options) {
const port = server.info.port;
const oppsy = new Oppsy(server);
options = Object.assign({}, defaults, options);
oppsy.on('ops', (data) => {
if (options.logMemory) {
const freeMb = data.osmem.free / 1048576;
const totalMb = data.osmem.total / 1048576;
const memPercent = 100 - ((freeMb / totalMb).toFixed(2) * 100);
if (options.logMemory === 'info') {
server.log(['ops', 'memory'], {
used: `${(totalMb - freeMb).toFixed(2)}mb`,
free: `${(freeMb).toFixed(2)}mb`,
percentUsed: `${memPercent}%`
});
}
// warn if memory consumption exceeds the expected threshold:
if (memPercent > options.memoryThreshold) {
server.log(['ops', 'memory', 'warning', 'threshold'], `${memPercent}% of memory used. Exceeds threshold of ${options.memoryThreshold}%`);
}
}
if (options.logCpu) {
if (options.logCpu === 'info') {
server.log(['ops', 'cpu'], {
'1-minute': data.osload[0].toFixed(3),
'5-minute': data.osload[1].toFixed(3),
'15-minute': data.osload[2].toFixed(3)
});
}
// warn if any of the CPU load averages exceeds the expected threshold:
for (let i = 0; i < 3; i++) {
const cpuLabel = ['1-minute', '5-minute', '15-minute'][i];
const cpuThreshold = options.cpuThresholds[i];
const cpuAvg = data.osload[i];
if (cpuAvg > cpuThreshold) {
server.log(['ops', 'cpu', 'warning', 'threshold'], `Average ${cpuLabel} CPU load of ${cpuAvg} exceeds threshold of ${cpuThreshold}`);
}
}
}
if (options.logRequests) {
// server.log request info:
// track % of requests that were not HTTP OK:
if (data.requests[port] !== undefined && data.requests[port].total !== 0) {
let totalRequestsProcessed = 0;
let totalErrorRequests = 0;
const requestData = data.requests[port];
if (data.responseTimes[port]) {
requestData.avgResponseTime = data.responseTimes[port].avg;
requestData.maxResponseTime = data.responseTimes[port].max;
}
if (options.logRequests === 'info') {
server.log(['ops', 'requests'], requestData);
}
totalRequestsProcessed += requestData.total;
Object.keys(requestData.statusCodes).forEach((code) => {
if (parseInt(code, 10) >= 400) {
totalErrorRequests += requestData.statusCodes[code];
}
});
const failedRequestPercent = ((totalErrorRequests / totalRequestsProcessed) * 100).toFixed(2);
if (failedRequestPercent > options.failedRequestThreshold) {
server.log(['ops', 'requests', 'threshold', 'warning'], `${failedRequestPercent}% of http requests have returned a non-200 code`);
}
if (requestData.avgResponseTime > options.avgResponseTimeThreshold) {
server.log(['ops', 'requests', 'threshold', 'warning'], `Average response time is ${requestData.avgResponseTime}ms. Exceeds threshold of ${options.avgResponseTimeThreshold}ms`);
}
}
}
});
server.expose('oppsy', oppsy);
server.ext({
type: 'onPostStart',
method: () => {
oppsy.start(options.interval);
}
});
server.events.on('stop', () => oppsy.stop());
};
exports.plugin = {
name: 'hapi-oppsy',
register,
once: true,
pkg: require('./package.json')
};