Skip to content

Commit 8a67452

Browse files
committed
test(node): Add tests for current DSC transaction name updating behavior
1 parent 8dd854f commit 8a67452

File tree

3 files changed

+197
-0
lines changed

3 files changed

+197
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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+
tracesSampleRate: 1.0,
8+
transport: loggingTransport,
9+
});
10+
11+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
12+
Sentry.startSpan(
13+
{ name: 'initial-name', attributes: { [Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' } },
14+
async span => {
15+
Sentry.captureMessage('message-1');
16+
17+
span.updateName('updated-name-1');
18+
span.setAttribute(Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
19+
20+
Sentry.captureMessage('message-2');
21+
22+
span.updateName('updated-name-2');
23+
span.setAttribute(Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');
24+
25+
Sentry.captureMessage('message-3');
26+
27+
span.end();
28+
},
29+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
tracesSampleRate: 1.0,
8+
transport: loggingTransport,
9+
});
10+
11+
import * as http from 'http';
12+
13+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
14+
Sentry.startSpan(
15+
{ name: 'initial-name', attributes: { [Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' } },
16+
async span => {
17+
await makeHttpRequest(`${process.env.SERVER_URL}/api/v0`);
18+
19+
span.updateName('updated-name-1');
20+
span.setAttribute(Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
21+
22+
await makeHttpRequest(`${process.env.SERVER_URL}/api/v1`);
23+
24+
span.updateName('updated-name-2');
25+
span.setAttribute(Sentry.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');
26+
await makeHttpRequest(`${process.env.SERVER_URL}/api/v2`);
27+
28+
span.end();
29+
},
30+
);
31+
32+
function makeHttpRequest(url: string): Promise<void> {
33+
return new Promise<void>(resolve => {
34+
http
35+
.request(url, httpRes => {
36+
httpRes.on('data', () => {
37+
// we don't care about data
38+
});
39+
httpRes.on('end', () => {
40+
resolve();
41+
});
42+
})
43+
.end();
44+
});
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import { createRunner } from '../../../utils/runner';
2+
import { createTestServer } from '../../../utils/server';
3+
4+
test('adds current transaction name to baggage when the txn name is high-quality', done => {
5+
expect.assertions(5);
6+
7+
let traceId: string | undefined;
8+
9+
createTestServer(done)
10+
.get('/api/v0', headers => {
11+
const baggageItems = getBaggageHeaderItems(headers);
12+
traceId = baggageItems.find(item => item.startsWith('sentry-trace_id='))?.split('=')[1] as string;
13+
14+
expect(traceId).toMatch(/^[0-9a-f]{32}$/);
15+
16+
expect(baggageItems).toEqual([
17+
'sentry-environment=production',
18+
'sentry-public_key=public',
19+
'sentry-release=1.0',
20+
'sentry-sample_rate=1',
21+
'sentry-sampled=true',
22+
`sentry-trace_id=${traceId}`,
23+
]);
24+
})
25+
.get('/api/v1', headers => {
26+
expect(getBaggageHeaderItems(headers)).toEqual([
27+
'sentry-environment=production',
28+
'sentry-public_key=public',
29+
'sentry-release=1.0',
30+
'sentry-sample_rate=1',
31+
'sentry-sampled=true',
32+
`sentry-trace_id=${traceId}`,
33+
'sentry-transaction=updated-name-1',
34+
]);
35+
})
36+
.get('/api/v2', headers => {
37+
expect(getBaggageHeaderItems(headers)).toEqual([
38+
'sentry-environment=production',
39+
'sentry-public_key=public',
40+
'sentry-release=1.0',
41+
'sentry-sample_rate=1',
42+
'sentry-sampled=true',
43+
`sentry-trace_id=${traceId}`,
44+
'sentry-transaction=updated-name-2',
45+
]);
46+
})
47+
.start()
48+
.then(([SERVER_URL, closeTestServer]) => {
49+
createRunner(__dirname, 'scenario-headers.ts')
50+
.withEnv({ SERVER_URL })
51+
.expect({
52+
transaction: {},
53+
})
54+
.start(closeTestServer);
55+
});
56+
});
57+
58+
test('adds current transaction name to trace envelope header when the txn name is high-quality', done => {
59+
expect.assertions(4);
60+
61+
createRunner(__dirname, 'scenario-events.ts')
62+
.expectHeader({
63+
event: {
64+
trace: {
65+
environment: 'production',
66+
public_key: 'public',
67+
release: '1.0',
68+
sample_rate: '1',
69+
sampled: 'true',
70+
trace_id: expect.any(String),
71+
},
72+
},
73+
})
74+
.expectHeader({
75+
event: {
76+
trace: {
77+
environment: 'production',
78+
public_key: 'public',
79+
release: '1.0',
80+
sample_rate: '1',
81+
sampled: 'true',
82+
trace_id: expect.any(String),
83+
transaction: 'updated-name-1',
84+
},
85+
},
86+
})
87+
.expectHeader({
88+
event: {
89+
trace: {
90+
environment: 'production',
91+
public_key: 'public',
92+
release: '1.0',
93+
sample_rate: '1',
94+
sampled: 'true',
95+
trace_id: expect.any(String),
96+
transaction: 'updated-name-2',
97+
},
98+
},
99+
})
100+
.expectHeader({
101+
transaction: {
102+
trace: {
103+
environment: 'production',
104+
public_key: 'public',
105+
release: '1.0',
106+
sample_rate: '1',
107+
sampled: 'true',
108+
trace_id: expect.any(String),
109+
transaction: 'updated-name-2',
110+
},
111+
},
112+
})
113+
.start(done);
114+
});
115+
116+
function getBaggageHeaderItems(headers: Record<string, string | string[] | undefined>) {
117+
const baggage = headers['baggage'] as string;
118+
const baggageItems = baggage
119+
.split(',')
120+
.map(b => b.trim())
121+
.sort();
122+
return baggageItems;
123+
}

0 commit comments

Comments
 (0)