Skip to content

Commit 9b41db2

Browse files
nicohrubeccodex
andcommitted
test(node): Port Tedious integration tests to span streaming
Co-Authored-By: GPT-6 <codex@openai.com>
1 parent ca05d2d commit 9b41db2

3 files changed

Lines changed: 81 additions & 147 deletions

File tree

‎dev-packages/node-integration-tests/suites/tracing/tedious/instrument-span-streaming.mjs‎

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

‎dev-packages/node-integration-tests/suites/tracing/tedious/instrument.mjs‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node';
22
import { loggingTransport } from '@sentry-internal/node-integration-tests';
33

44
Sentry.init({
5-
traceLifecycle: 'static',
65
dsn: 'https://public@dsn.ingest.sentry.io/1337',
76
release: '1.0',
87
tracesSampleRate: 1.0,
Lines changed: 81 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
import {
2+
DB_NAMESPACE,
3+
DB_QUERY_SUMMARY,
4+
DB_QUERY_TEXT,
5+
DB_SYSTEM_NAME,
6+
DB_USER,
7+
SENTRY_OP,
8+
SENTRY_ORIGIN,
9+
SERVER_ADDRESS,
10+
SERVER_PORT,
11+
} from '@sentry/conventions/attributes';
112
import { afterAll, expect } from 'vitest';
213
import { conditionalTest } from '../../../utils';
314
import { cleanupChildProcesses, createEsmAndCjsTests, describeWithDockerCompose } from '../../../utils/runner';
@@ -9,36 +20,36 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
920
cleanupChildProcesses();
1021
});
1122

