Skip to content

Commit 7c8f0cd

Browse files
mydealforst
andauthored
feat(node): Extract Sentry-specific node-fetch instrumentation (#15231)
Co-authored-by: Luca Forstner <[email protected]>
1 parent cea9484 commit 7c8f0cd

File tree

10 files changed

+556
-155
lines changed

10 files changed

+556
-155
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { loggingTransport } from '@sentry-internal/node-integration-tests';
2+
import * as Sentry from '@sentry/node';
3+
4+
Sentry.init({
5+
dsn: 'https://[email protected]/1337',
6+
release: '1.0',
7+
tracePropagationTargets: [/\/v0/, 'v1'],
8+
integrations: [Sentry.nativeNodeFetchIntegration({ spans: false })],
9+
transport: loggingTransport,
10+
});
11+
12+
async function run(): Promise<void> {
13+
// Since fetch is lazy loaded, we need to wait a bit until it's fully instrumented
14+
await new Promise(resolve => setTimeout(resolve, 100));
15+
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
16+
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
17+
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
18+
await fetch(`${process.env.SERVER_URL}/api/v3`).then(res => res.text());
19+
20+
Sentry.captureException(new Error('foo'));
21+
}
22+
23+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
24+
run();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { createRunner } from '../../../../utils/runner';
2+
import { createTestServer } from '../../../../utils/server';
3+
4+
describe('outgoing fetch', () => {
5+
test('outgoing fetch requests are correctly instrumented with tracing & spans are disabled', done => {
6+
expect.assertions(11);
7+
8+
createTestServer(done)
9+
.get('/api/v0', headers => {
10+
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
11+
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
12+
expect(headers['baggage']).toEqual(expect.any(String));
13+
})
14+
.get('/api/v1', headers => {
15+
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
16+
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
17+
expect(headers['baggage']).toEqual(expect.any(String));
18+
})
19+
.get('/api/v2', headers => {
20+
expect(headers['baggage']).toBeUndefined();
21+
expect(headers['sentry-trace']).toBeUndefined();
22+
})
23+
.get('/api/v3', headers => {
24+
expect(headers['baggage']).toBeUndefined();
25+
expect(headers['sentry-trace']).toBeUndefined();
26+
})
27+
.start()
28+
.then(([SERVER_URL, closeTestServer]) => {
29+
createRunner(__dirname, 'scenario.ts')
30+
.withEnv({ SERVER_URL })
31+
.ensureNoErrorOutput()
32+
.expect({
33+
event: {
34+
exception: {
35+
values: [
36+
{
37+
type: 'Error',
38+
value: 'foo',
39+
},
40+
],
41+
},
42+
},
43+
})
44+
.start(closeTestServer);
45+
});
46+
});
47+
});

packages/core/src/utils-hoist/baggage.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ function baggageHeaderToObject(baggageHeader: string): Record<string, string> {
130130
* @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header
131131
* is not spec compliant.
132132
*/
133-
function objectToBaggageHeader(object: Record<string, string>): string | undefined {
133+
export function objectToBaggageHeader(object: Record<string, string>): string | undefined {
134134
if (Object.keys(object).length === 0) {
135135
// An empty baggage header is not spec compliant: We return undefined.
136136
return undefined;

packages/core/src/utils-hoist/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export {
130130
baggageHeaderToDynamicSamplingContext,
131131
dynamicSamplingContextToSentryBaggageHeader,
132132
parseBaggageHeader,
133+
objectToBaggageHeader,
133134
} from './baggage';
134135

135136
export { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from './url';

packages/node/src/integrations/node-fetch.ts

-154
This file was deleted.

0 commit comments

Comments
 (0)