Skip to content

Instantly share code, notes, and snippets.

@akasfei
Last active August 29, 2015 14:16
Show Gist options
  • Save akasfei/139f0fa5b7a7338c6818 to your computer and use it in GitHub Desktop.
Save akasfei/139f0fa5b7a7338c6818 to your computer and use it in GitHub Desktop.
var fs = require('fs');
var net = require('net');
var host = 'google.com';
var port = 80;
var limit = 6 * 60;
var interval = 10000;
var iterations = 1;
var results = [];
var out;
var connect = function (callback, prev, i) {
var d = new Date();
var conn = net.connect(port, host, function () {
var now = new Date();
var latency = now.getTime() - d.getTime();
conn.end();
if (i > 1) connect(callback, latency + prev, i - 1);
else callback && callback(parseInt((latency + prev) / iterations));
});
conn.on('error', function () {
callback && callback(9999);
});
};
var summurize = function () {
console.log('============================================================');
console.log('Latency record from:\n%s\nto\n%s', results[0].date, results[results.length - 1].date);
console.log('============================================================');
console.log('Avg %d ms\tHigh %d ms\tLow %d ms', parseInt(sum/count), high, low);
if (out) {
out.end('Avg,High,Low,' + new Date() + '\n' + parseInt(sum/count) + ',' + high + ',' + low + '\n');
}
}
var count = 0;
var sum = 0;
var recent = [];
var high = -1;
var low = 99999;
if (process.argv.length > 2) {
for (var i = 2; i < process.argv.length; i++) {
switch (process.argv[i]) {
case '-l':
limit = parseInt(process.argv[i+1]);
i++;
break;
case '-i':
interval = parseInt(process.argv[i+1]);
i++;
break;
case '-I':
iterations = parseInt(process.argv[i+1]);
i++;
break;
case '-o':
out = fs.createWriteStream(process.argv[i+1]);
i++;
break;
case '-O':
out = fs.createWriteStream('latency-' + new Date().getTime() + '.csv');
break;
case '-h':
console.log('Usage: node latency-recorder [host[:port]] [-l limit] [-i interval] [-I iterations]');
process.exit();
break;
default:
var pat = /^(([0-9]+(\.[0-9]+){3})|([a-zA-Z]+(\.[a-zA-Z]+)+))(:[0-9]+)?$/;
if (pat.test(process.argv[i])) {
var target = process.argv[i].split(':');
host = target[0];
if (target.length > 1)
port = target[1];
} else {
console.log('Usage: node latency-recorder [host[:port]] [-l limit] [-i interval] [-I iterations]');
process.exit();
}
}
}
}
console.log('Recording latency data to %s:%d', host, port);
if (out) out.write(host + ':' + port + ',' + new Date() + '\n');
var intervalID = setInterval(function () {
connect(function (l) {
var d = new Date();
count++;
sum += l;
results.push({date: d, latency: l});
if (out) out.write('' + d.getTime() + ',' + l + '\n');
if (l > high) high = l;
if (l < low) low = l;
recent.push(l);
if (recent.length > 10) recent.shift();
var recentAvg = 0;
for (var i = 0; i < recent.length; i++) recentAvg += recent[i];
recentAvg = parseInt(recentAvg / recent.length);
console.log('Now %d ms\tAvg %d ms\tHigh %d ms\tLow %d ms\tRAvg %d ms', l, parseInt(sum/count), high, low, recentAvg);
if (count >= limit) {
clearInterval(intervalID);
summurize();
};
}, 0, iterations);
}, interval);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment