Skip to content

Commit fb1e8a2

Browse files
committed
feat(core): Export a reusable function to add tracing headers
1 parent 6a397a3 commit fb1e8a2

File tree

3 files changed

+40
-34
lines changed

3 files changed

+40
-34
lines changed

packages/core/src/fetch.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
type PolymorphicRequestHeaders =
2222
| Record<string, string | undefined>
2323
| Array<[string, string]>
24+
| Iterable<Iterable<string>>
2425
// the below is not precisely the Header type used in Request, but it'll pass duck-typing
2526
| {
2627
append: (key: string, value: string) => void;
@@ -124,7 +125,7 @@ export function instrumentFetchRequest(
124125
// Examples: users re-using same options object for multiple fetch calls, frozen objects
125126
const options: { [key: string]: unknown } = { ...(handlerData.args[1] || {}) };
126127

127-
const headers = _addTracingHeadersToFetchRequest(
128+
const headers = getTracingHeadersForFetchRequest(
128129
request,
129130
options,
130131
// If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),
@@ -176,17 +177,22 @@ export function _callOnRequestSpanEnd(
176177
}
177178

178179
/**
179-
* Adds sentry-trace and baggage headers to the various forms of fetch headers.
180-
* exported only for testing purposes
180+
* Builds merged fetch headers that include `sentry-trace` and `baggage` (and optionally `traceparent`)
181+
* for the given request and init, without mutating the original request or options.
182+
* Returns `undefined` when there is no `sentry-trace` value to attach.
181183
*
182-
* When we determine if we should add a baggage header, there are 3 cases:
183-
* 1. No previous baggage header -> add baggage
184-
* 2. Previous baggage header has no sentry baggage values -> add our baggage
185-
* 3. Previous baggage header has sentry baggage values -> do nothing (might have been added manually by users)
184+
* @internal Exported for cross-package instrumentation (for example Cloudflare Workers fetcher bindings)
185+
* and unit tests
186+
* @hidden
187+
*
188+
* Baggage handling:
189+
* 1. No previous baggage header → include Sentry baggage
190+
* 2. Previous baggage has no Sentry entries → merge Sentry baggage in
191+
* 3. Previous baggage already has Sentry entries → leave as-is (may be user-defined)
186192
*/
187193
// eslint-disable-next-line complexity -- yup it's this complicated :(
188-
export function _addTracingHeadersToFetchRequest(
189-
request: string | Request,
194+
export function getTracingHeadersForFetchRequest(
195+
request: string | URL | Request,
190196
fetchOptionsObj: {
191197
headers?:
192198
| {

packages/core/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export { profiler } from './profiling';
142142
// eslint thinks the entire function is deprecated (while only one overload is actually deprecated)
143143
// Therefore:
144144
// eslint-disable-next-line deprecation/deprecation
145-
export { instrumentFetchRequest } from './fetch';
145+
export { instrumentFetchRequest, getTracingHeadersForFetchRequest } from './fetch';
146146
export { trpcMiddleware } from './trpc';
147147
export { wrapMcpServerWithSentry } from './integrations/mcp-server';
148148
export { captureFeedback } from './feedback';

packages/core/test/lib/fetch.test.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { beforeEach, describe, expect, it, vi } from 'vitest';
22
import type { HandlerDataFetch } from '../../src';
3-
import { _addTracingHeadersToFetchRequest, instrumentFetchRequest } from '../../src/fetch';
3+
import { getTracingHeadersForFetchRequest, instrumentFetchRequest } from '../../src/fetch';
44
import type { Span } from '../../src/types-hoist/span';
55

66
const { DEFAULT_SENTRY_TRACE, DEFAULT_BAGGAGE, hasSpansEnabled } = vi.hoisted(() => ({
@@ -31,7 +31,7 @@ vi.mock('../../src/utils/hasSpansEnabled', () => {
3131
};
3232
});
3333

34-
describe('_addTracingHeadersToFetchRequest', () => {
34+
describe('getTracingHeadersForFetchRequest', () => {
3535
beforeEach(() => {
3636
vi.clearAllMocks();
3737
hasSpansEnabled.mockReturnValue(false);
@@ -47,7 +47,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
4747
options: { headers: {} },
4848
},
4949
])('attaches sentry headers (options: $options)', ({ options }) => {
50-
expect(_addTracingHeadersToFetchRequest('/api/test', options)).toEqual({
50+
expect(getTracingHeadersForFetchRequest('/api/test', options)).toEqual({
5151
'sentry-trace': DEFAULT_SENTRY_TRACE,
5252
baggage: DEFAULT_BAGGAGE,
5353
});
@@ -56,7 +56,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
5656

5757
describe('and request headers are set in options', () => {
5858
it('attaches sentry headers to headers object', () => {
59-
expect(_addTracingHeadersToFetchRequest('/api/test', { headers: { 'custom-header': 'custom-value' } })).toEqual(
59+
expect(getTracingHeadersForFetchRequest('/api/test', { headers: { 'custom-header': 'custom-value' } })).toEqual(
6060
{
6161
'sentry-trace': DEFAULT_SENTRY_TRACE,
6262
baggage: DEFAULT_BAGGAGE,
@@ -66,7 +66,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
6666
});
6767

6868
it('attaches sentry headers to a Headers instance', () => {
69-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
69+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
7070
headers: new Headers({ 'custom-header': 'custom-value' }),
7171
});
7272

@@ -81,7 +81,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
8181
});
8282

8383
it('attaches sentry headers to headers array', () => {
84-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
84+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
8585
headers: [['custom-header', 'custom-value']],
8686
});
8787

@@ -96,7 +96,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
9696

9797
describe('and 3rd party baggage header is set', () => {
9898
it('adds additional sentry baggage values to Headers instance', () => {
99-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
99+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
100100
headers: new Headers({
101101
baggage: 'custom-baggage=1,someVal=bar',
102102
}),
@@ -112,7 +112,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
112112
});
113113

114114
it('adds additional sentry baggage values to headers array', () => {
115-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
115+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
116116
headers: [['baggage', 'custom-baggage=1,someVal=bar']],
117117
});
118118

@@ -126,7 +126,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
126126
});
127127

128128
it('adds additional sentry baggage values to headers object', () => {
129-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
129+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
130130
headers: {
131131
baggage: 'custom-baggage=1,someVal=bar',
132132
},
@@ -141,7 +141,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
141141
});
142142

143143
it('adds additional sentry baggage values to headers object with arrays', () => {
144-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
144+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
145145
headers: {
146146
baggage: ['custom-baggage=1,someVal=bar', 'other-vendor-key=value'],
147147
},
@@ -158,7 +158,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
158158

159159
describe('and Sentry values are already set', () => {
160160
it('does not override them (Headers instance)', () => {
161-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
161+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
162162
headers: new Headers({
163163
'sentry-trace': CUSTOM_SENTRY_TRACE,
164164
baggage: CUSTOM_BAGGAGE,
@@ -177,7 +177,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
177177
});
178178

179179
it('does not override them (headers array)', () => {
180-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
180+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
181181
headers: [
182182
['sentry-trace', CUSTOM_SENTRY_TRACE],
183183
['baggage', CUSTOM_BAGGAGE],
@@ -195,7 +195,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
195195
});
196196

197197
it('does not override them (headers object)', () => {
198-
const returnedHeaders = _addTracingHeadersToFetchRequest('/api/test', {
198+
const returnedHeaders = getTracingHeadersForFetchRequest('/api/test', {
199199
headers: {
200200
'sentry-trace': CUSTOM_SENTRY_TRACE,
201201
baggage: CUSTOM_BAGGAGE,
@@ -218,7 +218,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
218218
describe('and no request headers are set', () => {
219219
it('attaches sentry headers', () => {
220220
const request = new Request('http://locahlost:3000/api/test');
221-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
221+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
222222

223223
expect(returnedHeaders).toBeInstanceOf(Headers);
224224

@@ -236,7 +236,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
236236
headers: new Headers({ 'custom-header': 'custom-value' }),
237237
});
238238

239-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
239+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
240240

241241
expect(returnedHeaders).toBeInstanceOf(Headers);
242242

@@ -253,7 +253,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
253253
headers: { 'custom-header': 'custom-value' },
254254
});
255255

256-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
256+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
257257

258258
expect(returnedHeaders).toBeInstanceOf(Headers);
259259

@@ -270,7 +270,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
270270
headers: [['custom-header', 'custom-value']],
271271
});
272272

273-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
273+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
274274

275275
expect(returnedHeaders).toBeInstanceOf(Headers);
276276

@@ -292,7 +292,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
292292
}),
293293
});
294294

295-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
295+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
296296

297297
expect(returnedHeaders).toBeInstanceOf(Headers);
298298

@@ -309,7 +309,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
309309
headers: [['baggage', 'custom-baggage=1,someVal=bar']],
310310
});
311311

312-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
312+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
313313

314314
expect(returnedHeaders).toBeInstanceOf(Headers);
315315

@@ -327,7 +327,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
327327
},
328328
});
329329

330-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
330+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
331331

332332
expect(returnedHeaders).toBeInstanceOf(Headers);
333333

@@ -345,7 +345,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
345345
},
346346
});
347347

348-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
348+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
349349

350350
expect(returnedHeaders).toBeInstanceOf(Headers);
351351

@@ -367,7 +367,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
367367
}),
368368
});
369369

370-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
370+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
371371

372372
expect(returnedHeaders).toBeInstanceOf(Headers);
373373

@@ -388,7 +388,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
388388
],
389389
});
390390

391-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
391+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
392392

393393
expect(returnedHeaders).toBeInstanceOf(Headers);
394394

@@ -409,7 +409,7 @@ describe('_addTracingHeadersToFetchRequest', () => {
409409
},
410410
});
411411

412-
const returnedHeaders = _addTracingHeadersToFetchRequest(request, {});
412+
const returnedHeaders = getTracingHeadersForFetchRequest(request, {});
413413

414414
expect(returnedHeaders).toBeInstanceOf(Headers);
415415

0 commit comments

Comments
 (0)