|
16 | 16 | import {
|
17 | 17 | SpanStatusCode,
|
18 | 18 | context,
|
| 19 | + diag, |
19 | 20 | propagation,
|
20 | 21 | Span as ISpan,
|
21 | 22 | SpanKind,
|
22 | 23 | trace,
|
23 | 24 | SpanAttributes,
|
| 25 | + DiagConsoleLogger, |
24 | 26 | } from '@opentelemetry/api';
|
25 | 27 | import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
26 | 28 | import {
|
@@ -269,6 +271,14 @@ describe('HttpInstrumentation', () => {
|
269 | 271 | // hang the request.
|
270 | 272 | return;
|
271 | 273 | }
|
| 274 | + if (request.url?.includes('/destroy-request')) { |
| 275 | + // force flush http response header to trigger client response callback |
| 276 | + response.write(''); |
| 277 | + setTimeout(() => { |
| 278 | + request.socket.destroy(); |
| 279 | + }, 100); |
| 280 | + return; |
| 281 | + } |
272 | 282 | if (request.url?.includes('/ignored')) {
|
273 | 283 | provider.getTracer('test').startSpan('some-span').end();
|
274 | 284 | }
|
@@ -920,6 +930,37 @@ describe('HttpInstrumentation', () => {
|
920 | 930 | assert.strictEqual(clientSpan.status.code, SpanStatusCode.ERROR);
|
921 | 931 | assert.ok(Object.keys(clientSpan.attributes).length >= 6);
|
922 | 932 | });
|
| 933 | + |
| 934 | + it('should not end span multiple times if request socket destroyed before response completes', async () => { |
| 935 | + const warnMessages: string[] = []; |
| 936 | + diag.setLogger({ |
| 937 | + ...new DiagConsoleLogger(), |
| 938 | + warn: message => { |
| 939 | + warnMessages.push(message); |
| 940 | + }, |
| 941 | + }); |
| 942 | + const promise = new Promise<void>(resolve => { |
| 943 | + const req = http.get( |
| 944 | + `${protocol}://${hostname}:${serverPort}/destroy-request`, |
| 945 | + res => { |
| 946 | + res.on('end', () => {}); |
| 947 | + res.on('close', () => {}); |
| 948 | + res.on('error', () => { |
| 949 | + resolve(); |
| 950 | + }); |
| 951 | + } |
| 952 | + ); |
| 953 | + // force flush http request header to trigger client response callback |
| 954 | + req.write(''); |
| 955 | + req.on('error', () => {}); |
| 956 | + }); |
| 957 | + |
| 958 | + await promise; |
| 959 | + |
| 960 | + diag.disable(); |
| 961 | + |
| 962 | + assert.strictEqual(warnMessages, []); |
| 963 | + }); |
923 | 964 | });
|
924 | 965 |
|
925 | 966 | describe('with require parent span', () => {
|
|
0 commit comments