diff --git a/packages/opentelemetry-node/src/propagator.ts b/packages/opentelemetry-node/src/propagator.ts index f38df0d36291..c032d776047f 100644 --- a/packages/opentelemetry-node/src/propagator.ts +++ b/packages/opentelemetry-node/src/propagator.ts @@ -28,26 +28,23 @@ export class SentryPropagator extends W3CBaggagePropagator { return; } + let baggage = propagation.getBaggage(context) || propagation.createBaggage({}); + const span = SENTRY_SPAN_PROCESSOR_MAP.get(spanContext.spanId); if (span) { setter.set(carrier, SENTRY_TRACE_HEADER, span.toTraceparent()); if (span.transaction) { const dynamicSamplingContext = span.transaction.getDynamicSamplingContext(); - - const baggage = propagation.getBaggage(context) || propagation.createBaggage({}); - const baggageWithSentryInfo = Object.entries(dynamicSamplingContext).reduce( - (b, [dscKey, dscValue]) => { - if (dscValue) { - return b.setEntry(`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`, { value: dscValue }); - } - return b; - }, - baggage, - ); - super.inject(propagation.setBaggage(context, baggageWithSentryInfo), carrier, setter); + baggage = Object.entries(dynamicSamplingContext).reduce((b, [dscKey, dscValue]) => { + if (dscValue) { + return b.setEntry(`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`, { value: dscValue }); + } + return b; + }, baggage); } } + super.inject(propagation.setBaggage(context, baggage), carrier, setter); } /** diff --git a/packages/opentelemetry-node/src/spanprocessor.ts b/packages/opentelemetry-node/src/spanprocessor.ts index 8aac3e1c53be..f2ebcd6af12e 100644 --- a/packages/opentelemetry-node/src/spanprocessor.ts +++ b/packages/opentelemetry-node/src/spanprocessor.ts @@ -23,7 +23,7 @@ export const SENTRY_SPAN_PROCESSOR_MAP: Map = export class SentrySpanProcessor implements OtelSpanProcessor { public constructor() { addGlobalEventProcessor(event => { - const otelSpan = trace.getActiveSpan() as OtelSpan; + const otelSpan = trace && trace.getActiveSpan && (trace.getActiveSpan() as OtelSpan | undefined); if (!otelSpan) { return event; } diff --git a/packages/opentelemetry-node/test/propagator.test.ts b/packages/opentelemetry-node/test/propagator.test.ts index f795d7233d34..f1914653dd0d 100644 --- a/packages/opentelemetry-node/test/propagator.test.ts +++ b/packages/opentelemetry-node/test/propagator.test.ts @@ -166,6 +166,18 @@ describe('SentryPropagator', () => { ); }); + it('should create baggage without active transaction', () => { + const spanContext = { + traceId: 'd4cda95b652f4a1592b449d5929fda1b', + spanId: '6e0c63257de34c92', + traceFlags: TraceFlags.SAMPLED, + }; + const context = trace.setSpanContext(ROOT_CONTEXT, spanContext); + const baggage = propagation.createBaggage({ foo: { value: 'bar' } }); + propagator.inject(propagation.setBaggage(context, baggage), carrier, defaultTextMapSetter); + expect(carrier[SENTRY_BAGGAGE_HEADER]).toBe('foo=bar'); + }); + it('should NOT set baggage and sentry-trace header if instrumentation is supressed', () => { const spanContext = { traceId: 'd4cda95b652f4a1592b449d5929fda1b',