1+ import type { TransactionEvent } from '@sentry/core' ;
12import { MongoMemoryServer } from 'mongodb-memory-server-global' ;
23import { afterAll , beforeAll , describe , expect , test } from 'vitest' ;
4+ import { assertSentryTransaction } from '../../../utils/assertions' ;
35import { cleanupChildProcesses , createRunner } from '../../../utils/runner' ;
46
57describe ( 'MongoDB experimental Test' , ( ) => {
@@ -17,160 +19,125 @@ describe('MongoDB experimental Test', () => {
1719 cleanupChildProcesses ( ) ;
1820 } ) ;
1921
20- const EXPECTED_TRANSACTION = {
21- transaction : 'Test Transaction' ,
22- spans : [
23- expect . objectContaining ( {
24- data : {
25- 'sentry.origin' : 'auto.db.otel.mongo' ,
26- 'sentry.op' : 'db' ,
27- 'db.system' : 'mongodb' ,
28- 'db.name' : 'admin' ,
29- 'db.mongodb.collection' : '$cmd' ,
30- 'db.operation' : 'isMaster' ,
31- 'db.connection_string' : expect . any ( String ) ,
32- 'net.peer.name' : expect . any ( String ) ,
33- 'net.peer.port' : expect . any ( Number ) ,
34- 'db.statement' :
35- '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
36- 'otel.kind' : 'CLIENT' ,
37- } ,
38- description :
39- '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
40- op : 'db' ,
41- origin : 'auto.db.otel.mongo' ,
42- } ) ,
43- expect . objectContaining ( {
44- data : {
45- 'sentry.origin' : 'auto.db.otel.mongo' ,
46- 'sentry.op' : 'db' ,
47- 'db.system' : 'mongodb' ,
48- 'db.name' : 'admin' ,
49- 'db.mongodb.collection' : '$cmd' ,
50- 'db.operation' : 'isMaster' ,
51- 'db.connection_string' : expect . any ( String ) ,
52- 'net.peer.name' : expect . any ( String ) ,
53- 'net.peer.port' : expect . any ( Number ) ,
54- 'db.statement' :
55- '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
56- 'otel.kind' : 'CLIENT' ,
57- } ,
58- description :
59- '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
60- op : 'db' ,
61- origin : 'auto.db.otel.mongo' ,
62- } ) ,
63- expect . objectContaining ( {
64- data : {
65- 'sentry.origin' : 'auto.db.otel.mongo' ,
66- 'sentry.op' : 'db' ,
67- 'db.system' : 'mongodb' ,
68- 'db.name' : 'admin' ,
69- 'db.mongodb.collection' : 'movies' ,
70- 'db.operation' : 'insert' ,
71- 'db.connection_string' : expect . any ( String ) ,
72- 'net.peer.name' : expect . any ( String ) ,
73- 'net.peer.port' : expect . any ( Number ) ,
74- 'db.statement' : '{"title":"?","_id":{"_bsontype":"?","id":"?"}}' ,
75- 'otel.kind' : 'CLIENT' ,
76- } ,
77- description : '{"title":"?","_id":{"_bsontype":"?","id":"?"}}' ,
78- op : 'db' ,
79- origin : 'auto.db.otel.mongo' ,
80- } ) ,
81- expect . objectContaining ( {
82- data : {
83- 'sentry.origin' : 'auto.db.otel.mongo' ,
84- 'sentry.op' : 'db' ,
85- 'db.system' : 'mongodb' ,
86- 'db.name' : 'admin' ,
87- 'db.mongodb.collection' : 'movies' ,
88- 'db.operation' : 'find' ,
89- 'db.connection_string' : expect . any ( String ) ,
90- 'net.peer.name' : expect . any ( String ) ,
91- 'net.peer.port' : expect . any ( Number ) ,
92- 'db.statement' : '{"title":"?"}' ,
93- 'otel.kind' : 'CLIENT' ,
94- } ,
95- description : '{"title":"?"}' ,
96- op : 'db' ,
97- origin : 'auto.db.otel.mongo' ,
98- } ) ,
99- expect . objectContaining ( {
100- data : {
101- 'sentry.origin' : 'auto.db.otel.mongo' ,
102- 'sentry.op' : 'db' ,
103- 'db.system' : 'mongodb' ,
104- 'db.name' : 'admin' ,
105- 'db.mongodb.collection' : 'movies' ,
106- 'db.operation' : 'update' ,
107- 'db.connection_string' : expect . any ( String ) ,
108- 'net.peer.name' : expect . any ( String ) ,
109- 'net.peer.port' : expect . any ( Number ) ,
110- 'db.statement' : '{"title":"?"}' ,
111- 'otel.kind' : 'CLIENT' ,
112- } ,
113- description : '{"title":"?"}' ,
114- op : 'db' ,
115- origin : 'auto.db.otel.mongo' ,
116- } ) ,
117- expect . objectContaining ( {
118- data : {
119- 'sentry.origin' : 'auto.db.otel.mongo' ,
120- 'sentry.op' : 'db' ,
121- 'db.system' : 'mongodb' ,
122- 'db.name' : 'admin' ,
123- 'db.mongodb.collection' : 'movies' ,
124- 'db.operation' : 'find' ,
125- 'db.connection_string' : expect . any ( String ) ,
126- 'net.peer.name' : expect . any ( String ) ,
127- 'net.peer.port' : expect . any ( Number ) ,
128- 'db.statement' : '{"title":"?"}' ,
129- 'otel.kind' : 'CLIENT' ,
130- } ,
131- description : '{"title":"?"}' ,
132- op : 'db' ,
133- origin : 'auto.db.otel.mongo' ,
134- } ) ,
135- expect . objectContaining ( {
136- data : {
137- 'sentry.origin' : 'auto.db.otel.mongo' ,
138- 'sentry.op' : 'db' ,
139- 'db.system' : 'mongodb' ,
140- 'db.name' : 'admin' ,
141- 'db.mongodb.collection' : 'movies' ,
142- 'db.operation' : 'find' ,
143- 'db.connection_string' : expect . any ( String ) ,
144- 'net.peer.name' : expect . any ( String ) ,
145- 'net.peer.port' : expect . any ( Number ) ,
146- 'db.statement' : '{"title":"?"}' ,
147- 'otel.kind' : 'CLIENT' ,
148- } ,
149- description : '{"title":"?"}' ,
150- op : 'db' ,
151- origin : 'auto.db.otel.mongo' ,
152- } ) ,
153- expect . objectContaining ( {
154- data : {
155- 'sentry.origin' : 'auto.db.otel.mongo' ,
156- 'sentry.op' : 'db' ,
157- 'db.system' : 'mongodb' ,
158- 'db.name' : 'admin' ,
159- 'db.mongodb.collection' : '$cmd' ,
160- 'db.connection_string' : expect . any ( String ) ,
161- 'net.peer.name' : expect . any ( String ) ,
162- 'net.peer.port' : expect . any ( Number ) ,
163- 'db.statement' : '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}' ,
164- 'otel.kind' : 'CLIENT' ,
165- } ,
166- description : '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}' ,
167- op : 'db' ,
168- origin : 'auto.db.otel.mongo' ,
169- } ) ,
170- ] ,
171- } ;
22+ const SPAN_FIND_MATCHER = expect . objectContaining ( {
23+ data : {
24+ 'sentry.origin' : 'auto.db.otel.mongo' ,
25+ 'sentry.op' : 'db' ,
26+ 'db.system' : 'mongodb' ,
27+ 'db.name' : 'admin' ,
28+ 'db.mongodb.collection' : 'movies' ,
29+ 'db.operation' : 'find' ,
30+ 'db.connection_string' : expect . any ( String ) ,
31+ 'net.peer.name' : expect . any ( String ) ,
32+ 'net.peer.port' : expect . any ( Number ) ,
33+ 'db.statement' : '{"title":"?"}' ,
34+ 'otel.kind' : 'CLIENT' ,
35+ } ,
36+ description : '{"title":"?"}' ,
37+ op : 'db' ,
38+ origin : 'auto.db.otel.mongo' ,
39+ } ) ;
40+
41+ const SPAN_INSERT_MATCHER = expect . objectContaining ( {
42+ data : {
43+ 'sentry.origin' : 'auto.db.otel.mongo' ,
44+ 'sentry.op' : 'db' ,
45+ 'db.system' : 'mongodb' ,
46+ 'db.name' : 'admin' ,
47+ 'db.mongodb.collection' : 'movies' ,
48+ 'db.operation' : 'insert' ,
49+ 'db.connection_string' : expect . any ( String ) ,
50+ 'net.peer.name' : expect . any ( String ) ,
51+ 'net.peer.port' : expect . any ( Number ) ,
52+ 'db.statement' : '{"title":"?","_id":{"_bsontype":"?","id":"?"}}' ,
53+ 'otel.kind' : 'CLIENT' ,
54+ } ,
55+ description : '{"title":"?","_id":{"_bsontype":"?","id":"?"}}' ,
56+ op : 'db' ,
57+ origin : 'auto.db.otel.mongo' ,
58+ } ) ;
59+
60+ const SPAN_ISMASTER_MATCHER = expect . objectContaining ( {
61+ data : {
62+ 'sentry.origin' : 'auto.db.otel.mongo' ,
63+ 'sentry.op' : 'db' ,
64+ 'db.system' : 'mongodb' ,
65+ 'db.name' : 'admin' ,
66+ 'db.mongodb.collection' : '$cmd' ,
67+ 'db.operation' : 'isMaster' ,
68+ 'db.connection_string' : expect . any ( String ) ,
69+ 'net.peer.name' : expect . any ( String ) ,
70+ 'net.peer.port' : expect . any ( Number ) ,
71+ 'db.statement' :
72+ '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
73+ 'otel.kind' : 'CLIENT' ,
74+ } ,
75+ description :
76+ '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}' ,
77+ op : 'db' ,
78+ origin : 'auto.db.otel.mongo' ,
79+ } ) ;
80+
81+ const SPAN_UPDATE_MATCHER = expect . objectContaining ( {
82+ data : {
83+ 'sentry.origin' : 'auto.db.otel.mongo' ,
84+ 'sentry.op' : 'db' ,
85+ 'db.system' : 'mongodb' ,
86+ 'db.name' : 'admin' ,
87+ 'db.mongodb.collection' : 'movies' ,
88+ 'db.operation' : 'update' ,
89+ 'db.connection_string' : expect . any ( String ) ,
90+ 'net.peer.name' : expect . any ( String ) ,
91+ 'net.peer.port' : expect . any ( Number ) ,
92+ 'db.statement' : '{"title":"?"}' ,
93+ 'otel.kind' : 'CLIENT' ,
94+ } ,
95+ description : '{"title":"?"}' ,
96+ op : 'db' ,
97+ origin : 'auto.db.otel.mongo' ,
98+ } ) ;
99+
100+ const SPAN_ENDSESSIONS_MATCHER = expect . objectContaining ( {
101+ data : {
102+ 'sentry.origin' : 'auto.db.otel.mongo' ,
103+ 'sentry.op' : 'db' ,
104+ 'db.system' : 'mongodb' ,
105+ 'db.name' : 'admin' ,
106+ 'db.mongodb.collection' : '$cmd' ,
107+ 'db.connection_string' : expect . any ( String ) ,
108+ 'net.peer.name' : expect . any ( String ) ,
109+ 'net.peer.port' : expect . any ( Number ) ,
110+ 'db.statement' : '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}' ,
111+ 'otel.kind' : 'CLIENT' ,
112+ } ,
113+ description : '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}' ,
114+ op : 'db' ,
115+ origin : 'auto.db.otel.mongo' ,
116+ } ) ;
172117
173118 test ( 'CJS - should auto-instrument `mongodb` package.' , async ( ) => {
174- await createRunner ( __dirname , 'scenario.js' ) . expect ( { transaction : EXPECTED_TRANSACTION } ) . start ( ) . completed ( ) ;
119+ await createRunner ( __dirname , 'scenario.js' )
120+ . expect ( {
121+ transaction : ( txn : TransactionEvent ) => {
122+ assertSentryTransaction ( txn , { transaction : 'Test Transaction' } ) ;
123+ const spans = txn . spans || [ ] ;
124+ expect ( spans ) . toHaveLength ( 8 ) ;
125+
126+ expect ( spans ) . toContainEqual ( SPAN_FIND_MATCHER ) ;
127+ expect ( spans ) . toContainEqual ( SPAN_INSERT_MATCHER ) ;
128+ expect ( spans ) . toContainEqual ( SPAN_ISMASTER_MATCHER ) ;
129+ expect ( spans ) . toContainEqual ( SPAN_UPDATE_MATCHER ) ;
130+ expect ( spans ) . toContainEqual ( SPAN_ENDSESSIONS_MATCHER ) ;
131+
132+ // Ensure duplicate spans are correctly there
133+ const findSpans = spans . filter ( span => span . data [ 'db.operation' ] === 'find' ) ;
134+ expect ( findSpans ) . toHaveLength ( 3 ) ;
135+
136+ const isMasterSpans = spans . filter ( span => span . data [ 'db.operation' ] === 'isMaster' ) ;
137+ expect ( isMasterSpans ) . toHaveLength ( 2 ) ;
138+ } ,
139+ } )
140+ . start ( )
141+ . completed ( ) ;
175142 } ) ;
176143} ) ;
0 commit comments