Skip to content

Commit b9f2122

Browse files
authored
ref(tracing): Unify DSC key names in envelope and baggage headers (#5302)
Unify the key names in the envelope `trace` header and the `baggage` Http header. As a result, we get rid of the mapping that was necessary before, thereby loosing a little JS bundle weight ;) Furthermore, the PR renames the `EventTraceContext` interface and aligns the `Baggage` type so that we can ensure that both DSC transport mechanisms are based on the same keys.
1 parent b52900f commit b9f2122

File tree

12 files changed

+80
-105
lines changed

12 files changed

+80
-105
lines changed

packages/core/src/envelope.ts

+6-19
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import {
2+
Baggage,
23
DsnComponents,
4+
DynamicSamplingContext,
35
Event,
46
EventEnvelope,
57
EventEnvelopeHeaders,
68
EventItem,
7-
EventTraceContext,
89
SdkInfo,
910
SdkMetadata,
1011
Session,
@@ -100,31 +101,17 @@ function createEventEnvelopeHeaders(
100101
tunnel: string | undefined,
101102
dsn: DsnComponents,
102103
): EventEnvelopeHeaders {
103-
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
104-
const { environment, release, transaction, userid, usersegment, samplerate, publickey, traceid } =
105-
(baggage && getSentryBaggageItems(baggage)) || {};
104+
const baggage: Baggage | undefined = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
105+
const dynamicSamplingContext = baggage && getSentryBaggageItems(baggage);
106106

107107
return {
108108
event_id: event.event_id as string,
109109
sent_at: new Date().toISOString(),
110110
...(sdkInfo && { sdk: sdkInfo }),
111111
...(!!tunnel && { dsn: dsnToString(dsn) }),
112112
...(event.type === 'transaction' &&
113-
baggage && {
114-
trace: dropUndefinedKeys({
115-
trace_id: traceid,
116-
public_key: publickey,
117-
sample_rate: samplerate,
118-
environment,
119-
release,
120-
transaction,
121-
...((userid || usersegment) && {
122-
user: {
123-
id: userid,
124-
segment: usersegment,
125-
},
126-
}),
127-
}) as EventTraceContext,
113+
dynamicSamplingContext && {
114+
trace: dropUndefinedKeys({ ...dynamicSamplingContext }) as DynamicSamplingContext,
128115
}),
129116
};
130117
}

packages/core/test/lib/envelope.test.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DsnComponents, Event, EventTraceContext } from '@sentry/types';
1+
import { DsnComponents, DynamicSamplingContext, Event } from '@sentry/types';
22

33
import { createEventEnvelope } from '../../src/envelope';
44

@@ -14,13 +14,13 @@ describe('createEventEnvelope', () => {
1414
expect(envelopeHeaders.trace).toBeUndefined();
1515
});
1616

17-
const testTable: Array<[string, Event, EventTraceContext]> = [
17+
const testTable: Array<[string, Event, DynamicSamplingContext]> = [
1818
[
1919
'adds minimal baggage items',
2020
{
2121
type: 'transaction',
2222
sdkProcessingMetadata: {
23-
baggage: [{ traceid: '1234', publickey: 'pubKey123' }, '', false],
23+
baggage: [{ trace_id: '1234', public_key: 'pubKey123' }, '', false],
2424
},
2525
},
2626
{ trace_id: '1234', public_key: 'pubKey123' },
@@ -30,7 +30,7 @@ describe('createEventEnvelope', () => {
3030
{
3131
type: 'transaction',
3232
sdkProcessingMetadata: {
33-
baggage: [{ environment: 'prod', release: '1.0.0', publickey: 'pubKey123', traceid: '1234' }, '', false],
33+
baggage: [{ environment: 'prod', release: '1.0.0', public_key: 'pubKey123', trace_id: '1234' }, '', false],
3434
},
3535
},
3636
{ release: '1.0.0', environment: 'prod', trace_id: '1234', public_key: 'pubKey123' },
@@ -44,26 +44,27 @@ describe('createEventEnvelope', () => {
4444
{
4545
environment: 'prod',
4646
release: '1.0.0',
47-
userid: 'bob',
48-
usersegment: 'segmentA',
4947
transaction: 'TX',
50-
samplerate: '0.95',
51-
publickey: 'pubKey123',
52-
traceid: '1234',
48+
user_id: 'bob',
49+
user_segment: 'segmentA',
50+
sample_rate: '0.95',
51+
public_key: 'pubKey123',
52+
trace_id: '1234',
5353
},
5454
'',
5555
false,
5656
],
5757
},
5858
},
5959
{
60-
release: '1.0.0',
6160
environment: 'prod',
62-
user: { id: 'bob', segment: 'segmentA' },
61+
release: '1.0.0',
6362
transaction: 'TX',
64-
trace_id: '1234',
65-
public_key: 'pubKey123',
63+
user_id: 'bob',
64+
user_segment: 'segmentA',
6665
sample_rate: '0.95',
66+
public_key: 'pubKey123',
67+
trace_id: '1234',
6768
},
6869
],
6970
];

packages/integration-tests/suites/tracing/browsertracing/meta/template.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-1" />
55
<meta
66
name="baggage"
7-
content="sentry-release=2.1.12,sentry-publickey=public,sentry-traceid=123,sentry-samplerate=0.3232"
7+
content="sentry-release=2.1.12,sentry-public_key=public,sentry-trace_id=123,sentry-sample_rate=0.3232"
88
/>
99
</head>
1010
</html>

packages/integration-tests/suites/tracing/envelope-header/test.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { sentryTest } from '../../../utils/fixtures';
55
import { envelopeHeaderRequestParser, getFirstSentryEnvelopeRequest } from '../../../utils/helpers';
66

77
sentryTest(
8-
'should send dynamic sampling context data in transaction envelope header',
8+
'should send dynamic sampling context data in trace envelope header of a transaction envelope',
99
async ({ getLocalTestPath, page }) => {
1010
const url = await getLocalTestPath({ testDir: __dirname });
1111

@@ -15,10 +15,8 @@ sentryTest(
1515
expect(envHeader.trace).toEqual({
1616
environment: 'production',
1717
transaction: expect.stringContaining('index.html'),
18-
user: {
19-
id: 'user123',
20-
segment: 'segmentB',
21-
},
18+
user_id: 'user123',
19+
user_segment: 'segmentB',
2220
sample_rate: '1',
2321
trace_id: expect.any(String),
2422
public_key: 'public',

packages/node-integration-tests/suites/express/sentry-trace/baggage-header-assign/test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ test('Should populate and propagate sentry baggage if sentry-trace header does n
7878
test_data: {
7979
host: 'somewhere.not.sentry',
8080
baggage: expect.stringContaining(
81-
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
82-
'sentry-publickey=public,sentry-traceid=',
81+
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,' +
82+
'sentry-public_key=public,sentry-trace_id=',
8383
),
8484
},
8585
});
@@ -99,7 +99,7 @@ test('Should populate Sentry and propagate 3rd party content if sentry-trace hea
9999
// TraceId changes, hence we only expect that the string contains the traceid key
100100
baggage: expect.stringContaining(
101101
'foo=bar,bar=baz,sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,' +
102-
'sentry-samplerate=1,sentry-publickey=public,sentry-traceid=',
102+
'sentry-public_key=public,sentry-trace_id=',
103103
),
104104
},
105105
});

packages/node/test/integrations/http.test.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,11 @@ describe('tracing', () => {
108108
const baggageHeader = request.getHeader('baggage') as string;
109109

110110
expect(baggageHeader).toBeDefined();
111+
expect(typeof baggageHeader).toEqual('string');
111112
expect(baggageHeader).toEqual(
112-
'sentry-environment=production,sentry-release=1.0.0,sentry-transaction=dogpark,sentry-userid=uid123,' +
113-
'sentry-usersegment=segmentA,sentry-samplerate=1,sentry-publickey=dogsarebadatkeepingsecrets,' +
114-
'sentry-traceid=12312012123120121231201212312012',
113+
'sentry-environment=production,sentry-release=1.0.0,sentry-transaction=dogpark,sentry-user_id=uid123,' +
114+
'sentry-user_segment=segmentA,sentry-public_key=dogsarebadatkeepingsecrets,' +
115+
'sentry-trace_id=12312012123120121231201212312012,sentry-sample_rate=1',
115116
);
116117
});
117118

@@ -124,10 +125,11 @@ describe('tracing', () => {
124125
const baggageHeader = request.getHeader('baggage') as string;
125126

126127
expect(baggageHeader).toBeDefined();
128+
expect(typeof baggageHeader).toEqual('string');
127129
expect(baggageHeader).toEqual(
128130
'dog=great,sentry-environment=production,sentry-release=1.0.0,sentry-transaction=dogpark,' +
129-
'sentry-userid=uid123,sentry-usersegment=segmentA,sentry-samplerate=1,' +
130-
'sentry-publickey=dogsarebadatkeepingsecrets,sentry-traceid=12312012123120121231201212312012',
131+
'sentry-user_id=uid123,sentry-user_segment=segmentA,sentry-public_key=dogsarebadatkeepingsecrets,' +
132+
'sentry-trace_id=12312012123120121231201212312012,sentry-sample_rate=1',
131133
);
132134
});
133135

packages/tracing/src/transaction.ts

+32-37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { getCurrentHub, Hub } from '@sentry/hub';
22
import {
33
Baggage,
4+
BaggageObj,
45
Event,
56
Measurements,
67
Transaction as TransactionInterface,
@@ -10,11 +11,11 @@ import {
1011
import {
1112
createBaggage,
1213
dropUndefinedKeys,
14+
getSentryBaggageItems,
15+
getThirdPartyBaggage,
1316
isBaggageMutable,
1417
isSentryBaggageEmpty,
1518
logger,
16-
setBaggageImmutable,
17-
setBaggageValue,
1819
} from '@sentry/utils';
1920

2021
import { Span as SpanClass, SpanRecorder } from './span';
@@ -228,40 +229,34 @@ export class Transaction extends SpanClass implements TransactionInterface {
228229
const hub: Hub = this._hub || getCurrentHub();
229230
const client = hub && hub.getClient();
230231

231-
const { environment, release } = (client && client.getOptions()) || {};
232-
const { publicKey } = (client && client.getDsn()) || {};
233-
234-
const sampleRate = this.metadata && this.metadata.transactionSampling && this.metadata.transactionSampling.rate;
235-
const traceId = this.traceId;
236-
const transactionName = this.name;
237-
238-
let userId, userSegment;
239-
hub.configureScope(scope => {
240-
const { id, segment } = scope.getUser() || {};
241-
userId = id;
242-
userSegment = segment;
243-
});
244-
245-
environment && setBaggageValue(baggage, 'environment', environment);
246-
release && setBaggageValue(baggage, 'release', release);
247-
transactionName && setBaggageValue(baggage, 'transaction', transactionName);
248-
userId && setBaggageValue(baggage, 'userid', userId);
249-
userSegment && setBaggageValue(baggage, 'usersegment', userSegment);
250-
sampleRate &&
251-
setBaggageValue(
252-
baggage,
253-
'samplerate',
254-
// This will make sure that expnent notation (e.g. 1.45e-14) is converted to simple decimal representation
255-
// Another edge case would be something like Number.NEGATIVE_INFINITY in which case we could still
256-
// add something like .replace(/-?∞/, '0'). For the sake of saving bytes, I'll not add this until
257-
// it becomes a problem
258-
sampleRate.toLocaleString('fullwide', { useGrouping: false, maximumFractionDigits: 16 }),
259-
);
260-
publicKey && setBaggageValue(baggage, 'publickey', publicKey);
261-
traceId && setBaggageValue(baggage, 'traceid', traceId);
262-
263-
setBaggageImmutable(baggage);
264-
265-
return baggage;
232+
if (!client) return baggage;
233+
234+
const { environment, release } = client.getOptions() || {};
235+
const { publicKey: public_key } = client.getDsn() || {};
236+
237+
const rate = this.metadata && this.metadata.transactionSampling && this.metadata.transactionSampling.rate;
238+
const sample_rate =
239+
rate !== undefined
240+
? rate.toLocaleString('fullwide', { useGrouping: false, maximumFractionDigits: 16 })
241+
: undefined;
242+
243+
const scope = hub.getScope();
244+
const { id: user_id, segment: user_segment } = (scope && scope.getUser()) || {};
245+
246+
return createBaggage(
247+
dropUndefinedKeys({
248+
environment,
249+
release,
250+
transaction: this.name,
251+
user_id,
252+
user_segment,
253+
public_key,
254+
trace_id: this.traceId,
255+
sample_rate,
256+
...getSentryBaggageItems(baggage), // keep user-added values
257+
} as BaggageObj),
258+
getThirdPartyBaggage(baggage), // TODO: remove once we ignore 3rd party baggage
259+
false, // set baggage immutable
260+
);
266261
}
267262
}

packages/tracing/test/browser/browsertracing.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -507,9 +507,9 @@ describe('BrowserTracing', () => {
507507
expect(baggage[0]).toEqual({
508508
release: '1.0.0',
509509
environment: 'production',
510-
publickey: 'pubKey',
511-
traceid: expect.any(String),
512510
transaction: 'blank',
511+
public_key: 'pubKey',
512+
trace_id: expect.not.stringMatching('12312012123120121231201212312012'),
513513
});
514514
expect(baggage[1]).toBeDefined();
515515
expect(baggage[1]).toEqual('');

packages/tracing/test/span.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,8 @@ describe('Span', () => {
444444
release: '1.0.1',
445445
environment: 'production',
446446
transaction: 'tx',
447-
samplerate: '0.56',
448-
traceid: expect.any(String),
447+
sample_rate: '0.56',
448+
trace_id: expect.any(String),
449449
});
450450
expect(baggage && getThirdPartyBaggage(baggage)).toStrictEqual('');
451451
});
@@ -468,8 +468,8 @@ describe('Span', () => {
468468
release: '1.0.1',
469469
environment: 'production',
470470
transaction: 'tx',
471-
samplerate: '0.0000000000000145',
472-
traceid: expect.any(String),
471+
sample_rate: '0.0000000000000145',
472+
trace_id: expect.any(String),
473473
});
474474
expect(baggage && getThirdPartyBaggage(baggage)).toStrictEqual('');
475475
});

packages/types/src/baggage.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
export type AllowedBaggageKeys =
2-
| 'environment'
3-
| 'release'
4-
| 'transaction'
5-
| 'userid'
6-
| 'usersegment'
7-
| 'samplerate'
8-
| 'traceid'
9-
| 'publickey';
1+
import { DynamicSamplingContext } from './envelope';
2+
3+
export type AllowedBaggageKeys = keyof DynamicSamplingContext;
104

115
export type BaggageObj = Partial<Record<AllowedBaggageKeys, string> & Record<string, string>>;
126

packages/types/src/envelope.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@ import { UserFeedback } from './user';
99
// Based on: https://develop.sentry.dev/sdk/envelopes/
1010

1111
// Based on https://github.com/getsentry/relay/blob/b23b8d3b2360a54aaa4d19ecae0231201f31df5e/relay-sampling/src/lib.rs#L685-L707
12-
export type EventTraceContext = {
12+
export type DynamicSamplingContext = {
1313
trace_id: Transaction['traceId'];
1414
public_key: DsnComponents['publicKey'];
1515
sample_rate?: string;
1616
release?: string;
17-
user?: {
18-
id?: string;
19-
segment?: string;
20-
};
2117
environment?: string;
2218
transaction?: string;
19+
user_id?: string;
20+
user_segment?: string;
2321
};
2422

2523
export type EnvelopeItemType =
@@ -74,7 +72,7 @@ export type SessionItem =
7472
| BaseEnvelopeItem<SessionAggregatesItemHeaders, SessionAggregates>;
7573
export type ClientReportItem = BaseEnvelopeItem<ClientReportItemHeaders, ClientReport>;
7674

77-
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: EventTraceContext };
75+
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: DynamicSamplingContext };
7876
type SessionEnvelopeHeaders = { sent_at: string };
7977
type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders;
8078

packages/types/src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ export type {
1313
BaseEnvelopeItemHeaders,
1414
ClientReportEnvelope,
1515
ClientReportItem,
16+
DynamicSamplingContext,
1617
Envelope,
1718
EnvelopeItemType,
1819
EnvelopeItem,
1920
EventEnvelope,
2021
EventEnvelopeHeaders,
2122
EventItem,
22-
EventTraceContext,
2323
SessionEnvelope,
2424
SessionItem,
2525
UserFeedbackItem,

0 commit comments

Comments
 (0)