2014-01-23 5 views
3

я хочу, чтобы вычислить ответ время для каждого прокси-запроса, сделанного узел-HTTP-прокси, как это:Как получить время отклика каждого прокси-запроса, выполняемого node-http-proxy?

var httpProxy = require('http-proxy'); 
var proxy = httpProxy.createProxyServer(); 

require('http').createServer(function(req, res) { 
    // start-time for one request 
    proxy.web(req, res, { target: 'localhost:80' }); 
}).listen(3000); 

proxy.on('proxyRes', function (res) { 
    // end-time for one request to calculate the time 
    console.log('RAW Response from the target', JSON.stringify(res.headers, true, 2)); 
}); 

, поэтому я хочу, чтобы получить временную разницу между начальным временем и лор время. я могу поймать событие proxyRes, но как совместить прокси-ответ с правильным запросом клиента?

обновление: я попытался следующие:

var httpProxy = require('http-proxy'); 
var http = require('http'); 

var proxy = new httpProxy.createProxyServer({ 
    target: { 
     host: 'localhost', 
     port: 80 
    } 
}); 

var start_time = 0; 
var proxyServer = http.createServer(function (req, res) { 


    start_time = new Date().getTime(); 

    proxy.web(req, res); 

    res.on('finish', function() { 
     console.log("The request was proxied in " + (new Date().getTime() - start_time) + "ms"); 
    }); 
}); 

proxyServer.listen(3000); 

// Proxy-Target server 
var n = 0; sleep = 0; 
http.createServer(function (req, res) { 

    n++; 

    var start_time = new Date().getTime(); 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    if (n % 2 == 0){ 
     sleep = 2000; 
    } else { 
     sleep = 5000; 
    } 

    setTimeout(function(){ 
     res.end("..."); 
    }, sleep); 

    res.on('finish', function(d) { 
     var diff_time = new Date().getTime() - start_time; 
     console.log("The request was processed in " + (new Date().getTime() - start_time) + "ms"); 
    }); 

}).listen(80); 

так, время-мишени сервера измеряется правильно, вызывает один запрос может длиться либо 2 Одера 5 секунд, но меры прокси иногда отклика раза всего лишь несколько миллисекунд. Я попробовал его с помощью Apache-скамья, как: ab -n 10 -c 3 http://localhost:3000/ и результат консоли:

The request was processed in 2007ms 
The request was proxied in 2017ms 
The request was processed in 2003ms 
The request was proxied in 2006ms 
The request was processed in 5002ms 
The request was processed in 5001ms 
The request was proxied in 980ms 
The request was proxied in 981ms 
The request was processed in 2002ms 
The request was proxied in 2006ms 
The request was processed in 2002ms 
The request was proxied in 2005ms 
The request was processed in 5000ms 
The request was proxied in 8ms 
The request was processed in 5000ms 
The request was proxied in 982ms 
The request was processed in 2001ms 
The request was proxied in 2005ms 
The request was processed in 5002ms 
The request was proxied in 4998ms 
+0

не могли бы вы просто использовать 'новый Date() GetTime()' и регистрировать разницу? – brandonscript

+0

Я так не думаю, потому что прокси работает асинхронно, поэтому мне нужно сопоставить запрос прокси-сервера на связанный с ним ответ. и поэтому я должен каким-то образом идентифицировать один запрос. – chris

+0

Скрипт выполняется асинхронно, но прокси не похож на него. Вы должны быть в состоянии поставить оба в обратном вызове (после получения ответа) и измерить его таким образом. – brandonscript

ответ

3

теперь он работает, получил ключ намек на nodejs Google-gloup, то совладать из start_time не был установлен локально, так вот рабочий код:.

var httpProxy = require('http-proxy'); 
var http = require('http'); 

var proxy = new httpProxy.createProxyServer({}); 

// before: var start_time = 0; 
var proxyServer = http.createServer(function (req, res) { 

    // now 
    var start_time = new Date().getTime(); 

    proxy.web(req, res, { target: 'http://localhost:80' }); 

    res.on('finish', function() { 
     console.log("The request was proxied in " + (new Date().getTime() - start_time) + "ms"); 
    }); 
}); 
proxyServer.listen(3000); 
1

(непроверенной, но давайте посмотрим, если это работает)

var httpProxy = require('http-proxy'); 
var proxy = httpProxy.createProxyServer(); 
var startTime = 0; 
var endTime = 0; 

require('http').createServer(function(req, res) { 
    // start-time for one request 
    startTime = new Date().getTime(); 
    proxy.web(req, res, { 
     target: 'localhost:80' 
    }); 
}).listen(3000); 

proxy.on('proxyRes', function (res) { 
    // end-time for one request to calculate the time 
    endTime = new Date().getTime(); 
    console.log(endTime - startTime); 
    console.log('RAW Response from the target', JSON.stringify(res.headers, true, 2)); 
}); 
+0

спасибо, но с этим кодом каждое новое клиентское соединение приводит к установке 'startTime' в текущее время. поэтому, когда один ранний запрос длится дольше, чем более поздний, startTime для первого запроса больше не подходит. Я попробовал это, добавив 'console.out (« startTime »);' before 'proxy.web()' и 'console.out (" endTime ");' inside 'proxy.on (...);' output -order должен был быть одним и тем же в любое время, но это не так, поэтому прокси работает async. – chris