diff options
author | vmarchaud <contact@vmarchaud.fr> | 2019-06-30 22:37:18 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-07-12 00:36:27 +0200 |
commit | 0ebf01dc53b474ffca78c7ace023bb10341b6664 (patch) | |
tree | 47aa24677e1903e7a2d5f694b19ea12f59ad7d43 /lib/_http_server.js | |
parent | ca0884a60b2fc828b6ca35e9b46e6979d9024146 (diff) | |
download | android-node-v8-0ebf01dc53b474ffca78c7ace023bb10341b6664.tar.gz android-node-v8-0ebf01dc53b474ffca78c7ace023bb10341b6664.tar.bz2 android-node-v8-0ebf01dc53b474ffca78c7ace023bb10341b6664.zip |
perf_hooks: add HttpRequest statistics monitoring #28445
```js
const { PerformanceObserver, performance } = require('perf_hooks');
const http = require('http');
const obs = new PerformanceObserver((items) => {
const entry = items.getEntries()[0];
console.log(entry.name, entry.duration);
});
obs.observe({ entryTypes: ['http'] });
const server = http.Server(function(req, res) {
server.close();
res.writeHead(200);
res.end('hello world\n');
});
server.listen(0, function() {
const req = http.request({
port: this.address().port,
path: '/',
method: 'POST'
}).end();
});
```
PR-URL: https://github.com/nodejs/node/pull/28486
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'lib/_http_server.js')
-rw-r--r-- | lib/_http_server.js | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/_http_server.js b/lib/_http_server.js index 941d571a67..6a262eedc2 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -39,7 +39,12 @@ const { prepareError, } = require('_http_common'); const { OutgoingMessage } = require('_http_outgoing'); -const { outHeadersKey, ondrain, nowDate } = require('internal/http'); +const { + outHeadersKey, + ondrain, + nowDate, + emitStatistics +} = require('internal/http'); const { defaultTriggerAsyncIdScope, getOrSetAsyncId @@ -56,8 +61,11 @@ const { DTRACE_HTTP_SERVER_REQUEST, DTRACE_HTTP_SERVER_RESPONSE } = require('internal/dtrace'); +const { observerCounts, constants } = internalBinding('performance'); +const { NODE_PERFORMANCE_ENTRY_TYPE_HTTP } = constants; const kServerResponse = Symbol('ServerResponse'); +const kServerResponseStatistics = Symbol('ServerResponseStatistics'); const STATUS_CODES = { 100: 'Continue', @@ -147,12 +155,22 @@ function ServerResponse(req) { this.useChunkedEncodingByDefault = chunkExpression.test(req.headers.te); this.shouldKeepAlive = false; } + + const httpObserverCount = observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_HTTP]; + if (httpObserverCount > 0) { + this[kServerResponseStatistics] = { + startTime: process.hrtime() + }; + } } Object.setPrototypeOf(ServerResponse.prototype, OutgoingMessage.prototype); Object.setPrototypeOf(ServerResponse, OutgoingMessage); ServerResponse.prototype._finish = function _finish() { DTRACE_HTTP_SERVER_RESPONSE(this.connection); + if (this[kServerResponseStatistics] !== undefined) { + emitStatistics(this[kServerResponseStatistics]); + } OutgoingMessage.prototype._finish.call(this); }; |