Skip to content

Commit 92b0e36

Browse files
authored
test(node): Unflake mongodb test (#20662)
Another attempt to fix #20653. This time, I simply changed it to allow the same spans but in any order, not dropping anything we asserted on before. If/when we rewrite/streamline the mongodb instrumentation, we need to revisit which of these things we actually care about.
1 parent 0012645 commit 92b0e36

1 file changed

Lines changed: 120 additions & 153 deletions

File tree

  • dev-packages/node-integration-tests/suites/tracing/mongodb
Lines changed: 120 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import type { TransactionEvent } from '@sentry/core';
12
import { MongoMemoryServer } from 'mongodb-memory-server-global';
23
import { afterAll, beforeAll, describe, expect, test } from 'vitest';
4+
import { assertSentryTransaction } from '../../../utils/assertions';
35
import { cleanupChildProcesses, createRunner } from '../../../utils/runner';
46

57
describe('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

Comments
 (0)