From e70abfdc52676ad07b164d15c54d40e505e4891b Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 17 Jan 2024 15:01:10 -0500 Subject: [PATCH 1/2] fix(tracing): Gate mongo operation span data behind sendDefaultPii --- .../auto-instrument/mongodb/test.ts | 6 ----- .../tracing/auto-instrument/mongodb/test.ts | 6 ----- .../src/node/integrations/mongo.ts | 15 ++++++++--- .../test/integrations/node/mongo.test.ts | 25 ++++++++++++++++--- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts b/dev-packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts index 7c65cc25df25..d2ce56f314ee 100644 --- a/dev-packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts @@ -34,7 +34,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'insertOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.doc': '{"title":"Rick and Morty"}', }, description: 'insertOne', op: 'db', @@ -45,7 +44,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'findOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"Back to the Future"}', }, description: 'findOne', op: 'db', @@ -56,8 +54,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'updateOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.filter': '{"title":"Back to the Future"}', - 'db.mongodb.update': '{"$set":{"title":"South Park"}}', }, description: 'updateOne', op: 'db', @@ -68,7 +64,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'findOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"South Park"}', }, description: 'findOne', op: 'db', @@ -79,7 +74,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'find', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"South Park"}', }, description: 'find', op: 'db', diff --git a/dev-packages/node-integration-tests/suites/tracing/auto-instrument/mongodb/test.ts b/dev-packages/node-integration-tests/suites/tracing/auto-instrument/mongodb/test.ts index 7c65cc25df25..d2ce56f314ee 100644 --- a/dev-packages/node-integration-tests/suites/tracing/auto-instrument/mongodb/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/auto-instrument/mongodb/test.ts @@ -34,7 +34,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'insertOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.doc': '{"title":"Rick and Morty"}', }, description: 'insertOne', op: 'db', @@ -45,7 +44,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'findOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"Back to the Future"}', }, description: 'findOne', op: 'db', @@ -56,8 +54,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'updateOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.filter': '{"title":"Back to the Future"}', - 'db.mongodb.update': '{"$set":{"title":"South Park"}}', }, description: 'updateOne', op: 'db', @@ -68,7 +64,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'findOne', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"South Park"}', }, description: 'findOne', op: 'db', @@ -79,7 +74,6 @@ conditionalTest({ min: 12 })('MongoDB Test', () => { 'db.name': 'admin', 'db.operation': 'find', 'db.mongodb.collection': 'movies', - 'db.mongodb.query': '{"title":"South Park"}', }, description: 'find', op: 'db', diff --git a/packages/tracing-internal/src/node/integrations/mongo.ts b/packages/tracing-internal/src/node/integrations/mongo.ts index 61001b94c8cd..01f7eeaf7c63 100644 --- a/packages/tracing-internal/src/node/integrations/mongo.ts +++ b/packages/tracing-internal/src/node/integrations/mongo.ts @@ -1,4 +1,4 @@ -import type { Hub } from '@sentry/core'; +import { Hub, getClient } from '@sentry/core'; import type { EventProcessor, SpanContext } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -175,15 +175,21 @@ export class Mongo implements LazyLoadedIntegration { return function (this: unknown, ...args: unknown[]) { const lastArg = args[args.length - 1]; // eslint-disable-next-line deprecation/deprecation - const scope = getCurrentHub().getScope(); + const hub = getCurrentHub(); + // eslint-disable-next-line deprecation/deprecation + const scope = hub.getScope(); + // eslint-disable-next-line deprecation/deprecation + const client = hub.getClient(); // eslint-disable-next-line deprecation/deprecation const parentSpan = scope.getSpan(); + const sendDefaultPii = client?.getOptions().sendDefaultPii; + // Check if the operation was passed a callback. (mapReduce requires a different check, as // its (non-callback) arguments can also be functions.) if (typeof lastArg !== 'function' || (operation === 'mapReduce' && args.length === 2)) { // eslint-disable-next-line deprecation/deprecation - const span = parentSpan?.startChild(getSpanContext(this, operation, args)); + const span = parentSpan?.startChild(getSpanContext(this, operation, args, sendDefaultPii)); const maybePromiseOrCursor = orig.call(this, ...args); if (isThenable(maybePromiseOrCursor)) { @@ -232,6 +238,7 @@ export class Mongo implements LazyLoadedIntegration { collection: MongoCollection, operation: Operation, args: unknown[], + sendDefaultPii: boolean | undefined = false, ): SpanContext { const data: { [key: string]: string } = { 'db.system': 'mongodb', @@ -254,7 +261,7 @@ export class Mongo implements LazyLoadedIntegration { ? this._describeOperations.includes(operation) : this._describeOperations; - if (!signature || !shouldDescribe) { + if (!signature || !shouldDescribe || !sendDefaultPii) { return spanContext; } diff --git a/packages/tracing/test/integrations/node/mongo.test.ts b/packages/tracing/test/integrations/node/mongo.test.ts index e2ab62ab2e04..8caa5f35750f 100644 --- a/packages/tracing/test/integrations/node/mongo.test.ts +++ b/packages/tracing/test/integrations/node/mongo.test.ts @@ -50,13 +50,14 @@ describe('patchOperation()', () => { let scope = new Scope(); let parentSpan: Span; let childSpan: Span; + let testClient = getTestClient({}); beforeAll(() => { new Integrations.Mongo({ operations: ['insertOne', 'initializeOrderedBulkOp'], }).setupOnce( () => undefined, - () => new Hub(undefined, scope), + () => new Hub(testClient, scope), ); }); @@ -64,6 +65,7 @@ describe('patchOperation()', () => { scope = new Scope(); parentSpan = new Span(); childSpan = parentSpan.startChild(); + testClient = getTestClient({}); jest.spyOn(scope, 'getSpan').mockReturnValueOnce(parentSpan); jest.spyOn(parentSpan, 'startChild').mockReturnValueOnce(childSpan); jest.spyOn(childSpan, 'end'); @@ -77,7 +79,6 @@ describe('patchOperation()', () => { 'db.mongodb.collection': 'mockedCollectionName', 'db.name': 'mockedDbName', 'db.operation': 'insertOne', - 'db.mongodb.doc': JSON.stringify(doc), 'db.system': 'mongodb', }, op: 'db', @@ -97,7 +98,25 @@ describe('patchOperation()', () => { 'db.mongodb.collection': 'mockedCollectionName', 'db.name': 'mockedDbName', 'db.operation': 'insertOne', - 'db.mongodb.doc': JSON.stringify(doc), + 'db.system': 'mongodb', + }, + op: 'db', + origin: 'auto.db.mongo', + description: 'insertOne', + }); + expect(childSpan.end).toBeCalled(); + }); + + it('attaches mongodb operation spans if sendDefaultPii is enabled', async () => { + testClient.getOptions().sendDefaultPii = true; + await collection.insertOne(doc, {}); + expect(scope.getSpan).toBeCalled(); + expect(parentSpan.startChild).toBeCalledWith({ + data: { + 'db.mongodb.collection': 'mockedCollectionName', + 'db.mongodb.doc': '{"name":"PickleRick","answer":42}', + 'db.name': 'mockedDbName', + 'db.operation': 'insertOne', 'db.system': 'mongodb', }, op: 'db', From 3592dbfee7b02a00850351f29cfe262ef6fe55c3 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 18 Jan 2024 09:08:04 -0500 Subject: [PATCH 2/2] lint fix --- packages/tracing-internal/src/node/integrations/mongo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tracing-internal/src/node/integrations/mongo.ts b/packages/tracing-internal/src/node/integrations/mongo.ts index 01f7eeaf7c63..27646e12b6bf 100644 --- a/packages/tracing-internal/src/node/integrations/mongo.ts +++ b/packages/tracing-internal/src/node/integrations/mongo.ts @@ -1,4 +1,4 @@ -import { Hub, getClient } from '@sentry/core'; +import type { Hub } from '@sentry/core'; import type { EventProcessor, SpanContext } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils';