Skip to content

Commit c3cf0d8

Browse files
committed
more correct
1 parent 8f409f3 commit c3cf0d8

File tree

2 files changed

+66
-7
lines changed

2 files changed

+66
-7
lines changed

packages/node/src/integrations/http.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,8 @@ function _createWrappedRequestMethodFactory(
249249
`[Tracing] Adding sentry-trace header ${sentryTraceHeader} to outgoing request to "${requestUrl}": `,
250250
);
251251
const dynamicSamplingContext = requestSpan?.transaction?.getDynamicSamplingContext();
252-
const sentryBaggageHeader = normalizeBaggageHeader(
253-
requestOptions,
254-
dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext),
255-
);
252+
const sentryBaggage = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);
253+
const sentryBaggageHeader = normalizeBaggageHeader(requestOptions, sentryBaggage);
256254

257255
requestOptions.headers = {
258256
...requestOptions.headers,
@@ -274,7 +272,8 @@ function _createWrappedRequestMethodFactory(
274272
const client = hub.getClient();
275273
if (client) {
276274
const dynamicSamplingContext = dsc || getDynamicSamplingContextFromClient(traceId, client, scope);
277-
const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);
275+
const sentryBaggage = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);
276+
const sentryBaggageHeader = normalizeBaggageHeader(requestOptions, sentryBaggage);
278277
requestOptions.headers = {
279278
...requestOptions.headers,
280279
// Setting a header to `undefined` will crash in node so we only set the baggage header when it's defined
@@ -343,11 +342,11 @@ function getRequestSpanData(requestUrl: string, requestOptions: RequestOptions):
343342
function normalizeBaggageHeader(
344343
requestOptions: RequestOptions,
345344
sentryBaggageHeader: string | undefined,
346-
): string | number | string[] | undefined {
345+
): string | string[] | undefined {
347346
if (!requestOptions.headers || !requestOptions.headers.baggage) {
348347
return sentryBaggageHeader;
349348
} else if (!sentryBaggageHeader) {
350-
return requestOptions.headers.baggage;
349+
return requestOptions.headers.baggage as string | string[];
351350
} else if (Array.isArray(requestOptions.headers.baggage)) {
352351
return [...requestOptions.headers.baggage, sentryBaggageHeader];
353352
}

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,21 @@ describe('tracing', () => {
5454
return transaction;
5555
}
5656

57+
function getHub(customOptions: Partial<NodeClientOptions> = {}) {
58+
const options = getDefaultNodeClientOptions({
59+
dsn: 'https://[email protected]/12312012',
60+
tracesSampleRate: 1.0,
61+
integrations: [new HttpIntegration({ tracing: true })],
62+
release: '1.0.0',
63+
environment: 'production',
64+
...customOptions,
65+
});
66+
const hub = new Hub(new NodeClient(options));
67+
jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub);
68+
69+
return hub;
70+
}
71+
5772
it("creates a span for each outgoing non-sentry request when there's a transaction on the scope", () => {
5873
nock('http://dogs.are.great').get('/').reply(200);
5974

@@ -162,6 +177,51 @@ describe('tracing', () => {
162177
]);
163178
});
164179

180+
it('generates and uses propagation context to attach baggage and sentry-trace header', async () => {
181+
nock('http://dogs.are.great').get('/').reply(200);
182+
183+
const request = http.get('http://dogs.are.great/');
184+
const sentryTraceHeader = request.getHeader('sentry-trace') as string;
185+
const baggageHeader = request.getHeader('baggage') as string;
186+
187+
const parts = sentryTraceHeader.split('-');
188+
expect(parts.length).toEqual(3);
189+
expect(parts[0]).toEqual('12312012123120121231201212312012');
190+
expect(parts[1]).toEqual(expect.any(String));
191+
expect(parts[2]).toEqual('1');
192+
193+
expect(baggageHeader).toEqual(
194+
'sentry-environment=production,sentry-release=1.0.0,sentry-user_segment=segmentA,sentry-public_key=dogsarebadatkeepingsecrets,sentry-trace_id=12312012123120121231201212312012,sentry-sample_rate=1',
195+
);
196+
});
197+
198+
it('uses incoming propagation context to attach baggage and sentry-trace', async () => {
199+
nock('http://dogs.are.great').get('/').reply(200);
200+
201+
const hub = getHub();
202+
hub.getScope().setPropagationContext({
203+
traceId: '86f39e84263a4de99c326acab3bfe3bd',
204+
spanId: '86f39e84263a4de9',
205+
sampled: true,
206+
dsc: {
207+
trace_id: '86f39e84263a4de99c326acab3bfe3bd',
208+
public_key: 'test-public-key',
209+
},
210+
});
211+
212+
const request = http.get('http://dogs.are.great/');
213+
const sentryTraceHeader = request.getHeader('sentry-trace') as string;
214+
const baggageHeader = request.getHeader('baggage') as string;
215+
216+
const parts = sentryTraceHeader.split('-');
217+
expect(parts.length).toEqual(3);
218+
expect(parts[0]).toEqual('86f39e84263a4de99c326acab3bfe3bd');
219+
expect(parts[1]).toEqual(expect.any(String));
220+
expect(parts[2]).toEqual('1');
221+
222+
expect(baggageHeader).toEqual('sentry-trace_id=86f39e84263a4de99c326acab3bfe3bd,sentry-public_key=test-public-key');
223+
});
224+
165225
it("doesn't attach the sentry-trace header to outgoing sentry requests", () => {
166226
nock('http://squirrelchasers.ingest.sentry.io').get('/api/12312012/store/').reply(200);
167227

0 commit comments

Comments
 (0)