express-statsd
Version:
Statsd route monitoring middleware for connect/express
52 lines (40 loc) • 1.37 kB
JavaScript
var assert = require('assert');
var extend = require('obj-extend');
var Lynx = require('lynx');
module.exports = function expressStatsdInit (options) {
options = extend({
requestKey: 'statsdKey',
host: '127.0.0.1',
port: 8125
}, options);
assert(options.requestKey, 'express-statsd expects a requestKey');
var client = options.client || new Lynx(options.host, options.port, options);
return function expressStatsd (req, res, next) {
var startTime = new Date().getTime();
// Function called on response finish that sends stats to statsd
function sendStats() {
var key = req[options.requestKey];
key = key ? key + '.' : '';
// Status Code
var statusCode = res.statusCode || 'unknown_status';
client.increment(key + 'status_code.' + statusCode);
// Response Time
var duration = new Date().getTime() - startTime;
client.timing(key + 'response_time', duration);
cleanup();
}
// Function to clean up the listeners we've added
function cleanup() {
res.removeListener('finish', sendStats);
res.removeListener('error', cleanup);
res.removeListener('close', cleanup);
}
// Add response listeners
res.once('finish', sendStats);
res.once('error', cleanup);
res.once('close', cleanup);
if (next) {
next();
}
};
};