Skip to content

Commit ef5e713

Browse files
committed
Add tests and ensure legacy disable still works
1 parent 508615f commit ef5e713

File tree

4 files changed

+125
-9
lines changed

4 files changed

+125
-9
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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({ breadcrumbs: false })],
9+
transport: loggingTransport,
10+
tracesSampleRate: 0.0,
11+
});
12+
13+
async function run(): Promise<void> {
14+
Sentry.addBreadcrumb({ message: 'manual breadcrumb' });
15+
16+
// Since fetch is lazy loaded, we need to wait a bit until it's fully instrumented
17+
await new Promise(resolve => setTimeout(resolve, 100));
18+
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
19+
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
20+
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
21+
await fetch(`${process.env.SERVER_URL}/api/v3`).then(res => res.text());
22+
23+
Sentry.captureException(new Error('foo'));
24+
}
25+
26+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
27+
run();
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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: [],
9+
transport: loggingTransport,
10+
tracesSampleRate: 0.0,
11+
fetchBreadcrumbs: false,
12+
});
13+
14+
async function run(): Promise<void> {
15+
Sentry.addBreadcrumb({ message: 'manual breadcrumb' });
16+
17+
// Since fetch is lazy loaded, we need to wait a bit until it's fully instrumented
18+
await new Promise(resolve => setTimeout(resolve, 100));
19+
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
20+
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
21+
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
22+
await fetch(`${process.env.SERVER_URL}/api/v3`).then(res => res.text());
23+
24+
Sentry.captureException(new Error('foo'));
25+
}
26+
27+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
28+
run();

dev-packages/node-integration-tests/suites/tracing/requests/fetch-breadcrumbs/test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,62 @@ conditionalTest({ min: 18 })('outgoing fetch', () => {
7575
.start(closeTestServer);
7676
});
7777
});
78+
79+
test('outgoing fetch requests should not create breadcrumbs when disabled', done => {
80+
createTestServer(done)
81+
.start()
82+
.then(([SERVER_URL, closeTestServer]) => {
83+
createRunner(__dirname, 'scenario-disabled.ts')
84+
.withEnv({ SERVER_URL })
85+
.ensureNoErrorOutput()
86+
.expect({
87+
event: {
88+
breadcrumbs: [
89+
{
90+
message: 'manual breadcrumb',
91+
timestamp: expect.any(Number),
92+
},
93+
],
94+
exception: {
95+
values: [
96+
{
97+
type: 'Error',
98+
value: 'foo',
99+
},
100+
],
101+
},
102+
},
103+
})
104+
.start(closeTestServer);
105+
});
106+
});
107+
108+
test('outgoing fetch requests should not create breadcrumbs when legacy disabled', done => {
109+
createTestServer(done)
110+
.start()
111+
.then(([SERVER_URL, closeTestServer]) => {
112+
createRunner(__dirname, 'scenario-disabled-legacy.ts')
113+
.withEnv({ SERVER_URL })
114+
.ensureNoErrorOutput()
115+
.expect({
116+
event: {
117+
breadcrumbs: [
118+
{
119+
message: 'manual breadcrumb',
120+
timestamp: expect.any(Number),
121+
},
122+
],
123+
exception: {
124+
values: [
125+
{
126+
type: 'Error',
127+
value: 'foo',
128+
},
129+
],
130+
},
131+
},
132+
})
133+
.start(closeTestServer);
134+
});
135+
});
78136
});

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,18 @@ const _fetchBreadcrumbsIntegration = ((options: NodeFetchOptions = {}) => {
3636
return;
3737
}
3838

39-
const oldIntegration = client.getIntegrationByName<OldIntegration>('NodeFetch');
40-
if (oldIntegration?.breadcrumbsDisabled) {
41-
return;
42-
}
43-
44-
diagnosticsChannel
45-
.channel('undici:request:headers')
46-
// eslint-disable-next-line deprecation/deprecation
47-
.subscribe(onRequestHeaders as diagnosticsChannel.ChannelListener);
39+
// We need to ensure all other integrations have been setup first
40+
setImmediate(() => {
41+
const oldIntegration = client.getIntegrationByName<OldIntegration>('NodeFetch');
42+
if (oldIntegration?.breadcrumbsDisabled) {
43+
return;
44+
}
45+
46+
diagnosticsChannel
47+
.channel('undici:request:headers')
48+
// eslint-disable-next-line deprecation/deprecation
49+
.subscribe(onRequestHeaders as diagnosticsChannel.ChannelListener);
50+
});
4851
},
4952
};
5053
}) satisfies IntegrationFn;

0 commit comments

Comments
 (0)