summaryrefslogtreecommitdiff
path: root/lib/_http_server.js
diff options
context:
space:
mode:
authorvmarchaud <contact@vmarchaud.fr>2019-06-30 22:37:18 +0200
committerAnna Henningsen <anna@addaleax.net>2019-07-12 00:36:27 +0200
commit0ebf01dc53b474ffca78c7ace023bb10341b6664 (patch)
tree47aa24677e1903e7a2d5f694b19ea12f59ad7d43 /lib/_http_server.js
parentca0884a60b2fc828b6ca35e9b46e6979d9024146 (diff)
downloadandroid-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.js20
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);
};