ほんじゃらねっと

ダイエット中プログラマのブログ

Node.jsでWebページのレスポンス時間をチェックする

個人的にNode.jsを習得しようと色々調べてた時に

仕事でWebアプリの速度改善の依頼が飛び込んできたので、

Node.jsでHTTPリクエストのレスポンス時間をチェックしたい時は

どう書くのかな、と調べてみた。

HTTPリクエスト自体は下記の「request」モジュールを使うのが一般的のようだ。

request

色々探してみると、Stackoverflowでまさに同じ質問がされていて、

回答で良さげな関数「timeReq」が紹介されていた:

stackoverflow.com

request関数をラップして、リクエスト前後の時間の差を取得して

返り値に追加してくれる。

var request = require('request');

var timeReq = function (url, next) {
    var start = new Date();
    request(url, function (err, res, body) {
        if (err) {
            console.log(err);
        }   
        res.responseTime = new Date() - start;
        next(err, res, body);
    }); 
};

この関数を利用して、指定されたWebページに指定回数アクセスして

各リクエストのレスポンスタイムと平均値を表示するスクリプトを作成してみた。

check_response.js

var request = require('request');
var _ = require('underscore');
var async = require('async');

var testUrl = '<チェックしたいURL>';
var checkTimes = <チェックする回数>; 

var timeReq = function (url, next) {
    var start = new Date();
    request(url, function (err, res, body) {
        if (err) {
            console.log(err);
        }   
        res.responseTime = new Date() - start;
        next(err, res, body);
    }); 
};

async.times(checkTimes, function (n, next) {
    timeReq(testUrl, function (err, res, body) {
        console.log('No.' + (n + 1) + ' responseTime: ' + res.responseTime);
        next(null, res.responseTime);
    });
}, function (err, responseTimes) {
    var sum = _.reduce(responseTimes, function (memo, num) { return memo + num; }, 0); 
    var avgResTime = sum / checkTimes;
    console.log('Average: ' + avgResTime);
});

このスクリプトの実用性はともかく、

既存の関数をラップして機能を拡張する例として参考になった。

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシステムパフォーマンスの仕組み