12-
const dbSpan = (overrides: Record<string, unknown>) =>
23+
const dbSpan = (text: string, status = 'ok') =>
1324
expect.objectContaining({
14-
op: 'db',
15-
origin: ORIGIN,
16-
data: expect.objectContaining({
17-
'sentry.origin': ORIGIN,
18-
'sentry.op': 'db',
19-
'db.system.name': 'mssql',
20-
'db.namespace': 'master',
21-
'db.user': 'sa',
22-
'server.address': '127.0.0.1',
23-
'server.port': 1433,
25+
status,
26+
attributes: expect.objectContaining({
27+
[DB_QUERY_TEXT]: { type: 'string', value: text },
28+
[SENTRY_ORIGIN]: { type: 'string', value: ORIGIN },
29+
[SENTRY_OP]: { type: 'string', value: 'db' },
30+
[DB_SYSTEM_NAME]: { type: 'string', value: 'mssql' },
31+
[DB_NAMESPACE]: { type: 'string', value: 'master' },
32+
[DB_USER]: { type: 'string', value: 'sa' },
33+
[SERVER_ADDRESS]: { type: 'string', value: '127.0.0.1' },
34+
[SERVER_PORT]: { type: 'integer', value: 1433 },
2435
}),
25-
...overrides,
2636
});
2737

28-
const EXPECTED_TRANSACTION = {
29-
transaction: 'Test Transaction',
30-
spans: expect.arrayContaining([
31-
dbSpan({ description: 'SELECT ? + ? AS solution', status: 'ok' }),
32-
dbSpan({ description: 'SELECT ?; SELECT ?', status: 'ok' }),
33-
dbSpan({ description: 'select !', status: 'internal_error' }),
34-
dbSpan({ description: '[dbo].[test_proced]', status: 'ok' }),
35-
dbSpan({ description: 'INSERT INTO [dbo].[test_prepared] VALUES (@val1, @val2)', status: 'ok' }),
38+
const EXPECTED_SPANS = {
39+
items: expect.arrayContaining([
40+
dbSpan('SELECT ? + ? AS solution'),
41+
dbSpan('SELECT ?; SELECT ?'),
42+
dbSpan('select !', 'error'),
43+
dbSpan('[dbo].[test_proced]'),
44+
dbSpan('INSERT INTO [dbo].[test_prepared] VALUES (@val1, @val2)'),
3645
expect.objectContaining({
37-
description: 'execBulkLoad test_bulk master',
38-
op: 'db',
39-
origin: ORIGIN,
46+
name: 'execBulkLoad test_bulk',
4047
status: 'ok',
41-
data: expect.objectContaining({ 'db.sql.table': 'test_bulk' }),
48+
attributes: expect.objectContaining({
49+
'db.sql.table': { type: 'string', value: 'test_bulk' },
50+
[SENTRY_OP]: { type: 'string', value: 'db' },
51+
[SENTRY_ORIGIN]: { type: 'string', value: ORIGIN },
52+
}),
4253
}),
4354
]),
4455
};
@@ -47,9 +58,9 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
4758
test('should auto-instrument `tedious` package', async () => {
4859
await createTestRunner()
4960
.expect({
50-
transaction: transaction => {
51-
expect(transaction.transaction).toBe(EXPECTED_TRANSACTION.transaction);
52-
expect(transaction.spans).toEqual(EXPECTED_TRANSACTION.spans);
61+
span: container => {
62+
expect(container.items.find(span => span.is_segment)?.name).toBe('Test Transaction');
63+
expect(container.items).toEqual(EXPECTED_SPANS.items);
5364

5465
const CREATE_PROCEDURE =
5566
'CREATE OR ALTER PROCEDURE [dbo].[test_proced] @inputVal varchar(?), @outputCount int OUTPUT AS set @outputCount = LEN(@inputVal)';
@@ -65,26 +76,43 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
6576
const SELECT_STRING_LITERAL = 'SELECT c1, c2 FROM [dbo].[test_bulk] WHERE c2 = ?';
6677

6778
expect(
68-
(transaction.spans ?? [])
69-
.filter(span => span.origin === ORIGIN)
70-
.map(span => ({ name: span.description, text: span.data?.['db.query.text'] })),
79+
container.items
80+
.filter(span => span.attributes[SENTRY_ORIGIN]?.value === ORIGIN)
81+
.map(span => ({
82+
name: span.name,
83+
summary: span.attributes[DB_QUERY_SUMMARY]?.value,
84+
text: span.attributes[DB_QUERY_TEXT]?.value,
85+
})),
7186
).toEqual([
72-
{ name: 'SELECT ? + ? AS solution', text: 'SELECT ? + ? AS solution' },
73-
{ name: 'SELECT ?; SELECT ?', text: 'SELECT ?; SELECT ?' },
74-
{ name: 'select !', text: 'select !' },
75-
{ name: CREATE_PROCEDURE, text: CREATE_PROCEDURE },
76-
{ name: '[dbo].[test_proced]', text: '[dbo].[test_proced]' },
77-
{ name: CREATE_PREPARED_TABLE, text: CREATE_PREPARED_TABLE },
78-
{ name: INSERT_PREPARED, text: INSERT_PREPARED },
79-
{ name: INSERT_PREPARED, text: INSERT_PREPARED },
80-
{ name: CREATE_BULK_TABLE, text: CREATE_BULK_TABLE },
81-
{ name: 'execBulkLoad test_bulk master', text: undefined },
82-
{ name: INSERT_BULK, text: INSERT_BULK },
83-
{ name: SELECT_PREPARED, text: SELECT_PREPARED },
84-
{ name: SELECT_JOIN, text: SELECT_JOIN },
85-
{ name: SELECT_INLINE_LITERAL, text: SELECT_INLINE_LITERAL },
86-
{ name: SELECT_PARAMETERIZED, text: SELECT_PARAMETERIZED },
87-
{ name: SELECT_STRING_LITERAL, text: SELECT_STRING_LITERAL },
87+
{ name: 'SELECT', summary: 'SELECT', text: 'SELECT ? + ? AS solution' },
88+
{ name: 'SELECT', summary: 'SELECT', text: 'SELECT ?; SELECT ?' },
89+
{ name: 'select', summary: 'select', text: 'select !' },
90+
{ name: 'CREATE', summary: 'CREATE', text: CREATE_PROCEDURE },
91+
{ name: 'callProcedure [dbo].[test_proced]', summary: undefined, text: '[dbo].[test_proced]' },
92+
{ name: 'if', summary: 'if', text: CREATE_PREPARED_TABLE },
93+
{ name: 'INSERT [dbo].[test_prepared]', summary: 'INSERT [dbo].[test_prepared]', text: INSERT_PREPARED },
94+
{ name: 'INSERT [dbo].[test_prepared]', summary: 'INSERT [dbo].[test_prepared]', text: INSERT_PREPARED },
95+
{ name: 'if', summary: 'if', text: CREATE_BULK_TABLE },
96+
{ name: 'insert', summary: 'insert', text: INSERT_BULK },
97+
{ name: 'execBulkLoad test_bulk', summary: undefined, text: undefined },
98+
{ name: 'SELECT [dbo].[test_prepared]', summary: 'SELECT [dbo].[test_prepared]', text: SELECT_PREPARED },
99+
{
100+
// TODO: (check if correct) Both sides of the join survive into the summary.
101+
name: 'SELECT [dbo].[test_prepared] [dbo].[test_bulk]',
102+
summary: 'SELECT [dbo].[test_prepared] [dbo].[test_bulk]',
103+
text: SELECT_JOIN,
104+
},
105+
{
106+
name: 'SELECT [dbo].[test_prepared]',
107+
summary: 'SELECT [dbo].[test_prepared]',
108+
text: SELECT_INLINE_LITERAL,
109+
},
110+
{
111+
name: 'SELECT [dbo].[test_prepared]',
112+
summary: 'SELECT [dbo].[test_prepared]',
113+
text: SELECT_PARAMETERIZED,
114+
},
115+
{ name: 'SELECT [dbo].[test_bulk]', summary: 'SELECT [dbo].[test_bulk]', text: SELECT_STRING_LITERAL },
88116
]);
89117
},
90118
})
@@ -98,13 +126,13 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
98126
createEsmAndCjsTests(
99127
__dirname,
100128
'scenario.mjs',
101-
'instrument-span-streaming.mjs',
129+
'instrument.mjs',
102130
(createTestRunner, test) => {
103131
test('should auto-instrument `tedious` package', async () => {
104132
await createTestRunner()
105133
.expect({
106134
span: container => {
107-
const dbSpans = container.items.filter(item => item.attributes['sentry.origin']?.value === ORIGIN);
135+
const dbSpans = container.items.filter(item => item.attributes[SENTRY_ORIGIN]?.value === ORIGIN);
108136

109137
expect(dbSpans.map(span => span.name)).toEqual(
110138
expect.arrayContaining([
@@ -117,11 +145,11 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
117145
);
118146
expect(dbSpans.find(span => span.name === 'select')?.status).toBe('error');
119147
expect(dbSpans[0]?.attributes).toMatchObject({
120-
'db.system.name': { value: 'mssql' },
121-
'db.namespace': { value: 'master' },
122-
'db.user': { value: 'sa' },
123-
'server.address': { value: '127.0.0.1' },
124-
'server.port': { value: 1433 },
148+
[DB_SYSTEM_NAME]: { value: 'mssql' },
149+
[DB_NAMESPACE]: { value: 'master' },
150+
[DB_USER]: { value: 'sa' },
151+
[SERVER_ADDRESS]: { value: '127.0.0.1' },
152+
[SERVER_PORT]: { value: 1433 },
125153
});
126154
},
127155
})
@@ -132,87 +160,4 @@ describeWithDockerCompose('tedious auto instrumentation', { workingDirectory: [_
132160
{ additionalDependencies: { tedious: '^20' } },
133161
);
134162
});
135-
136-
createEsmAndCjsTests(__dirname, 'scenario.mjs', 'instrument-span-streaming.mjs', (createTestRunner, test) => {
137-
test('should name spans after the query summary with span streaming', async () => {
138-
await createTestRunner()
139-
.expect({
140-
span: container => {
141-
const dbSpans = container.items.filter(item => item.attributes['sentry.origin']?.value === ORIGIN);
142-
143-
expect(
144-
dbSpans.map(span => ({
145-
name: span.name,
146-
summary: span.attributes['db.query.summary']?.value,
147-
text: span.attributes['db.query.text']?.value,
148-
})),
149-
).toEqual([
150-
{ name: 'SELECT', summary: 'SELECT', text: 'SELECT ? + ? AS solution' },
151-
{ name: 'SELECT', summary: 'SELECT', text: 'SELECT ?; SELECT ?' },
152-
{ name: 'select', summary: 'select', text: 'select !' },
153-
{
154-
name: 'CREATE',
155-
summary: 'CREATE',
156-
text: 'CREATE OR ALTER PROCEDURE [dbo].[test_proced] @inputVal varchar(?), @outputCount int OUTPUT AS set @outputCount = LEN(@inputVal)',
157-
},
158-
{ name: 'callProcedure [dbo].[test_proced]', summary: undefined, text: '[dbo].[test_proced]' },
159-
{
160-
name: 'if',
161-
summary: 'if',
162-
text: 'if object_id(?) is null CREATE TABLE [dbo].[test_prepared] (c1 int, c2 int)',
163-
},
164-
{
165-
name: 'INSERT [dbo].[test_prepared]',
166-
summary: 'INSERT [dbo].[test_prepared]',
167-
text: 'INSERT INTO [dbo].[test_prepared] VALUES (@val1, @val2)',
168-
},
169-
{
170-
name: 'INSERT [dbo].[test_prepared]',
171-
summary: 'INSERT [dbo].[test_prepared]',
172-
text: 'INSERT INTO [dbo].[test_prepared] VALUES (@val1, @val2)',
173-
},
174-
{
175-
name: 'if',
176-
summary: 'if',
177-
text: 'if object_id(?) is null CREATE TABLE [dbo].[test_bulk] (c1 int, c2 varchar(?))',
178-
},
179-
{
180-
name: 'insert',
181-
summary: 'insert',
182-
text: 'insert bulk test_bulk([c1] int, [c2] nvarchar(?)) WITH (KEEP_NULLS)',
183-
},
184-
{ name: 'execBulkLoad test_bulk', summary: undefined, text: undefined },
185-
{
186-
name: 'SELECT [dbo].[test_prepared]',
187-
summary: 'SELECT [dbo].[test_prepared]',
188-
text: 'SELECT c1, c2 FROM [dbo].[test_prepared]',
189-
},
190-
{
191-
// TODO: (check if correct) Both sides of the join survive into the summary.
192-
name: 'SELECT [dbo].[test_prepared] [dbo].[test_bulk]',
193-
summary: 'SELECT [dbo].[test_prepared] [dbo].[test_bulk]',
194-
text: 'SELECT p.c1 FROM [dbo].[test_prepared] p INNER JOIN [dbo].[test_bulk] b ON p.c1 = b.c1',
195-
},
196-
{
197-
name: 'SELECT [dbo].[test_prepared]',
198-
summary: 'SELECT [dbo].[test_prepared]',
199-
text: 'SELECT c1, c2 FROM [dbo].[test_prepared] WHERE c1 = ?',
200-
},
201-
{
202-
name: 'SELECT [dbo].[test_prepared]',
203-
summary: 'SELECT [dbo].[test_prepared]',
204-
text: 'SELECT c1, c2 FROM [dbo].[test_prepared] WHERE c1 = @c1',
205-
},
206-
{
207-
name: 'SELECT [dbo].[test_bulk]',
208-
summary: 'SELECT [dbo].[test_bulk]',
209-
text: 'SELECT c1, c2 FROM [dbo].[test_bulk] WHERE c2 = ?',
210-
},
211-
]);
212-
},
213-
})
214-
.start()
215-
.completed();
216-
});
217-
});
218163
});

0 commit comments

Comments
 (0)