abacus
Version:
Counter library with statsD support
111 lines (81 loc) • 2.83 kB
JavaScript
var util = require('util');
var StatsD = require('statsd-client');
var Abacus = module.exports = function(opts){
this.opts = opts || {};
this.counters = {};
this.statsD = false;
this.flushPeriod = false;
// Start a statsD connection if configured
if (this.opts.statsD) {
var statsDConfig = this.opts.statsD;
this.statsD = new StatsD(statsDConfig.connection);
}
if (this.opts.flushFrequency) {
this.flushPeriodically(this.opts.flushFrequency);
}
if (this.opts.printFrequency) {
this.printPeriodically(this.opts.printFrequency);
}
};
Abacus.prototype.increment = function(counter, increment){
if(typeof increment == "undefined") increment = 1;
if(!this.counters[counter]) this.counters[counter] = 0;
this.counters[counter] += increment;
if (this.statsD && !this.flushPeriod) {
this.statsD.increment(this.opts.statsD.metricPrefix + counter);
}
};
Abacus.prototype.print = function(){
// check for an empty object, stop if it's empty and printEmpty isn't truthy
if (!this.opts.printEmpty && Object.keys(this.counters).length === 0) return;
console.log(util.inspect(this.counters));
};
Abacus.prototype.printPeriodically = function(interval){ // interval in ms
if(!interval) return;
if (this.period) clearInterval(this.period);
this.period = setInterval(this.print.bind(this), interval);
};
Abacus.prototype.stopPeriod = function(){
if (!this.period) return;
clearInterval(this.period);
this.period = false;
};
Abacus.prototype.flush = function() {
var q = [];
this.debug('flushing counters');
if (this.opts.printOnFlush) this.print();
for (var counter in this.counters){
if (!this.counters.hasOwnProperty(counter)) continue;
q.push(this.statsD.counter.bind(this.statsD, this.opts.statsD.metricPrefix + counter, this.counters[counter]));
if(this.opts.resetOnFlush) this.counters[counter] = 0;
}
if (this.opts.deleteOnFlush) this.counters = {};
for (var i = 0; i < q.length; i++) {
q[i]();
}
};
Abacus.prototype.flushPeriodically = function(interval) { // interval in ms
if(!interval || !this.opts.statsD) return;
if (this.flushPeriod) clearInterval(this.flushPeriod);
this.flushPeriod = setInterval(this.flush.bind(this), interval);
};
Abacus.prototype.stopFlushing = function() {
if(!this.flushPeriod) return;
clearInterval(this.flushPeriod);
this.flushPeriod = false;
};
Abacus.prototype.get = function(counter) {
return this.counters[counter] || 0;
};
Abacus.prototype.getCounters = function(){
return this.counters;
};
Abacus.prototype.set = function(counter, value) {
if(value === null) return;
this.counters[counter] = value;
};
Abacus.prototype.debug = function() {
if(typeof this.opts.debug != "function") return;
var log = this.opts.debug;
log.apply(log, arguments);
};