Node.js client for statsd.
varSDC=require('statsd-client'),sdc=newSDC({host: 'statsd.example.com'});vartimer=newDate();sdc.increment('some.counter');// Increment by one.sdc.gauge('some.gauge',10);// Set gauge to 10sdc.timing('some.timer',timer);// Calculates time diffsdc.close();// Optional - stop NOWvarSDC=require('statsd-client'),sdc=newSDC({host: 'statsd.example.com',port: 8124,debug: true});Global options:
prefix: Prefix all stats with this value (default"").debug: Print what is being sent to stderr (defaultfalse).tcp: User specifically wants to use tcp (defaultfalse).socketTimeout: Dual-use timer. Will flush metrics every interval. For UDP, it auto-closes the socket after this long without activity (default 1000 ms; 0 disables this). For TCP, it auto-closes the socket aftersocketTimeoutsToClosenumber of timeouts have elapsed without activity.
UDP options:
host: Where to send the stats (defaultlocalhost).port: Port to contact the statsd-daemon on (default8125).
TCP options:
host: Where to send the stats (defaultlocalhost).port: Port to contact the statsd-daemon on (default8125).socketTimeoutsToClose: Number of timeouts in which the socket auto-closes if it has been inactive. (default10;1to auto-close after a single timeout).
HTTP options:
host: The URL to send metrics to (default:http://localhost).headers: Additional headers to send (default{})method: What HTTP method to use (defaultPUT)
Counters are supported, both as raw .counter(metric, delta) and with the
shortcuts .increment(metric, [delta=1]) and .decrement(metric, [delta=-1]):
sdc.increment('systemname.subsystem.value');// Increment by onesdc.decrement('systemname.subsystem.value',-10);// Decrement by 10sdc.counter('systemname.subsystem.value',100);// Increment by 100Sends an arbitrary number to the back-end:
sdc.gauge('what.you.gauge',100);sdc.gaugeDelta('what.you.gauge',20);// Will now count 120sdc.gaugeDelta('what.you.gauge',-70);// Will now count 50sdc.gauge('what.you.gauge',10);// Will now count 10Send unique occurences of events between flushes to the back-end:
sdc.set('your.set',200);Keep track of how fast (or slow) your stuff is:
varstart=newDate();setTimeout(function(){sdc.timing('random.timeout',start);},100*Math.random());If it is given a Date, it will calculate the difference, and anything else
will be passed straight through.
And don't let the name (or nifty interface) fool you - it can measure any kind of number, where you want to see the distribution (content lengths, list items, query sizes, ...)
There's also a helper for measuring stuff in Express.js via middleware:
varapp=express();sdc=newStatsDClient({...});app.use(sdc.helpers.getExpressMiddleware('somePrefix'));// orapp.get('/',sdc.helpers.getExpressMiddleware('otherPrefix'),function(req,res,next){req.pipe(res);});app.listen(3000);This will count responses by status-code (prefix.<statuscode>) and the
overall response-times.
It can also measure per-URL (e.g. PUT to /:user/:thing will become
PUT_user_thing by setting the timeByUrl: true in the options-object:
app.use(sdc.helpers.getExpressMiddleware('prefix',{timeByUrl: true}));As the names can become rather odd in corner-cases (esp. regexes and non-REST
interfaces), you can specify another value by setting res.locals.statsdUrlKey
at a later point.
By default, the socket is closed if it hasn't been used for a second (see
socketTimeout in the init-options), but it can also be force-closed with
.close():
varstart=newDate();setTimeout(function(){sdc.timing('random.timeout',start);// 2 - implicitly re-creates socket.sdc.close();// 3 - Closes socket after last use.},100*Math.random());sdc.close();// 1 - Closes socket early.The call is idempotent, so you can call it "just to be sure". And if you submit new metrics later, the socket will automatically be re-created, and a new timeout-timer started.
The library supports getting "child" clients with extra prefixes, to help with making sane name-spacing in apps:
// Create generic clientvarsdc=newStatsDClient({host: 'statsd.example.com',prefix: 'systemname'});sdc.increment('foo');// Increments 'systemname.foo'
... dogreatstuff ...
// Subsystem AvarsdcA=sdc.getChildClient('a');sdcA.increment('foo');// Increments 'systemname.a.foo'// Subsystem BvarsdcB=sdc.getChildClient('b');sdcB.increment('foo');// Increments 'systemname.b.foo'Internally, they all use the same socket, so calling .close() on any of them
will allow the entire program to stop gracefully.
Check the GitHub issues.
ISC - see LICENSE.
