Skip to content

Commit befc0ce

Browse files
committed
properly generate traceParent
1 parent 2e60318 commit befc0ce

File tree

3 files changed

+32
-19
lines changed

3 files changed

+32
-19
lines changed

packages/core/src/utils/spanUtils.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type { SpanStatus } from '../types-hoist/spanStatus';
1717
import { addNonEnumerableProperty } from '../utils/object';
1818
import { generateSpanId } from '../utils/propagationContext';
1919
import { timestampInSeconds } from '../utils/time';
20-
import { generateSentryTraceHeader } from '../utils/tracing';
20+
import { generateSentryTraceHeader, generateTraceparentHeader } from '../utils/tracing';
2121
import { consoleSandbox } from './debug-logger';
2222
import { _getSpanForScope } from './spanOnScope';
2323

@@ -77,6 +77,15 @@ export function spanToTraceHeader(span: Span): string {
7777
return generateSentryTraceHeader(traceId, spanId, sampled);
7878
}
7979

80+
/**
81+
* Convert a Span to a W3C traceparent header.
82+
*/
83+
export function spanToTraceparentHeader(span: Span): string {
84+
const { traceId, spanId } = span.spanContext();
85+
const sampled = spanIsSampled(span);
86+
return generateTraceparentHeader(traceId, spanId, sampled);
87+
}
88+
8089
/**
8190
* Converts the span links array to a flattened version to be sent within an envelope.
8291
*

packages/core/src/utils/traceData.ts

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ import type { Span } from '../types-hoist/span';
99
import type { SerializedTraceData } from '../types-hoist/tracing';
1010
import { dynamicSamplingContextToSentryBaggageHeader } from './baggage';
1111
import { debug } from './debug-logger';
12-
import { getActiveSpan, spanToTraceHeader } from './spanUtils';
13-
import { extractTraceparentData, generateSentryTraceHeader, TRACEPARENT_REGEXP } from './tracing';
12+
import { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils';
13+
import {
14+
extractTraceparentData,
15+
generateSentryTraceHeader,
16+
generateTraceparentHeader,
17+
TRACEPARENT_REGEXP,
18+
} from './tracing';
1419

1520
/**
1621
* Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation
@@ -58,7 +63,7 @@ export function getTraceData(
5863
};
5964

6065
if (options.propagateTraceparent) {
61-
traceData.traceparent = _sentryTraceToTraceParentHeader(sentryTrace);
66+
traceData.traceparent = span ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);
6267
}
6368

6469
return traceData;
@@ -72,19 +77,7 @@ function scopeToTraceHeader(scope: Scope): string {
7277
return generateSentryTraceHeader(traceId, propagationSpanId, sampled);
7378
}
7479

75-
/**
76-
* Builds a W3C traceparent header from the given sentry-trace header.
77-
*
78-
* Why parse that header and not create traceparent from primitives?
79-
* We want these two headers to always have the same ids. The easiest way to do this is to take
80-
* one of them as the source of truth (sentry-trace) and derive the other from it.
81-
*
82-
* Most importantly, this guarantees parentSpanId consistency between sentry-trace and traceparent
83-
* in tracing without performance (TwP) mode, where we always generate a random parentSpanId.
84-
*
85-
* Exported for testing
86-
*/
87-
export function _sentryTraceToTraceParentHeader(sentryTrace: string): string {
88-
const { traceId, parentSpanId, parentSampled } = extractTraceparentData(sentryTrace) || {};
89-
return `00-${traceId}-${parentSpanId}-${parentSampled ? '01' : '00'}`;
80+
function scopeToTraceparentHeader(scope: Scope): string {
81+
const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();
82+
return generateTraceparentHeader(traceId, propagationSpanId, sampled);
9083
}

packages/core/src/utils/tracing.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,17 @@ export function generateSentryTraceHeader(
102102
return `${traceId}-${spanId}${sampledString}`;
103103
}
104104

105+
/**
106+
* Creates a W3C traceparent header from the given trace and span ids.
107+
*/
108+
export function generateTraceparentHeader(
109+
traceId: string | undefined = generateTraceId(),
110+
spanId: string | undefined = generateSpanId(),
111+
sampled?: boolean,
112+
): string {
113+
return `00-${traceId}-${spanId}-${sampled ? '01' : '00'}`;
114+
}
115+
105116
/**
106117
* Given any combination of an incoming trace, generate a sample rand based on its defined semantics.
107118
*

0 commit comments

Comments
 (0)