-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathtest.ts
More file actions
109 lines (90 loc) · 3.89 KB
/
test.ts
File metadata and controls
109 lines (90 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import crypto from 'crypto';
import { afterAll, expect, test } from 'vitest';
import { conditionalTest } from '../../../utils';
import { cleanupChildProcesses, createRunner } from '../../../utils/runner';
afterAll(() => {
cleanupChildProcesses();
});
conditionalTest({ min: 22 })('light mode outgoing fetch', () => {
test('automatically propagates trace headers to outgoing fetch requests matching tracePropagationTargets', async () => {
const traceId = crypto.randomUUID().replace(/-/g, '');
const parentSpanId = traceId.substring(0, 16);
const runner = createRunner(__dirname, 'server.js').start();
const response = await runner.makeRequest<Record<string, { 'sentry-trace'?: string; baggage?: string }>>(
'get',
'/test-auto-propagation',
{
headers: {
'sentry-trace': `${traceId}-${parentSpanId}-1`,
baggage: `sentry-trace_id=${traceId},sentry-environment=test,sentry-public_key=public`,
},
},
);
// /api/v0 matches tracePropagationTargets - should have headers
expect(response?.['/api/v0']?.['sentry-trace']).toMatch(new RegExp(`^${traceId}-[a-f\\d]{16}-1$`));
expect(response?.['/api/v0']?.baggage).toContain(`sentry-trace_id=${traceId}`);
// /api/v1 matches tracePropagationTargets - should have headers
expect(response?.['/api/v1']?.['sentry-trace']).toMatch(new RegExp(`^${traceId}-[a-f\\d]{16}-1$`));
expect(response?.['/api/v1']?.baggage).toContain(`sentry-trace_id=${traceId}`);
// /api/v2 does NOT match tracePropagationTargets - should NOT have headers
expect(response?.['/api/v2']?.['sentry-trace']).toBeUndefined();
expect(response?.['/api/v2']?.baggage).toBeUndefined();
});
test('does not propagate headers or create breadcrumbs when tracing is suppressed', async () => {
const runner = createRunner(__dirname, 'server.js')
.expect({
event: event => {
const breadcrumbs = event.breadcrumbs || [];
const httpBreadcrumbs = breadcrumbs.filter(b => b.category === 'http');
// Only 1 breadcrumb for v0 - the suppressed v1 request should NOT create a breadcrumb
expect(httpBreadcrumbs.length).toBe(1);
expect(httpBreadcrumbs[0]?.data?.url).toContain('/api/v0');
},
})
.start();
const response = await runner.makeRequest<Record<string, { 'sentry-trace'?: string; baggage?: string }>>(
'get',
'/test-suppress-tracing',
);
// v0 (not suppressed) should have trace headers
expect(response?.['/api/v0']?.['sentry-trace']).toBeDefined();
expect(response?.['/api/v0']?.baggage).toBeDefined();
// v1 (suppressed) should NOT have trace headers
expect(response?.['/api/v1']?.['sentry-trace']).toBeUndefined();
expect(response?.['/api/v1']?.baggage).toBeUndefined();
await runner.completed();
});
test('creates breadcrumbs for outgoing fetch requests', async () => {
const runner = createRunner(__dirname, 'server.js')
.expect({
event: event => {
const breadcrumbs = event.breadcrumbs || [];
const httpBreadcrumbs = breadcrumbs.filter(b => b.category === 'http');
expect(httpBreadcrumbs.length).toBe(2);
expect(httpBreadcrumbs[0]).toEqual(
expect.objectContaining({
category: 'http',
type: 'http',
data: expect.objectContaining({
'http.method': 'GET',
status_code: 200,
}),
}),
);
expect(httpBreadcrumbs[1]).toEqual(
expect.objectContaining({
category: 'http',
type: 'http',
data: expect.objectContaining({
'http.method': 'GET',
status_code: 200,
}),
}),
);
},
})
.start();
await runner.makeRequest('get', '/test-breadcrumbs');
await runner.completed();
});
});