Skip to content

Commit 30c98f8

Browse files
committed
use encoded value for tracestate in envelope header
1 parent cfd046f commit 30c98f8

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

packages/core/src/request.ts

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

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

@@ -66,26 +67,28 @@ export function eventToSentryRequest(event: Event, api: API): SentryRequest {
6667
export function transactionToSentryRequest(event: Event, api: API): SentryRequest {
6768
const sdkInfo = getSdkMetadataForEnvelopeHeader(api);
6869

69-
const { transactionSampling, ...metadata } = event.debug_meta || {};
70+
const { transactionSampling, tracestate: encodedTracestate, ...metadata } = event.debug_meta || {};
7071
const { method: samplingMethod, rate: sampleRate } = transactionSampling || {};
7172
if (Object.keys(metadata).length === 0) {
7273
delete event.debug_meta;
7374
} else {
7475
event.debug_meta = metadata;
7576
}
7677

78+
// the tracestate is stored in bas64-encoded JSON, but envelope header values are expected to be full JS values,
79+
// so we have to decode and reinflate it
80+
let tracestate;
81+
try {
82+
tracestate = JSON.parse(base64ToUnicode(encodedTracestate as string));
83+
} catch (err) {
84+
logger.warn(err);
85+
}
86+
7787
const envelopeHeaders = JSON.stringify({
7888
event_id: event.event_id,
7989
sent_at: new Date().toISOString(),
8090
...(sdkInfo && { sdk: sdkInfo }),
81-
82-
// trace context for dynamic sampling on relay
83-
trace: {
84-
trace_id: event.contexts?.trace?.trace_id,
85-
public_key: api.getDsn().publicKey,
86-
environment: event.environment || null,
87-
release: event.release || null,
88-
},
91+
...(tracestate && { trace: tracestate }), // trace context for dynamic sampling on relay
8992
});
9093

9194
const itemHeaders = JSON.stringify({

packages/core/test/lib/request.test.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,20 @@ describe('eventToSentryRequest', () => {
5858
beforeEach(() => {
5959
transactionEvent = {
6060
...eventBase,
61-
debug_meta: { transactionSampling: { method: TransactionSamplingMethod.Rate, rate: 0.1121 } },
61+
debug_meta: {
62+
transactionSampling: { method: TransactionSamplingMethod.Rate, rate: 0.1121 },
63+
// This value is hardcoded in its base64 form to avoid a dependency on @sentry/tracing, where the method to
64+
// compute the value lives. It's equivalent to
65+
// computeTracestateValue({
66+
// trace_id: '1231201211212012',
67+
// environment: 'dogpark',
68+
// release: 'off.leash.park',
69+
// public_key: 'dogsarebadatkeepingsecrets',
70+
// }),
71+
tracestate:
72+
'eyJ0cmFjZV9pZCI6IjEyMzEyMDEyMTEyMTIwMTIiLCJlbnZpcm9ubWVudCI6ImRvZ3BhcmsiLCJyZWxlYXNlIjoib2ZmLmxlYXNo' +
73+
'LnBhcmsiLCJwdWJsaWNfa2V5IjoiZG9nc2FyZWJhZGF0a2VlcGluZ3NlY3JldHMifQ',
74+
},
6275
spans: [],
6376
transaction: '/dogs/are/great/',
6477
type: 'transaction',
@@ -77,7 +90,7 @@ describe('eventToSentryRequest', () => {
7790
});
7891

7992
describe('envelope header', () => {
80-
it('adds correct data to envelope header', () => {
93+
it('adds correct entries to envelope header', () => {
8194
jest.spyOn(Date.prototype, 'toISOString').mockReturnValueOnce('2012-12-31T09:08:13.000Z');
8295

8396
const result = eventToSentryRequest(transactionEvent, api);
@@ -155,7 +168,7 @@ describe('eventToSentryRequest', () => {
155168
});
156169

157170
describe('item header', () => {
158-
it('adds correct data to item header', () => {
171+
it('adds correct entries to item header', () => {
159172
const result = eventToSentryRequest(transactionEvent, api);
160173
const envelope = parseEnvelopeRequest(result);
161174

0 commit comments

Comments
 (0)