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' ;
112import { afterAll , expect } from 'vitest' ;
213import { conditionalTest } from '../../../utils' ;
314import { 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