Skip to content

Commit 6f7db44

Browse files
AbhiPrasadLms24
andcommitted
ref: Rename baggage env header to trace (#5128)
This patch renames the tracing data envelope header from `baggage` to `trace`. Additionally, it now includes the `trace_id` and `public_key` fields as required by Relay Co-authored-by: Abhijeet Prasad <[email protected]> Co-authored-by: Lukas Stracke <[email protected]>
1 parent 2c0a218 commit 6f7db44

File tree

9 files changed

+165
-99
lines changed

9 files changed

+165
-99
lines changed

.github/workflows/build.yml

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -111,42 +111,42 @@ jobs:
111111
# `job_build` can't see `job_install_deps` and what it returned)
112112
dependency_cache_key: ${{ needs.job_install_deps.outputs.dependency_cache_key }}
113113

114-
job_build_aws_lambda_layer:
115-
name: Build AWS Lambda Layer
116-
needs: job_build
117-
runs-on: ubuntu-latest
118-
steps:
119-
- name: Check out current commit (${{ env.HEAD_COMMIT }})
120-
uses: actions/checkout@v2
121-
with:
122-
ref: ${{ env.HEAD_COMMIT }}
123-
- name: Set up Node
124-
uses: actions/setup-node@v1
125-
with:
126-
node-version: ${{ env.DEFAULT_NODE_VERSION }}
127-
- name: Check dependency cache
128-
uses: actions/cache@v2
129-
with:
130-
path: ${{ env.CACHED_DEPENDENCY_PATHS }}
131-
key: ${{ needs.job_build.outputs.dependency_cache_key }}
132-
- name: Check build cache
133-
uses: actions/cache@v2
134-
with:
135-
path: ${{ env.CACHED_BUILD_PATHS }}
136-
key: ${{ env.BUILD_CACHE_KEY }}
137-
- name: Get SDK version
138-
run: |
139-
export SDK_VERSION=$(cat dist-serverless/version)
140-
echo "SDK_VERSION=$SDK_VERSION" | tee -a $GITHUB_ENV
141-
- uses: actions/upload-artifact@v3
142-
with:
143-
name: ${{ env.HEAD_COMMIT }}
144-
path: |
145-
dist-serverless/*
146-
- uses: getsentry/action-build-aws-lambda-extension@v1
147-
with:
148-
artifact_name: ${{ env.HEAD_COMMIT }}
149-
zip_file_name: sentry-node-serverless-${{ env.SDK_VERSION }}.zip
114+
# job_build_aws_lambda_layer:
115+
# name: Build AWS Lambda Layer
116+
# needs: job_build
117+
# runs-on: ubuntu-latest
118+
# steps:
119+
# - name: Check out current commit (${{ env.HEAD_COMMIT }})
120+
# uses: actions/checkout@v2
121+
# with:
122+
# ref: ${{ env.HEAD_COMMIT }}
123+
# - name: Set up Node
124+
# uses: actions/setup-node@v1
125+
# with:
126+
# node-version: ${{ env.DEFAULT_NODE_VERSION }}
127+
# - name: Check dependency cache
128+
# uses: actions/cache@v2
129+
# with:
130+
# path: ${{ env.CACHED_DEPENDENCY_PATHS }}
131+
# key: ${{ needs.job_build.outputs.dependency_cache_key }}
132+
# - name: Check build cache
133+
# uses: actions/cache@v2
134+
# with:
135+
# path: ${{ env.CACHED_BUILD_PATHS }}
136+
# key: ${{ env.BUILD_CACHE_KEY }}
137+
# - name: Get SDK version
138+
# run: |
139+
# export SDK_VERSION=$(cat dist-serverless/version)
140+
# echo "SDK_VERSION=$SDK_VERSION" | tee -a $GITHUB_ENV
141+
# - uses: actions/upload-artifact@v3
142+
# with:
143+
# name: ${{ env.HEAD_COMMIT }}
144+
# path: |
145+
# dist-serverless/*
146+
# - uses: getsentry/action-build-aws-lambda-extension@v1
147+
# with:
148+
# artifact_name: ${{ env.HEAD_COMMIT }}
149+
# zip_file_name: sentry-node-serverless-${{ env.SDK_VERSION }}.zip
150150

151151
job_size_check:
152152
name: Size Check

packages/core/src/envelope.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,7 @@ import {
1111
SessionEnvelope,
1212
SessionItem,
1313
} from '@sentry/types';
14-
import {
15-
BaggageObj,
16-
createBaggage,
17-
createEnvelope,
18-
dropUndefinedKeys,
19-
dsnToString,
20-
isBaggageEmpty,
21-
serializeBaggage,
22-
} from '@sentry/utils';
14+
import { createEnvelope, dropUndefinedKeys, dsnToString } from '@sentry/utils';
2315

2416
/** Extract sdk info from from the API metadata */
2517
function getSdkMetadataForEnvelopeHeader(metadata?: SdkMetadata): SdkInfo | undefined {
@@ -128,24 +120,30 @@ function createEventEnvelopeHeaders(
128120
tunnel: string | undefined,
129121
dsn: DsnComponents,
130122
): EventEnvelopeHeaders {
131-
const baggage =
132-
event.type === 'transaction' &&
133-
createBaggage(
134-
dropUndefinedKeys({
135-
environment: event.environment,
136-
release: event.release,
137-
transaction: event.transaction,
138-
userid: event.user && event.user.id,
139-
// user.segment currently doesn't exist explicitly in interface User (just as a record key)
140-
usersegment: event.user && event.user.segment,
141-
} as BaggageObj),
142-
);
143-
144123
return {
145124
event_id: event.event_id as string,
146125
sent_at: new Date().toISOString(),
147126
...(sdkInfo && { sdk: sdkInfo }),
148127
...(!!tunnel && { dsn: dsnToString(dsn) }),
149-
...(baggage && !isBaggageEmpty(baggage) && { baggage: serializeBaggage(baggage) }),
128+
...(event.type === 'transaction' &&
129+
event.contexts &&
130+
event.contexts.trace && {
131+
// TODO: Grab this from baggage
132+
trace: dropUndefinedKeys({
133+
// Trace context must be defined for transactions
134+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
135+
trace_id: event.contexts!.trace.trace_id as string,
136+
environment: event.environment,
137+
release: event.release,
138+
transaction: event.transaction,
139+
user:
140+
event.user &&
141+
dropUndefinedKeys({
142+
id: event.user.id,
143+
segment: event.user.segment,
144+
}),
145+
public_key: dsn.publicKey,
146+
}),
147+
}),
150148
};
151149
}
Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,62 @@
11
import { DsnComponents, Event } from '@sentry/types';
2+
import { EventTraceContext } from '@sentry/types/build/types/envelope';
23

34
import { createEventEnvelope } from '../../src/envelope';
45

5-
const testDsn: DsnComponents = { protocol: 'https', projectId: 'abc', host: 'testry.io' };
6+
const testDsn: DsnComponents = { protocol: 'https', projectId: 'abc', host: 'testry.io', publicKey: 'pubKey123' };
67

78
describe('createEventEnvelope', () => {
8-
describe('baggage header', () => {
9-
it("doesn't add baggage header if event is not a transaction", () => {
9+
describe('trace header', () => {
10+
it("doesn't add trace header if event is not a transaction", () => {
1011
const event: Event = {};
1112
const envelopeHeaders = createEventEnvelope(event, testDsn)[0];
1213

1314
expect(envelopeHeaders).toBeDefined();
14-
expect(envelopeHeaders.baggage).toBeUndefined();
15+
expect(envelopeHeaders.trace).toBeUndefined();
1516
});
1617

17-
it("doesn't add baggage header if no baggage data is available", () => {
18+
it('adds minimal trace data if event is a transaction and no other baggage-related data is available', () => {
1819
const event: Event = {
1920
type: 'transaction',
21+
contexts: {
22+
trace: {
23+
trace_id: '1234',
24+
},
25+
},
2026
};
2127
const envelopeHeaders = createEventEnvelope(event, testDsn)[0];
2228

2329
expect(envelopeHeaders).toBeDefined();
24-
expect(envelopeHeaders.baggage).toBeUndefined();
30+
expect(envelopeHeaders.trace).toEqual({ trace_id: '1234', public_key: 'pubKey123' });
2531
});
2632

27-
const testTable: Array<[string, Event, string]> = [
28-
['adds only baggage item', { type: 'transaction', release: '1.0.0' }, 'sentry-release=1.0.0'],
33+
const testTable: Array<[string, Event, EventTraceContext]> = [
34+
[
35+
'adds only baggage item',
36+
{
37+
type: 'transaction',
38+
release: '1.0.0',
39+
contexts: {
40+
trace: {
41+
trace_id: '1234',
42+
},
43+
},
44+
},
45+
{ release: '1.0.0', trace_id: '1234', public_key: 'pubKey123' },
46+
],
2947
[
3048
'adds two baggage items',
31-
{ type: 'transaction', release: '1.0.0', environment: 'prod' },
32-
'sentry-environment=prod,sentry-release=1.0.0',
49+
{
50+
type: 'transaction',
51+
release: '1.0.0',
52+
environment: 'prod',
53+
contexts: {
54+
trace: {
55+
trace_id: '1234',
56+
},
57+
},
58+
},
59+
{ release: '1.0.0', environment: 'prod', trace_id: '1234', public_key: 'pubKey123' },
3360
],
3461
[
3562
'adds all baggageitems',
@@ -39,16 +66,28 @@ describe('createEventEnvelope', () => {
3966
environment: 'prod',
4067
user: { id: 'bob', segment: 'segmentA' },
4168
transaction: 'TX',
69+
contexts: {
70+
trace: {
71+
trace_id: '1234',
72+
},
73+
},
74+
},
75+
{
76+
release: '1.0.0',
77+
environment: 'prod',
78+
user: { id: 'bob', segment: 'segmentA' },
79+
transaction: 'TX',
80+
trace_id: '1234',
81+
public_key: 'pubKey123',
4282
},
43-
'sentry-environment=prod,sentry-release=1.0.0,sentry-transaction=TX,sentry-userid=bob,sentry-usersegment=segmentA',
4483
],
4584
];
46-
it.each(testTable)('%s', (_: string, event, serializedBaggage) => {
85+
it.each(testTable)('%s', (_: string, event, trace) => {
4786
const envelopeHeaders = createEventEnvelope(event, testDsn)[0];
4887

4988
expect(envelopeHeaders).toBeDefined();
50-
expect(envelopeHeaders.baggage).toBeDefined();
51-
expect(envelopeHeaders.baggage).toEqual(serializedBaggage);
89+
expect(envelopeHeaders.trace).toBeDefined();
90+
expect(envelopeHeaders.trace).toEqual(trace);
5291
});
5392
});
5493
});
Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
import { expect } from '@playwright/test';
2-
import { Event, EventEnvelopeHeaders } from '@sentry/types';
2+
import { EventEnvelopeHeaders } from '@sentry/types';
33

44
import { sentryTest } from '../../../utils/fixtures';
55
import { envelopeHeaderRequestParser, getFirstSentryEnvelopeRequest } from '../../../utils/helpers';
66

7-
sentryTest('should send baggage data in transaction envelope header', async ({ getLocalTestPath, page }) => {
7+
sentryTest('should send trace context data in transaction envelope header', async ({ getLocalTestPath, page }) => {
88
const url = await getLocalTestPath({ testDir: __dirname });
99

1010
const envHeader = await getFirstSentryEnvelopeRequest<EventEnvelopeHeaders>(page, url, envelopeHeaderRequestParser);
1111

12-
expect(envHeader.baggage).toBeDefined();
13-
expect(envHeader.baggage).toEqual(
14-
'sentry-environment=production,sentry-transaction=testTransactionBaggage,sentry-userid=user123,sentry-usersegment=segmentB',
15-
);
12+
expect(envHeader.trace).toBeDefined();
13+
expect(envHeader.trace).toMatchObject({
14+
environment: 'production',
15+
transaction: 'testTransactionBaggage',
16+
user: {
17+
id: 'user123',
18+
segment: 'segmentB',
19+
},
20+
public_key: 'public',
21+
trace_id: expect.any(String),
22+
});
1623
});

packages/types/src/baggage.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export type AllowedBaggageKeys = 'environment' | 'release' | 'userid' | 'transaction' | 'usersegment';
2+
export type BaggageObj = Partial<Record<AllowedBaggageKeys, string> & Record<string, string>>;
3+
4+
/**
5+
* The baggage data structure represents key,value pairs based on the baggage
6+
* spec: https://www.w3.org/TR/baggage
7+
*
8+
* It is expected that users interact with baggage using the helpers methods:
9+
* `createBaggage`, `getBaggageValue`, and `setBaggageValue`.
10+
*
11+
* Internally, the baggage data structure is a tuple of length 2, separating baggage values
12+
* based on if they are related to Sentry or not. If the baggage values are
13+
* set/used by sentry, they will be stored in an object to be easily accessed.
14+
* If they are not, they are kept as a string to be only accessed when serialized
15+
* at baggage propagation time.
16+
*/
17+
export type Baggage = [BaggageObj, string];

packages/types/src/envelope.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import { ClientReport } from './clientreport';
2+
import { DsnComponents } from './dsn';
23
import { Event } from './event';
34
import { SdkInfo } from './sdkinfo';
45
import { Session, SessionAggregates } from './session';
5-
import { TransactionSamplingMethod } from './transaction';
6+
import { Transaction, TransactionSamplingMethod } from './transaction';
67
import { UserFeedback } from './user';
78

89
// Based on: https://develop.sentry.dev/sdk/envelopes/
910

11+
// Based on https://github.com/getsentry/relay/blob/b23b8d3b2360a54aaa4d19ecae0231201f31df5e/relay-sampling/src/lib.rs#L685-L707
12+
export type EventTraceContext = {
13+
trace_id: Transaction['traceId'];
14+
public_key: DsnComponents['publicKey'];
15+
release?: string;
16+
user?: {
17+
id?: string;
18+
segment?: string;
19+
};
20+
environment?: string;
21+
transaction?: string;
22+
};
23+
1024
export type EnvelopeItemType =
1125
| 'client_report'
1226
| 'user_report'
@@ -59,7 +73,7 @@ export type SessionItem =
5973
| BaseEnvelopeItem<SessionAggregatesItemHeaders, SessionAggregates>;
6074
export type ClientReportItem = BaseEnvelopeItem<ClientReportItemHeaders, ClientReport>;
6175

62-
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; baggage?: string };
76+
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: EventTraceContext };
6377
type SessionEnvelopeHeaders = { sent_at: string };
6478
type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders;
6579

packages/types/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export type { Attachment } from './attachment';
2+
export type { AllowedBaggageKeys, Baggage, BaggageObj } from './baggage';
23
export type { Breadcrumb, BreadcrumbHint } from './breadcrumb';
34
export type { Client } from './client';
45
export type { ClientReport, Outcome, EventDropReason } from './clientreport';

packages/types/src/user.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface User {
55
ip_address?: string;
66
email?: string;
77
username?: string;
8+
segment?: string;
89
}
910

1011
export interface UserFeedback {

packages/utils/src/baggage.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,8 @@
1+
import { Baggage, BaggageObj } from '@sentry/types';
2+
13
import { IS_DEBUG_BUILD } from './flags';
24
import { logger } from './logger';
35

4-
export type AllowedBaggageKeys = 'environment' | 'release' | 'userid' | 'transaction' | 'usersegment';
5-
export type BaggageObj = Partial<Record<AllowedBaggageKeys, string> & Record<string, string>>;
6-
7-
/**
8-
* The baggage data structure represents key,value pairs based on the baggage
9-
* spec: https://www.w3.org/TR/baggage
10-
*
11-
* It is expected that users interact with baggage using the helpers methods:
12-
* `createBaggage`, `getBaggageValue`, and `setBaggageValue`.
13-
*
14-
* Internally, the baggage data structure is a tuple of length 2, separating baggage values
15-
* based on if they are related to Sentry or not. If the baggage values are
16-
* set/used by sentry, they will be stored in an object to be easily accessed.
17-
* If they are not, they are kept as a string to be only accessed when serialized
18-
* at baggage propagation time.
19-
*/
20-
export type Baggage = [BaggageObj, string];
21-
226
export const BAGGAGE_HEADER_NAME = 'baggage';
237

248
export const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';
@@ -52,6 +36,11 @@ export function isBaggageEmpty(baggage: Baggage): boolean {
5236
return Object.keys(baggage[0]).length === 0;
5337
}
5438

39+
/** Returns Sentry specific baggage values */
40+
export function getSentryBaggageItems(baggage: Baggage): BaggageObj {
41+
return baggage[0];
42+
}
43+
5544
/** Serialize a baggage object */
5645
export function serializeBaggage(baggage: Baggage): string {
5746
return Object.keys(baggage[0]).reduce((prev, key: keyof BaggageObj) => {

0 commit comments

Comments
 (0)