Skip to content

Commit d9b707f

Browse files
mydeaandreiborza
authored andcommitted
feat(node): Drop 401-404 and 3xx status code spans by default (#16972)
In addition to 404, we now also drop 401, 402, 403 and 3xx (e.g. 301 MOVED_PERMANTENTLY) spans by default. These are usually not helpful. Noticed this in some react-router E2E test where 301 spans were messing with the test, but these should not even be captured really. --------- Co-authored-by: Andrei Borza <[email protected]>
1 parent c70fa71 commit d9b707f

File tree

16 files changed

+142
-126
lines changed

16 files changed

+142
-126
lines changed

dev-packages/e2e-tests/test-applications/nextjs-14/app/generation-functions/with-redirect/page.tsx

Lines changed: 0 additions & 11 deletions
This file was deleted.

dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,3 @@ test('Should send a transaction and an error event for a faulty generateViewport
108108

109109
expect(errorEvent.transaction).toBe('Page.generateViewport (/generation-functions)');
110110
});
111-
112-
test('Should send a transaction event with correct status for a generateMetadata() function invocation with redirect()', async ({
113-
page,
114-
}) => {
115-
const testTitle = 'redirect-foobar';
116-
117-
const transactionPromise = waitForTransaction('nextjs-14', async transactionEvent => {
118-
return (
119-
transactionEvent.contexts?.trace?.data?.['http.target'] ===
120-
`/generation-functions/with-redirect?metadataTitle=${testTitle}`
121-
);
122-
});
123-
124-
await page.goto(`/generation-functions/with-redirect?metadataTitle=${testTitle}`);
125-
126-
expect((await transactionPromise).contexts?.trace?.status).toBe('ok');
127-
});

dev-packages/e2e-tests/test-applications/nextjs-app-dir/app/route-handlers/[param]/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export async function GET() {
55
}
66

77
export async function POST() {
8-
return NextResponse.json({ name: 'John Doe' }, { status: 403 });
8+
return NextResponse.json({ name: 'John Doe' }, { status: 400 });
99
}

dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/route-handlers.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test('Should create a transaction for route handlers and correctly set span stat
2828

2929
const routehandlerTransaction = await routehandlerTransactionPromise;
3030

31-
expect(routehandlerTransaction.contexts?.trace?.status).toBe('permission_denied');
31+
expect(routehandlerTransaction.contexts?.trace?.status).toBe('invalid_argument');
3232
expect(routehandlerTransaction.contexts?.trace?.op).toBe('http.server');
3333
});
3434

