blob: 76ac4e916bbbeac964890b4a8b239156f0dd3ff6 [file] [log] [blame]
(function() {
var EventEmitter, Parser, ProcStat, split,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
EventEmitter = require('events').EventEmitter;
split = require('split');
Parser = require('../parser');
ProcStat = (function(_super) {
var RE_COLSEP, RE_CPULINE;
__extends(ProcStat, _super);
RE_CPULINE = /^cpu[0-9]+ .*$/mg;
RE_COLSEP = /\ +/g;
function ProcStat(sync) {
this.sync = sync;
this.interval = 1000;
this.stats = this._emptyStats();
this._ignore = {};
this._timer = setInterval((function(_this) {
return function() {
return _this.update();
};
})(this), this.interval);
this.update();
}
ProcStat.prototype.end = function() {
clearInterval(this._timer);
this.sync.end();
return this.sync = null;
};
ProcStat.prototype.update = function() {
return new Parser(this.sync.pull('/proc/stat')).readAll().then((function(_this) {
return function(out) {
return _this._parse(out);
};
})(this))["catch"]((function(_this) {
return function(err) {
_this._error(err);
};
})(this));
};
ProcStat.prototype._parse = function(out) {
var cols, line, match, stats, total, type, val, _i, _len;
stats = this._emptyStats();
while (match = RE_CPULINE.exec(out)) {
line = match[0];
cols = line.split(RE_COLSEP);
type = cols.shift();
if (this._ignore[type] === line) {
continue;
}
total = 0;
for (_i = 0, _len = cols.length; _i < _len; _i++) {
val = cols[_i];
total += +val;
}
stats.cpus[type] = {
line: line,
user: +cols[0] || 0,
nice: +cols[1] || 0,
system: +cols[2] || 0,
idle: +cols[3] || 0,
iowait: +cols[4] || 0,
irq: +cols[5] || 0,
softirq: +cols[6] || 0,
steal: +cols[7] || 0,
guest: +cols[8] || 0,
guestnice: +cols[9] || 0,
total: total
};
}
return this._set(stats);
};
ProcStat.prototype._set = function(stats) {
var cur, found, id, loads, m, old, ticks, _ref;
loads = {};
found = false;
_ref = stats.cpus;
for (id in _ref) {
cur = _ref[id];
old = this.stats.cpus[id];
if (!old) {
continue;
}
ticks = cur.total - old.total;
if (ticks > 0) {
found = true;
m = 100 / ticks;
loads[id] = {
user: Math.floor(m * (cur.user - old.user)),
nice: Math.floor(m * (cur.nice - old.nice)),
system: Math.floor(m * (cur.system - old.system)),
idle: Math.floor(m * (cur.idle - old.idle)),
iowait: Math.floor(m * (cur.iowait - old.iowait)),
irq: Math.floor(m * (cur.irq - old.irq)),
softirq: Math.floor(m * (cur.softirq - old.softirq)),
steal: Math.floor(m * (cur.steal - old.steal)),
guest: Math.floor(m * (cur.guest - old.guest)),
guestnice: Math.floor(m * (cur.guestnice - old.guestnice)),
total: 100
};
} else {
this._ignore[id] = cur.line;
delete stats.cpus[id];
}
}
if (found) {
this.emit('load', loads);
}
return this.stats = stats;
};
ProcStat.prototype._error = function(err) {
return this.emit('error', err);
};
ProcStat.prototype._emptyStats = function() {
return {
cpus: {}
};
};
return ProcStat;
})(EventEmitter);
module.exports = ProcStat;
}).call(this);