diff --git a/plugins/node/instrumentation-undici/src/undici.ts b/plugins/node/instrumentation-undici/src/undici.ts index aa89c4f4ea..924b1bc013 100644 --- a/plugins/node/instrumentation-undici/src/undici.ts +++ b/plugins/node/instrumentation-undici/src/undici.ts @@ -239,7 +239,10 @@ export class UndiciInstrumentation extends InstrumentationBase { const currentSpan = trace.getSpan(activeCtx); let span: Span; - if (config.requireParentforSpans && !currentSpan) { + if ( + config.requireParentforSpans && + (!currentSpan || !trace.isSpanContextValid(currentSpan.spanContext())) + ) { span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT); } else { span = this.tracer.startSpan( diff --git a/plugins/node/instrumentation-undici/test/undici.test.ts b/plugins/node/instrumentation-undici/test/undici.test.ts index c125b2e189..89183dfde6 100644 --- a/plugins/node/instrumentation-undici/test/undici.test.ts +++ b/plugins/node/instrumentation-undici/test/undici.test.ts @@ -17,6 +17,7 @@ import * as assert from 'assert'; import { Writable } from 'stream'; import { + INVALID_SPAN_CONTEXT, SpanKind, SpanStatusCode, context, @@ -626,6 +627,30 @@ describe('UndiciInstrumentation `undici` tests', function () { assert.strictEqual(spans.length, 0, 'no spans are created'); }); + it('should not create spans with INVALID_SPAN_CONTEXT parent if required in configuration', async function () { + let spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 0); + + instrumentation.setConfig({ + enabled: true, + requireParentforSpans: true, + }); + + const root = trace.wrapSpanContext(INVALID_SPAN_CONTEXT); + await context.with(trace.setSpan(context.active(), root), async () => { + const requestUrl = `${protocol}://${hostname}:${mockServer.port}/?query=test`; + const response = await undici.request(requestUrl); + await consumeResponseBody(response.body); + assert.ok( + response.headers['propagation-error'] == null, + 'propagation is set for instrumented requests' + ); + }); + + spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 0, 'no spans are created'); + }); + it('should create spans with parent if required in configuration', function (done) { let spans = memoryExporter.getFinishedSpans(); assert.strictEqual(spans.length, 0);