Skip to content

Commit 3717657

Browse files
committed
add tracestate to envelope header
1 parent 0de5a7f commit 3717657

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

packages/core/src/request.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Event, SdkInfo, SentryRequest, SentryRequestType, Session, SessionAggregates } from '@sentry/types';
2+
import { base64ToUnicode, logger } from '@sentry/utils';
23

34
import { API } from './api';
45

@@ -68,18 +69,33 @@ export function eventToSentryRequest(event: Event, api: API): SentryRequest {
6869
// serialize events inline here.
6970
if (useEnvelope) {
7071
// Extract header information from event
71-
const { transactionSampling, ...metadata } = event.debug_meta || {};
72+
const { transactionSampling, tracestate, ...metadata } = event.debug_meta || {};
7273
if (Object.keys(metadata).length === 0) {
7374
delete event.debug_meta;
7475
} else {
7576
event.debug_meta = metadata;
7677
}
7778

79+
// the tracestate is stored in bas64-encoded JSON, but envelope header values are expected to be full JS values,
80+
// so we have to decode and reinflate it
81+
let reinflatedTracestate;
82+
try {
83+
// Because transaction metadata passes through a number of locations (transactionContext, transaction, event during
84+
// processing, event as sent), each with different requirements, all of the parts are typed as optional. That said,
85+
// if we get to this point and either `tracestate` or `tracestate.sentry` are undefined, something's gone very wrong.
86+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
87+
const encodedSentryValue = tracestate!.sentry!.replace('sentry=', '');
88+
reinflatedTracestate = JSON.parse(base64ToUnicode(encodedSentryValue));
89+
} catch (err) {
90+
logger.warn(err);
91+
}
92+
7893
const envelopeHeaders = JSON.stringify({
7994
event_id: event.event_id,
8095
sent_at: new Date().toISOString(),
8196
...(sdkInfo && { sdk: sdkInfo }),
8297
...(api.forceEnvelope() && { dsn: api.getDsn().toString() }),
98+
...(reinflatedTracestate && { trace: reinflatedTracestate }), // trace context for dynamic sampling on relay
8399
});
84100

85101
const itemHeaderEntries: { [key: string]: unknown } = {

0 commit comments

Comments
 (0)