uriel
Version:
A NodeJS statsd agent to push memory, cpu, network, swap, diskio, and disk usage over UDP
111 lines (92 loc) • 3.73 kB
JavaScript
// app/monitors/cpu.js
const os = require('os');
const Monitor = require('../lib/monitor');
const isNil = require('lodash.isnil');
class CpuMonitor extends Monitor {
constructor(statsFactory) {
super('cpu', statsFactory);
}
collect() {
const allStats = [];
const intervalCpuTimes = this.getIntervalCpuTimes();
if (intervalCpuTimes === null) {
return;
}
const totalIntervalCpuTime = intervalCpuTimes.user +
intervalCpuTimes.nice +
intervalCpuTimes.sys +
intervalCpuTimes.idle +
intervalCpuTimes.irq;
const stats = {
usage_user: (intervalCpuTimes.user / totalIntervalCpuTime * 100).toFixed(2),
usage_nice: (intervalCpuTimes.nice / totalIntervalCpuTime * 100).toFixed(2),
usage_sys: (intervalCpuTimes.sys / totalIntervalCpuTime * 100).toFixed(2),
usage_idle: (intervalCpuTimes.idle / totalIntervalCpuTime * 100).toFixed(2),
usage_irq: (intervalCpuTimes.irq / totalIntervalCpuTime * 100).toFixed(2),
usage_total: 100 - (intervalCpuTimes.idle / totalIntervalCpuTime * 100).toFixed(2),
num_cpus: intervalCpuTimes.cpus.length
};
allStats.push(this.bundleStats(stats, ['cpu:total']));
for (let itr = 0, jtr = intervalCpuTimes.cpus.length; itr < jtr; itr++) {
const cpu = intervalCpuTimes.cpus[itr];
const tags = [`cpu:${itr}`];
const totalIndividualCpuTime = cpu.user +
cpu.nice +
cpu.sys +
cpu.idle +
cpu.irq;
const cpuStats = {
usage_user: (cpu.user / totalIndividualCpuTime * 100).toFixed(2),
usage_nice: (cpu.nice / totalIndividualCpuTime * 100).toFixed(2),
usage_sys: (cpu.sys / totalIndividualCpuTime * 100).toFixed(2),
usage_idle: (cpu.idle / totalIndividualCpuTime * 100).toFixed(2),
usage_irq: (cpu.irq / totalIndividualCpuTime * 100).toFixed(2),
usage_total: 100 - (cpu.idle / totalIndividualCpuTime * 100).toFixed(2)
};
allStats.push(this.bundleStats(cpuStats, tags));
}
this.setStats(allStats);
}
getIntervalCpuTimes() {
const newCpuTimes = this.getCpuTimes();
if (isNil(this.currentCpuTimes)) {
this.currentCpuTimes = newCpuTimes;
return null;
}
const intervalCpuTimes = {
user: newCpuTimes.user - this.currentCpuTimes.user,
nice: newCpuTimes.nice - this.currentCpuTimes.nice,
sys: newCpuTimes.sys - this.currentCpuTimes.sys,
idle: newCpuTimes.idle - this.currentCpuTimes.idle,
irq: newCpuTimes.irq - this.currentCpuTimes.irq,
cpus: []
};
for (let itr = 0, jtr = newCpuTimes.cpus.length; itr < jtr; itr++) {
intervalCpuTimes.cpus.push({
user: newCpuTimes.cpus[itr].user - this.currentCpuTimes.cpus[itr].user,
nice: newCpuTimes.cpus[itr].nice - this.currentCpuTimes.cpus[itr].nice,
sys: newCpuTimes.cpus[itr].sys - this.currentCpuTimes.cpus[itr].sys,
idle: newCpuTimes.cpus[itr].idle - this.currentCpuTimes.cpus[itr].idle,
irq: newCpuTimes.cpus[itr].irq = this.currentCpuTimes.cpus[itr].irq
});
}
// Save the current into the old
this.currentCpuTimes = newCpuTimes;
return intervalCpuTimes;
}
getCpuTimes() {
const cpus = os.cpus();
const newCpuTimes = { user: 0, nice: 0, sys: 0, idle: 0, irq: 0, cpus: [] };
for (let itr = 0, jtr = cpus.length; itr < jtr; itr++) {
const cpu = cpus[itr];
newCpuTimes.cpus.push(cpu.times);
newCpuTimes.user += cpu.times.user;
newCpuTimes.nice += cpu.times.nice;
newCpuTimes.sys += cpu.times.sys;
newCpuTimes.idle += cpu.times.idle;
newCpuTimes.irq += cpu.times.irq;
}
return newCpuTimes;
}
}
module.exports = CpuMonitor;