Skip to content

Instantly share code, notes, and snippets.

@eklitzke
Created January 27, 2010 05:01
Show Gist options
  • Save eklitzke/287552 to your computer and use it in GitHub Desktop.
Save eklitzke/287552 to your computer and use it in GitHub Desktop.
/* Simplified implementation of ranger stat server using node.js. */
var sys = require('sys'),
http = require('http');
var buffer = '';
var ring = new Array();
var window = 300; // how wide is the window?
var percentile = 0.95;
var server;
// stdin worker
process.stdio.open();
process.stdio.addListener('data', function(chars){
buffer = buffer + chars;
while (true) {
var nl = buffer.indexOf('\n');
if (nl >= 0) {
var line = buffer.substring(0, nl);
buffer = buffer.substring(nl + 1);
try {
var entry = JSON.parse(line);
} catch(err) {
sys.puts('JSON parse error: ' + err);
continue;
}
if (entry.servlet == 'home') {
if (entry.status_code != 200)
continue;
var elapsed = entry.response_write_time - entry.log_begin_time;
if (!elapsed)
continue;
ring.push({'start': entry.log_begin_time, 'elapsed': elapsed});
var i = 0;
while (entry.log_begin_time - ring[i].start > window)
i++;
if (i)
ring = ring.slice(i) // memcpy :-(
}
} else
break;
}
});
process.stdio.addListener('close', function() {
sys.puts('No more data to process, shutting down HTTP server');
if (server)
server.close();
});
// http server
server = http.createServer(function(req, resp) {
var body;
if (ring.length < 20)
body = "too few requests, only have " + ring.length + ' items in buffer\n';
else {
var times = new Array();
for (i = 0; i < ring.length; i++)
times.push(ring[i].elapsed);
times.sort();
body = (times[(times.length * percentile) | 0] * 1000).toFixed(2) + ' ms with ' + ring.length + ' items in buffer\n';
}
resp.sendHeader(200, {
"Content-Length": body.length,
"Content-Type": "text/plain"
});
resp.sendBody(body);
resp.finish();
});
server.listen(8080, "localhost");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment