express-status-monitor
Version:
Realtime Monitoring for Express-based Node applications
56 lines (45 loc) • 1.4 kB
JavaScript
const pidusage = require('pidusage');
const os = require('os');
const v8 = require('v8');
const sendMetrics = require('./send-metrics');
const debug = require('debug')('express-status-monitor');
let eventLoopStats; // eslint-disable-line
try {
eventLoopStats = require('event-loop-stats'); // eslint-disable-line
} catch (error) {
console.warn('event-loop-stats not found, ignoring event loop metrics...');
}
module.exports = (io, span) => {
const defaultResponse = {
2: 0,
3: 0,
4: 0,
5: 0,
count: 0,
mean: 0,
timestamp: Date.now(),
};
pidusage(process.pid, (err, stat) => {
if (err) {
debug(err);
return;
}
const last = span.responses[span.responses.length - 1];
// Convert from B to MB
stat.memory = stat.memory / 1024 / 1024;
stat.load = os.loadavg();
stat.timestamp = Date.now();
stat.heap = v8.getHeapStatistics();
if (eventLoopStats) {
stat.loop = eventLoopStats.sense();
}
span.os.push(stat);
if (!span.responses[0] || (last.timestamp + span.interval) * 1000 < Date.now()) {
span.responses.push(defaultResponse);
}
// todo: I think this check should be moved somewhere else
if (span.os.length >= span.retention) span.os.shift();
if (span.responses[0] && span.responses.length > span.retention) span.responses.shift();
sendMetrics(io, span);
});
};