Created
January 27, 2010 05:01
-
-
Save eklitzke/287552 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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