Skip to content

Commit d0d3d67

Browse files
committed
http: add diagnostics channel for http client
1 parent 42ad967 commit d0d3d67

File tree

4 files changed

+175
-1
lines changed

4 files changed

+175
-1
lines changed

doc/api/diagnostics_channel.md

+102
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,108 @@ channel.subscribe(onMessage);
307307
channel.unsubscribe(onMessage);
308308
```
309309

310+
## Example
311+
312+
```mjs
313+
import http from 'node:http';
314+
import dc from 'node:diagnostics_channel';
315+
316+
const onClientRequestStart = dc.channel('http.client.request.start');
317+
const onClientResponseFinish = dc.channel('http.client.response.finish');
318+
const onServerRequestStart = dc.channel('http.server.request.start');
319+
const onServerResponseFinish = dc.channel('http.server.response.finish');
320+
321+
onClientRequestStart.subscribe(({ request }) => {
322+
323+
});
324+
325+
onClientResponseFinish.subscribe(({ request, response }) => {
326+
327+
});
328+
329+
onServerRequestStart.subscribe(({
330+
request,
331+
response,
332+
socket,
333+
server,
334+
}) => {
335+
336+
});
337+
338+
onServerResponseFinish.subscribe(({
339+
request,
340+
response,
341+
socket,
342+
server,
343+
}) => {
344+
345+
});
346+
347+
const server = http.createServer((req, res) => {
348+
res.end('done');
349+
});
350+
351+
server.listen(() => {
352+
const { port } = server.address();
353+
http.get(`http://localhost:${port}`, (res) => {
354+
res.resume();
355+
res.on('end', () => {
356+
server.close();
357+
});
358+
});
359+
});
360+
```
361+
362+
```cjs
363+
const http = require('http');
364+
const dc = require('diagnostics_channel');
365+
366+
const onClientRequestStart = dc.channel('http.client.request.start');
367+
const onClientResponseFinish = dc.channel('http.client.response.finish');
368+
const onServerRequestStart = dc.channel('http.server.request.start');
369+
const onServerResponseFinish = dc.channel('http.server.response.finish');
370+
371+
onClientRequestStart.subscribe(({ request }) => {
372+
373+
});
374+
375+
onClientResponseFinish.subscribe(({ request, response }) => {
376+
377+
});
378+
379+
onServerRequestStart.subscribe(({
380+
request,
381+
response,
382+
socket,
383+
server,
384+
}) => {
385+
386+
});
387+
388+
onServerResponseFinish.subscribe(({
389+
request,
390+
response,
391+
socket,
392+
server,
393+
}) => {
394+
395+
});
396+
397+
const server = http.createServer((req, res) => {
398+
res.end('done');
399+
});
400+
401+
server.listen(() => {
402+
const { port } = server.address();
403+
http.get(`http://localhost:${port}`, (res) => {
404+
res.resume();
405+
res.on('end', () => {
406+
server.close();
407+
});
408+
});
409+
});
410+
```
411+
310412
[`'uncaughtException'`]: process.md#event-uncaughtexception
311413
[`channel.subscribe(onMessage)`]: #channelsubscribeonmessage
312414
[`diagnostics_channel.channel(name)`]: #diagnostics_channelchannelname

lib/_http_client.js

+15
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ const {
9090

9191
const kClientRequestStatistics = Symbol('ClientRequestStatistics');
9292

93+
const dc = require('diagnostics_channel');
94+
const onClientRequestStartChannel = dc.channel('http.client.request.start');
95+
const onClientResponseFinishChannel = dc.channel('http.client.response.finish');
96+
9397
const { addAbortSignal, finished } = require('stream');
9498

9599
let debug = require('internal/util/debuglog').debuglog('http', (fn) => {
@@ -367,6 +371,11 @@ ClientRequest.prototype._finish = function _finish() {
367371
},
368372
});
369373
}
374+
if (onClientRequestStartChannel.hasSubscribers) {
375+
onClientRequestStartChannel.publish({
376+
request: this,
377+
});
378+
}
370379
};
371380

372381
ClientRequest.prototype._implicitHeader = function _implicitHeader() {
@@ -645,6 +654,12 @@ function parserOnIncomingClient(res, shouldKeepAlive) {
645654
},
646655
});
647656
}
657+
if (onClientResponseFinishChannel.hasSubscribers) {
658+
onClientResponseFinishChannel.publish({
659+
request: req,
660+
response: res,
661+
});
662+
}
648663
req.res = res;
649664
res.req = req;
650665

lib/http.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ module.exports = {
123123
validateHeaderName,
124124
validateHeaderValue,
125125
get,
126-
request
126+
request,
127127
};
128128

129129
ObjectDefineProperty(module.exports, 'maxHeaderSize', {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
const dc = require('diagnostics_channel');
6+
7+
const onClientRequestStart = dc.channel('http.client.request.start');
8+
const onClientResponseFinish = dc.channel('http.client.response.finish');
9+
const onServerRequestStart = dc.channel('http.server.request.start');
10+
const onServerResponseFinish = dc.channel('http.server.response.finish');
11+
12+
onClientRequestStart.subscribe(common.mustCall(({ request }) => {
13+
assert.strictEqual(typeof request, 'object');
14+
}));
15+
16+
onClientResponseFinish.subscribe(common.mustCall(({ request, response }) => {
17+
assert.strictEqual(typeof request, 'object');
18+
assert.strictEqual(typeof response, 'object');
19+
}));
20+
21+
onServerRequestStart.subscribe(common.mustCall(({
22+
request,
23+
response,
24+
socket,
25+
server,
26+
}) => {
27+
assert.strictEqual(typeof request, 'object');
28+
assert.strictEqual(typeof response, 'object');
29+
assert.strictEqual(typeof socket, 'object');
30+
assert.strictEqual(typeof server, 'object');
31+
}));
32+
33+
onServerResponseFinish.subscribe(common.mustCall(({
34+
request,
35+
response,
36+
socket,
37+
server,
38+
}) => {
39+
assert.strictEqual(typeof request, 'object');
40+
assert.strictEqual(typeof response, 'object');
41+
assert.strictEqual(typeof socket, 'object');
42+
assert.strictEqual(typeof server, 'object');
43+
}));
44+
45+
const server = http.createServer(common.mustCall((req, res) => {
46+
res.end('done');
47+
}));
48+
49+
server.listen(() => {
50+
const { port } = server.address();
51+
http.get(`http://localhost:${port}`, (res) => {
52+
res.resume();
53+
res.on('end', () => {
54+
server.close();
55+
});
56+
});
57+
});

0 commit comments

Comments
 (0)