-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
74 lines (63 loc) · 1.96 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
const urlParse = require('url').parse;
const onHeaders = require('on-headers');
const uuidv4 = require('uuid/v4');
function initMiddleware(opts = {}) {
const stats = {
uuid: uuidv4(),
pid: process.pid,
totalTime: 0,
averageTime: 0,
count: 0
};
const statusCodes = {};
const endpointStats = {};
function getStats() {
const result = {
uptime: process.uptime() * 1e3, // convert to ms
statusCodes,
...stats
};
if (opts.endpointStats) {
result.endpointStats = endpointStats;
}
return result;
}
function statsMiddleware(req, res, next) {
const requestStart = process.hrtime();
onHeaders(res, () => {
const [s, ns] = process.hrtime(requestStart);
const time = s * 1e3 + ns * 1e-6; // convert to ms
stats.totalTime += time;
stats.count++;
stats.averageTime = stats.totalTime / stats.count;
statusCodes[res.statusCode] = statusCodes[res.statusCode]
? statusCodes[res.statusCode] + 1
: 1;
if (opts.endpointStats) {
// prefer using `req.originalUrl` as some frameworks replace `req.url`
const url = req.originalUrl || req.url;
const path = urlParse(url).pathname;
const endpoint = `${req.method} ${path}`;
if (!endpointStats[endpoint]) {
endpointStats[endpoint] = {
totalTime: 0,
averageTime: 0,
count: 0,
statusCodes: {}
};
}
endpointStats[endpoint].totalTime += time;
endpointStats[endpoint].count++;
endpointStats[endpoint].averageTime =
endpointStats[endpoint].totalTime / endpointStats[endpoint].count;
const eStatusCodes = endpointStats[endpoint].statusCodes;
eStatusCodes[res.statusCode] = eStatusCodes[res.statusCode]
? eStatusCodes[res.statusCode] + 1
: 1;
}
});
next();
}
return { getStats, statsMiddleware };
}
module.exports = initMiddleware;