Skip to content

Commit b4a4342

Browse files
fix(otel): Use span.toTraceParent to set sentry-trace in propagator (#6174)
The trace flag is always set to SAMPLED, so this would not propagate the correct sentry-trace header if sentry sampling drops the transaction. Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
1 parent 7c61239 commit b4a4342

File tree

2 files changed

+20
-71
lines changed

2 files changed

+20
-71
lines changed

packages/opentelemetry-node/src/propagator.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,16 @@ export class SentryPropagator implements TextMapPropagator {
3535
return;
3636
}
3737

38-
// eslint-disable-next-line no-bitwise
39-
const samplingDecision = spanContext.traceFlags & TraceFlags.SAMPLED ? 1 : 0;
40-
const traceparent = `${spanContext.traceId}-${spanContext.spanId}-${samplingDecision}`;
41-
setter.set(carrier, SENTRY_TRACE_HEADER, traceparent);
42-
4338
const span = SENTRY_SPAN_PROCESSOR_MAP.get(spanContext.spanId);
44-
if (span && span.transaction) {
45-
const dynamicSamplingContext = span.transaction.getDynamicSamplingContext();
46-
const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);
47-
if (sentryBaggageHeader) {
48-
setter.set(carrier, SENTRY_BAGGAGE_HEADER, sentryBaggageHeader);
39+
if (span) {
40+
setter.set(carrier, SENTRY_TRACE_HEADER, span.toTraceparent());
41+
42+
if (span.transaction) {
43+
const dynamicSamplingContext = span.transaction.getDynamicSamplingContext();
44+
const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);
45+
if (sentryBaggageHeader) {
46+
setter.set(carrier, SENTRY_BAGGAGE_HEADER, sentryBaggageHeader);
47+
}
4948
}
5049
}
5150
}

packages/opentelemetry-node/test/propagator.test.ts

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -30,63 +30,7 @@ describe('SentryPropagator', () => {
3030
});
3131

3232
describe('inject', () => {
33-
describe('sentry-trace', () => {
34-
it.each([
35-
[
36-
'should set sentry-trace header when sampled',
37-
{
38-
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
39-
spanId: '6e0c63257de34c92',
40-
traceFlags: TraceFlags.SAMPLED,
41-
},
42-
'd4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-1',
43-
],
44-
[
45-
'should set sentry-trace header when not sampled',
46-
{
47-
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
48-
spanId: '6e0c63257de34c92',
49-
traceFlags: TraceFlags.NONE,
50-
},
51-
'd4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-0',
52-
],
53-
[
54-
'should NOT set sentry-trace header when traceId is empty',
55-
{
56-
traceId: '',
57-
spanId: '6e0c63257de34c92',
58-
traceFlags: TraceFlags.SAMPLED,
59-
},
60-
undefined,
61-
],
62-
[
63-
'should NOT set sentry-trace header when spanId is empty',
64-
{
65-
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
66-
spanId: '',
67-
traceFlags: TraceFlags.NONE,
68-
},
69-
undefined,
70-
],
71-
])('%s', (_name, spanContext, expected) => {
72-
const context = trace.setSpanContext(ROOT_CONTEXT, spanContext);
73-
propagator.inject(context, carrier, defaultTextMapSetter);
74-
expect(carrier[SENTRY_TRACE_HEADER]).toBe(expected);
75-
});
76-
77-
it('should NOT set sentry-trace header if instrumentation is supressed', () => {
78-
const spanContext = {
79-
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
80-
spanId: '6e0c63257de34c92',
81-
traceFlags: TraceFlags.SAMPLED,
82-
};
83-
const context = suppressTracing(trace.setSpanContext(ROOT_CONTEXT, spanContext));
84-
propagator.inject(context, carrier, defaultTextMapSetter);
85-
expect(carrier[SENTRY_TRACE_HEADER]).toBe(undefined);
86-
});
87-
});
88-
89-
describe('baggage', () => {
33+
describe('baggage and sentry-trace', () => {
9034
const client = {
9135
getOptions: () => ({
9236
environment: 'production',
@@ -123,7 +67,7 @@ describe('SentryPropagator', () => {
12367
describe.each([PerfType.Transaction, PerfType.Span])('with active %s', type => {
12468
it.each([
12569
[
126-
'should set baggage header when sampled',
70+
'should set baggage and header when sampled',
12771
{
12872
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
12973
spanId: '6e0c63257de34c92',
@@ -136,6 +80,7 @@ describe('SentryPropagator', () => {
13680
sampled: true,
13781
},
13882
'sentry-environment=production,sentry-release=1.0.0,sentry-transaction=sampled-transaction,sentry-public_key=abc,sentry-trace_id=d4cda95b652f4a1592b449d5929fda1b',
83+
'd4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-1',
13984
],
14085
[
14186
'should NOT set baggage header when not sampled',
@@ -151,6 +96,7 @@ describe('SentryPropagator', () => {
15196
sampled: false,
15297
},
15398
'sentry-environment=production,sentry-release=1.0.0,sentry-transaction=not-sampled-transaction,sentry-public_key=abc,sentry-trace_id=d4cda95b652f4a1592b449d5929fda1b',
99+
'd4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-0',
154100
],
155101
[
156102
'should NOT set baggage header when traceId is empty',
@@ -166,6 +112,7 @@ describe('SentryPropagator', () => {
166112
sampled: true,
167113
},
168114
undefined,
115+
undefined,
169116
],
170117
[
171118
'should NOT set baggage header when spanId is empty',
@@ -181,15 +128,17 @@ describe('SentryPropagator', () => {
181128
sampled: true,
182129
},
183130
undefined,
131+
undefined,
184132
],
185-
])('%s', (_name, spanContext, transactionContext, expected) => {
133+
])('%s', (_name, spanContext, transactionContext, baggage, sentryTrace) => {
186134
createTransactionAndMaybeSpan(type, transactionContext);
187135
const context = trace.setSpanContext(ROOT_CONTEXT, spanContext);
188136
propagator.inject(context, carrier, defaultTextMapSetter);
189-
expect(carrier[SENTRY_BAGGAGE_HEADER]).toBe(expected);
137+
expect(carrier[SENTRY_BAGGAGE_HEADER]).toBe(baggage);
138+
expect(carrier[SENTRY_TRACE_HEADER]).toBe(sentryTrace);
190139
});
191140

192-
it('should NOT set sentry-trace header if instrumentation is supressed', () => {
141+
it('should NOT set baggage and sentry-trace header if instrumentation is supressed', () => {
193142
const spanContext = {
194143
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
195144
spanId: '6e0c63257de34c92',
@@ -205,6 +154,7 @@ describe('SentryPropagator', () => {
205154
const context = suppressTracing(trace.setSpanContext(ROOT_CONTEXT, spanContext));
206155
propagator.inject(context, carrier, defaultTextMapSetter);
207156
expect(carrier[SENTRY_TRACE_HEADER]).toBe(undefined);
157+
expect(carrier[SENTRY_BAGGAGE_HEADER]).toBe(undefined);
208158
});
209159
});
210160
});

0 commit comments

Comments
 (0)