From 90aa8cd0a7b215a844788b6d8aee133c2f330d9f Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 10 Jul 2025 08:27:02 +0200 Subject: [PATCH 1/2] ref(node): Add `sentry.transaction.parent_span_already_sent` attribute --- packages/opentelemetry/src/spanExporter.ts | 8 ++++++++ .../test/integration/transactions.test.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/opentelemetry/src/spanExporter.ts b/packages/opentelemetry/src/spanExporter.ts index 6430f0f23da5..a113d25222c7 100644 --- a/packages/opentelemetry/src/spanExporter.ts +++ b/packages/opentelemetry/src/spanExporter.ts @@ -191,6 +191,14 @@ export class SentrySpanExporter { sentSpans.add(span); const transactionEvent = createTransactionForOtelSpan(span); + // Add an attribute to the transaction event to indicate that this transaction is an orphaned transaction + if (root.parentNode && this._sentSpans.has(root.parentNode.id)) { + const traceData = transactionEvent.contexts?.trace?.data; + if (traceData) { + traceData['sentry.transaction.parent_span_already_sent'] = true; + } + } + // We'll recursively add all the child spans to this array const spans = transactionEvent.spans || []; diff --git a/packages/opentelemetry/test/integration/transactions.test.ts b/packages/opentelemetry/test/integration/transactions.test.ts index 9bc1847b422b..128bac1bcdc4 100644 --- a/packages/opentelemetry/test/integration/transactions.test.ts +++ b/packages/opentelemetry/test/integration/transactions.test.ts @@ -612,6 +612,20 @@ describe('Integration | Transactions', () => { expect(transactions).toHaveLength(2); expect(transactions[0]?.spans).toHaveLength(1); + expect(transactions[0]?.transaction).toBe('test name'); + expect(transactions[0]?.contexts?.trace?.data).toEqual({ + 'sentry.origin': 'manual', + 'sentry.sample_rate': 1, + 'sentry.source': 'custom', + }); + + expect(transactions[1]?.transaction).toBe('inner span 2'); + expect(transactions[1]?.contexts?.trace?.data).toEqual({ + 'sentry.transaction.parent_span_already_sent': true, + 'sentry.origin': 'manual', + 'sentry.source': 'custom', + }); + const finishedSpans: any = exporter['_finishedSpanBuckets'].flatMap(bucket => bucket ? Array.from(bucket.spans) : [], ); From 26a32b2a3a3bd1c148a639a35a116651151c2411 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 10 Jul 2025 08:30:37 +0200 Subject: [PATCH 2/2] drop transaction part --- packages/opentelemetry/src/spanExporter.ts | 2 +- packages/opentelemetry/test/integration/transactions.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry/src/spanExporter.ts b/packages/opentelemetry/src/spanExporter.ts index a113d25222c7..3328b64c8230 100644 --- a/packages/opentelemetry/src/spanExporter.ts +++ b/packages/opentelemetry/src/spanExporter.ts @@ -195,7 +195,7 @@ export class SentrySpanExporter { if (root.parentNode && this._sentSpans.has(root.parentNode.id)) { const traceData = transactionEvent.contexts?.trace?.data; if (traceData) { - traceData['sentry.transaction.parent_span_already_sent'] = true; + traceData['sentry.parent_span_already_sent'] = true; } } diff --git a/packages/opentelemetry/test/integration/transactions.test.ts b/packages/opentelemetry/test/integration/transactions.test.ts index 128bac1bcdc4..c3cc9b0e8b7b 100644 --- a/packages/opentelemetry/test/integration/transactions.test.ts +++ b/packages/opentelemetry/test/integration/transactions.test.ts @@ -621,7 +621,7 @@ describe('Integration | Transactions', () => { expect(transactions[1]?.transaction).toBe('inner span 2'); expect(transactions[1]?.contexts?.trace?.data).toEqual({ - 'sentry.transaction.parent_span_already_sent': true, + 'sentry.parent_span_already_sent': true, 'sentry.origin': 'manual', 'sentry.source': 'custom', });