2013-08-30 2 views
15

Что было бы лучшим способом отправить все запросы, поступающие в мое приложение-узел? В принципе, я хочу получить текущую временную метку в самом начале запроса, а затем снова в самом конце запроса, получить разницу и занести в журнал. Рекомендации относительно наилучшего способа сделать это в NodeJS и Express?Запросы времени в NodeJS/Express

Вот пример того, как выглядит мое приложение (хотя это намного сложнее, чем это).

var express = require('express'), 
    http = require('http'), 
    app = express(); 

app.get('/', function (req, res, next) { 
    res.send(200, 'hi'); 
}); 

app.get('/about', function(req, res, next) { 
    res.send(200, 'something else'); 
}); 

var server = http.createServer(app); 
server.listen(9000); 
console.log("Express server listening..."); 

Я хочу время ВСЕ запросы. Поэтому я хочу время / и /about и любую другую конечную точку, которую я мог бы добавить.

ответ

42

Это может сделать трюк: http://www.senchalabs.org/connect/responseTime.html

app.use(express.responseTime()); 

Или сделать что-то вроде этого:

app.use(function(req, res, next) { req.start = Date.now(); next(); }); 

app.get(...); 
app.get(...); 

app.use(function(req, res) { var time = Date.now() - req.start; }); 

Для этого необходимо, чтобы все ваши маршруты вызывали next().

Или, возможно, это (то же самое, как ResponseTime промежуточного слоя, но не устанавливает заголовок):

app.use(function(req, res, next) { 
    var start = Date.now(); 
    res.on('header', function() { 
     var duration = Date.now() - start; 
     // log duration 
    }); 
    next(); 
}); 

Вместо того чтобы слушать для 'header' события на res, который выстреливает, как только заголовки отправляются, вы можете слушать для события 'finish', в зависимости от того, что вы хотите измерить.

+1

Спасибо. Именно то, что я искал. – tbeauvais

+1

Это единственный ответ, который, похоже, понял основы промежуточного программного обеспечения в экспресс. +1 –

+0

Это прекрасно. Я связал его с Rollbar, чтобы сообщить о медленных маршрутах. – developius

0

Просто получите текущее время в миллисекундах (например, через new Date()), когда вы сначала получите дескриптор запроса, а затем время, когда вы закончите отклик, и получите разницу как прошедшее время в миллисекундах.

http.createServer(function(req, res) { 
    res.timeStart = new Date(); 
    // ... 
    res.end(...); 
    var timeStop = new Date(); 
    console.log('Elapsed ' + (timeStop-req.timeStart) + 'ms'); 
}); 

Обратите внимание, что вы можете вычитать даты, поскольку Date#valueOf() возвращает свое время в миллисекундах.

+0

Wouldn Это только работает, если у меня только один обработчик? У меня есть десятки обработчиков и конечных точек. – tbeauvais

+0

@tbeauvais: вы можете прикрепить «timeStart» к самому отклику, см. Мой обновленный ответ. – maerics

+0

Я обновил свой вопрос с примерами того, как выглядит мое приложение. Может быть, мне что-то не хватает, но я до сих пор не вижу, как это будет работать для нескольких конечных точек (кроме того, что я добавляю этот бит кода для каждого обработчика, которого я пытаюсь избежать). – tbeauvais

9

Вы можете использовать встроенный в console.time и console.timeEnd функции для этого:

console.time('handler name'); 
... handle the request 
console.timeEnd('handler name'); 

Вывод на консоль:

handler name: 62ms 
+1

Прохладный, это обертывание как промежуточное промежуточное звено для всех маршрутов? – 7zark7

+0

Как это можно применить к узлу/экспресс-приложению? Где это делается, чтобы обернуть все запросы? – tbeauvais

+0

Его вообще нельзя применять, нет. – JohnnyHK

2

Или если вы хотите увеличить разрешение по времени, вы можете использовать process.hrtime() или использовать модуль, который я построил, который использует hrtime, но дает вам дополнительную информацию, такую ​​как среднее, среднее, общее время и т. Д. Модуль называется exectimer. Это пример:

var t = require("exectimer"); 

app.use(function(req, res, next) { 
    var tick = new t.Tick("responseTime"); 
    tick.start(); 
    res.on('header', function() { 
    tick.stop(); 
    }); 
    next(); 
}); 

// when ready check the results with this: 
var responseTime = t.timers.responseTime; 
console.log(responseTime.min()); // minimal response time 
console.log(responseTime.max()); // minimal response time 
console.log(responseTime.mean()); // mean response time 
console.log(responseTime.median()); // median response time 

Это является очень точным и имеет разрешение наносекунд и без каких-либо дополнительных зависимостей.

0

Я полагаю, что промежуточное ПО для времени ответа для выражения, это тот, который упоминается Тревором Диксоном по первому ответу. Теперь он позволяет вам установить обратный вызов, чтобы получить время отклика, в случае, если вам не нужно указывать заголовок X-Response-Time на ваш ответ.https://github.com/expressjs/response-time#responsetimefn

+0

При дополнении ответа вы можете просто прокомментировать это, а не создавать новый ответ –

0

вы можете добавить в свой промежуточного модуля morgan и использовать его как this-

const morgan = require('morgan') 
... 
... 
const app = express() 
app.use(morgan('dev')) 

Затем журналы будут выглядеть следующим образом:

// :method :url :status :response-time ms - :res[content-length] 
GET /myroute 200 339.051 ms - 242 

Проверить morgan :)

Смежные вопросы