dev-packages/e2e-tests/test-applications/node-express/src/app.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ export const appRouter = t.router({
143143
.mutation(() => {
144144
throw new Error('I crashed in a trpc handler');
145145
}),
146-
unauthorized: procedure.mutation(() => {
147-
throw new TRPCError({ code: 'UNAUTHORIZED', cause: new Error('Unauthorized') });
146+
badRequest: procedure.mutation(() => {
147+
throw new TRPCError({ code: 'BAD_REQUEST', cause: new Error('Bad Request') });
148148
}),
149149
});
150150

dev-packages/e2e-tests/test-applications/node-express/tests/trpc.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ test('Should record transaction and error for a trpc handler that returns a stat
109109
const transactionEventPromise = waitForTransaction('node-express', transactionEvent => {
110110
return (
111111
transactionEvent.transaction === 'POST /trpc' &&
112-
!!transactionEvent.spans?.find(span => span.description === 'trpc/unauthorized')
112+
!!transactionEvent.spans?.find(span => span.description === 'trpc/badRequest')
113113
);
114114
});
115115

116116
const errorEventPromise = waitForError('node-express', errorEvent => {
117-
return !!errorEvent?.exception?.values?.some(exception => exception.value?.includes('Unauthorized'));
117+
return !!errorEvent?.exception?.values?.some(exception => exception.value?.includes('Bad Request'));
118118
});
119119

120120
const trpcClient = createTRPCProxyClient<AppRouter>({
@@ -125,7 +125,7 @@ test('Should record transaction and error for a trpc handler that returns a stat
125125
],
126126
});
127127

128-
await expect(trpcClient.unauthorized.mutate()).rejects.toBeDefined();
128+
await expect(trpcClient.badRequest.mutate()).rejects.toBeDefined();
129129

130130
await expect(transactionEventPromise).resolves.toBeDefined();
131131
await expect(errorEventPromise).resolves.toBeDefined();

dev-packages/node-integration-tests/suites/express-v5/tracing/scenario-filterStatusCode.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ app.get('/', (_req, res) => {
88
res.send({ response: 'response 0' });
99
});
1010

11+
app.get('/401', (_req, res) => {
12+
res.status(401).send({ response: 'response 401' });
13+
});
14+
15+
app.get('/402', (_req, res) => {
16+
res.status(402).send({ response: 'response 402' });
17+
});
18+
19+
app.get('/403', (_req, res) => {
20+
res.status(403).send({ response: 'response 403' });
21+
});
22+
1123
app.get('/499', (_req, res) => {
1224
res.status(499).send({ response: 'response 499' });
1325
});

dev-packages/node-integration-tests/suites/express-v5/tracing/scenario.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ app.get('/', (_req, res) => {
1515
res.send({ response: 'response 0' });
1616
});
1717

18+
app.get('/401', (_req, res) => {
19+
res.status(401).send({ response: 'response 401' });
20+
});
21+
22+
app.get('/402', (_req, res) => {
23+
res.status(402).send({ response: 'response 402' });
24+
});
25+
26+
app.get('/403', (_req, res) => {
27+
res.status(403).send({ response: 'response 403' });
28+
});
29+
1830
app.get('/test/express', (_req, res) => {
1931
res.send({ response: 'response 1' });
2032
});

dev-packages/node-integration-tests/suites/express-v5/tracing/test.ts

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,16 @@ describe('express v5 tracing', () => {
8989
await runner.completed();
9090
});
9191

92-
test('ignores 404 routes by default', async () => {
92+
test.each(['/401', '/402', '/403', '/does-not-exist'])('ignores %s route by default', async (url: string) => {
9393
const runner = createRunner()
9494
.expect({
95-
// No transaction is sent for the 404 route
95+
// No transaction is sent for the 401, 402, 403, 404 routes
9696
transaction: {
9797
transaction: 'GET /',
9898
},
9999
})
100100
.start();
101-
runner.makeRequest('get', '/does-not-exist', { expectError: true });
101+
runner.makeRequest('get', url, { expectError: true });
102102
runner.makeRequest('get', '/');
103103
await runner.completed();
104104
});
@@ -284,33 +284,41 @@ describe('express v5 tracing', () => {
284284
'scenario-filterStatusCode.mjs',
285285
'instrument-filterStatusCode.mjs',
286286
(createRunner, test) => {
287-
// We opt-out of the default 404 filtering in order to test how 404 spans are handled
288-
test('handles 404 route correctly', async () => {
289-
const runner = createRunner()
290-
.expect({
291-
transaction: {
292-
transaction: 'GET /does-not-exist',
293-
contexts: {
294-
trace: {
295-
span_id: expect.stringMatching(/[a-f0-9]{16}/),
296-
trace_id: expect.stringMatching(/[a-f0-9]{32}/),
297-
data: {
298-
'http.response.status_code': 404,
299-
url: expect.stringMatching(/\/does-not-exist$/),
300-
'http.method': 'GET',
301-
'http.url': expect.stringMatching(/\/does-not-exist$/),
302-
'http.target': '/does-not-exist',
287+
// We opt-out of the default [401, 404] fitering in order to test how these spans are handled
288+
test.each([
289+
{ status_code: 401, url: '/401', status: 'unauthenticated' },
290+
{ status_code: 402, url: '/402', status: 'invalid_argument' },
291+
{ status_code: 403, url: '/403', status: 'permission_denied' },
292+
{ status_code: 404, url: '/does-not-exist', status: 'not_found' },
293+
])(
294+
'handles %s route correctly',
295+
async ({ status_code, url, status }: { status_code: number; url: string; status: string }) => {
296+
const runner = createRunner()
297+
.expect({
298+
transaction: {
299+
transaction: `GET ${url}`,
300+
contexts: {
301+
trace: {
302+
span_id: expect.stringMatching(/[a-f0-9]{16}/),
303+
trace_id: expect.stringMatching(/[a-f0-9]{32}/),
304+
data: {
305+
'http.response.status_code': status_code,
306+
url: expect.stringMatching(url),
307+
'http.method': 'GET',
308+
'http.url': expect.stringMatching(url),
309+
'http.target': url,
310+
},
311+
op: 'http.server',
312+
status,
303313
},
304-
op: 'http.server',
305-
status: 'not_found',
306314
},
307315
},
308-
},
309-
})
310-
.start();
311-
runner.makeRequest('get', '/does-not-exist', { expectError: true });
312-
await runner.completed();
313-
});
316+
})
317+
.start();
318+
runner.makeRequest('get', url, { expectError: true });
319+
await runner.completed();
320+
},
321+
);
314322

315323
test('filters defined status codes', async () => {
316324
const runner = createRunner()

dev-packages/node-integration-tests/suites/express/tracing/scenario-filterStatusCode.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ app.get('/', (_req, res) => {
88
res.send({ response: 'response 0' });
99
});
1010

11+
app.get('/401', (_req, res) => {
12+
res.status(401).send({ response: 'response 401' });
13+
});
14+
15+
app.get('/402', (_req, res) => {
16+
res.status(402).send({ response: 'response 402' });
17+
});
18+
19+
app.get('/403', (_req, res) => {
20+
res.status(403).send({ response: 'response 403' });
21+
});
22+
1123
app.get('/499', (_req, res) => {
1224
res.status(499).send({ response: 'response 499' });
1325
});

0 commit comments

Comments
 (0)