From 12c92553089291e93c7af03e3bbdaff08fe73d03 Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Tue, 5 May 2026 09:54:34 +0200 Subject: [PATCH 1/2] test(node): Unflake mongodb test --- .../suites/tracing/mongodb/test.ts | 310 +++++++++--------- 1 file changed, 159 insertions(+), 151 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts b/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts index 8c16e8b36133..425492b7850c 100644 --- a/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts @@ -1,5 +1,7 @@ +import type { TransactionEvent } from '@sentry/core'; import { MongoMemoryServer } from 'mongodb-memory-server-global'; import { afterAll, beforeAll, describe, expect, test } from 'vitest'; +import { assertSentryTransaction } from '../../../utils/assertions'; import { cleanupChildProcesses, createRunner } from '../../../utils/runner'; describe('MongoDB experimental Test', () => { @@ -17,160 +19,166 @@ describe('MongoDB experimental Test', () => { cleanupChildProcesses(); }); - const EXPECTED_TRANSACTION = { - transaction: 'Test Transaction', - spans: [ - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.operation': 'isMaster', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': - '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - 'otel.kind': 'CLIENT', - }, - description: + const EXPECTED_SPAN_MATCHERS = [ + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': '$cmd', + 'db.operation': 'isMaster', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.operation': 'isMaster', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': - '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - 'otel.kind': 'CLIENT', - }, - description: + 'otel.kind': 'CLIENT', + }, + description: + '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': '$cmd', + 'db.operation': 'isMaster', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'insert', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'update', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', - 'otel.kind': 'CLIENT', - }, - description: '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - ], - }; + 'otel.kind': 'CLIENT', + }, + description: + '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'insert', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'find', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'update', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'find', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'find', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': '$cmd', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', + 'otel.kind': 'CLIENT', + }, + description: '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', + op: 'db', + origin: 'auto.db.otel.mongo', + }), + ]; test('CJS - should auto-instrument `mongodb` package.', async () => { - await createRunner(__dirname, 'scenario.js').expect({ transaction: EXPECTED_TRANSACTION }).start().completed(); + await createRunner(__dirname, 'scenario.js') + .expect({ + transaction: (txn: TransactionEvent) => { + assertSentryTransaction(txn, { transaction: 'Test Transaction' }); + expect(txn.spans).toHaveLength(EXPECTED_SPAN_MATCHERS.length); + expect(txn.spans).toEqual(expect.arrayContaining(EXPECTED_SPAN_MATCHERS)); + }, + }) + .start() + .completed(); }); }); From 1cc21823be8cd688c62d9e0aa18d0fe57892dece Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Tue, 5 May 2026 11:54:58 +0200 Subject: [PATCH 2/2] properly test for duplicates --- .../suites/tracing/mongodb/test.ts | 259 ++++++++---------- 1 file changed, 109 insertions(+), 150 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts b/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts index 425492b7850c..13fb7a12fa85 100644 --- a/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/mongodb/test.ts @@ -19,163 +19,122 @@ describe('MongoDB experimental Test', () => { cleanupChildProcesses(); }); - const EXPECTED_SPAN_MATCHERS = [ - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.operation': 'isMaster', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': - '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - 'otel.kind': 'CLIENT', - }, - description: - '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.operation': 'isMaster', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': - '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - 'otel.kind': 'CLIENT', - }, - description: + const SPAN_FIND_MATCHER = expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'find', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }); + + const SPAN_INSERT_MATCHER = expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'insert', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', + op: 'db', + origin: 'auto.db.otel.mongo', + }); + + const SPAN_ISMASTER_MATCHER = expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': '$cmd', + 'db.operation': 'isMaster', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'insert', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?","_id":{"_bsontype":"?","id":"?"}}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'update', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': 'movies', - 'db.operation': 'find', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"title":"?"}', - 'otel.kind': 'CLIENT', - }, - description: '{"title":"?"}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - expect.objectContaining({ - data: { - 'sentry.origin': 'auto.db.otel.mongo', - 'sentry.op': 'db', - 'db.system': 'mongodb', - 'db.name': 'admin', - 'db.mongodb.collection': '$cmd', - 'db.connection_string': expect.any(String), - 'net.peer.name': expect.any(String), - 'net.peer.port': expect.any(Number), - 'db.statement': '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', - 'otel.kind': 'CLIENT', - }, - description: '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', - op: 'db', - origin: 'auto.db.otel.mongo', - }), - ]; + 'otel.kind': 'CLIENT', + }, + description: + '{"ismaster":"?","client":{"driver":{"name":"?","version":"?"},"os":{"type":"?","name":"?","architecture":"?","version":"?"},"platform":"?"},"compression":[],"helloOk":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }); + + const SPAN_UPDATE_MATCHER = expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': 'movies', + 'db.operation': 'update', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"title":"?"}', + 'otel.kind': 'CLIENT', + }, + description: '{"title":"?"}', + op: 'db', + origin: 'auto.db.otel.mongo', + }); + + const SPAN_ENDSESSIONS_MATCHER = expect.objectContaining({ + data: { + 'sentry.origin': 'auto.db.otel.mongo', + 'sentry.op': 'db', + 'db.system': 'mongodb', + 'db.name': 'admin', + 'db.mongodb.collection': '$cmd', + 'db.connection_string': expect.any(String), + 'net.peer.name': expect.any(String), + 'net.peer.port': expect.any(Number), + 'db.statement': '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', + 'otel.kind': 'CLIENT', + }, + description: '{"endSessions":[{"id":{"_bsontype":"?","sub_type":"?","position":"?","buffer":"?"}}]}', + op: 'db', + origin: 'auto.db.otel.mongo', + }); test('CJS - should auto-instrument `mongodb` package.', async () => { await createRunner(__dirname, 'scenario.js') .expect({ transaction: (txn: TransactionEvent) => { assertSentryTransaction(txn, { transaction: 'Test Transaction' }); - expect(txn.spans).toHaveLength(EXPECTED_SPAN_MATCHERS.length); - expect(txn.spans).toEqual(expect.arrayContaining(EXPECTED_SPAN_MATCHERS)); + const spans = txn.spans || []; + expect(spans).toHaveLength(8); + + expect(spans).toContainEqual(SPAN_FIND_MATCHER); + expect(spans).toContainEqual(SPAN_INSERT_MATCHER); + expect(spans).toContainEqual(SPAN_ISMASTER_MATCHER); + expect(spans).toContainEqual(SPAN_UPDATE_MATCHER); + expect(spans).toContainEqual(SPAN_ENDSESSIONS_MATCHER); + + // Ensure duplicate spans are correctly there + const findSpans = spans.filter(span => span.data['db.operation'] === 'find'); + expect(findSpans).toHaveLength(3); + + const isMasterSpans = spans.filter(span => span.data['db.operation'] === 'isMaster'); + expect(isMasterSpans).toHaveLength(2); }, }) .start()