|
1 | 1 | import { Scope } from '@sentry/core';
|
2 |
| -import type { Breadcrumb, Transaction } from '@sentry/types'; |
3 |
| -import { dateTimestampInSeconds } from '@sentry/utils'; |
| 2 | +import type { Breadcrumb } from '@sentry/types'; |
4 | 3 |
|
| 4 | +import type { TransactionWithBreadcrumbs } from '../types'; |
5 | 5 | import { getActiveSpan } from './trace';
|
6 | 6 |
|
7 |
| -const DEFAULT_MAX_BREADCRUMBS = 100; |
8 |
| - |
9 |
| -/** |
10 |
| - * This is a fork of the base Transaction with OTEL specific stuff added. |
11 |
| - * Note that we do not solve this via an actual subclass, but by wrapping this in a proxy when we need it - |
12 |
| - * as we can't easily control all the places a transaction may be created. |
13 |
| - */ |
14 |
| -interface TransactionWithBreadcrumbs extends Transaction { |
15 |
| - _breadcrumbs: Breadcrumb[]; |
16 |
| - |
17 |
| - /** Get all breadcrumbs added to this transaction. */ |
18 |
| - getBreadcrumbs(): Breadcrumb[]; |
19 |
| - |
20 |
| - /** Add a breadcrumb to this transaction. */ |
21 |
| - addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): void; |
22 |
| -} |
23 |
| - |
24 | 7 | /** A fork of the classic scope with some otel specific stuff. */
|
25 | 8 | export class OtelScope extends Scope {
|
26 | 9 | /**
|
@@ -79,60 +62,5 @@ export class OtelScope extends Scope {
|
79 | 62 | */
|
80 | 63 | function getActiveTransaction(): TransactionWithBreadcrumbs | undefined {
|
81 | 64 | const activeSpan = getActiveSpan();
|
82 |
| - const transaction = activeSpan && activeSpan.transaction; |
83 |
| - |
84 |
| - if (!transaction) { |
85 |
| - return undefined; |
86 |
| - } |
87 |
| - |
88 |
| - if (transactionHasBreadcrumbs(transaction)) { |
89 |
| - return transaction; |
90 |
| - } |
91 |
| - |
92 |
| - return new Proxy(transaction as TransactionWithBreadcrumbs, { |
93 |
| - get(target, prop, receiver) { |
94 |
| - if (prop === 'addBreadcrumb') { |
95 |
| - return addBreadcrumb; |
96 |
| - } |
97 |
| - if (prop === 'getBreadcrumbs') { |
98 |
| - return getBreadcrumbs; |
99 |
| - } |
100 |
| - if (prop === '_breadcrumbs') { |
101 |
| - const breadcrumbs = Reflect.get(target, prop, receiver); |
102 |
| - return breadcrumbs || []; |
103 |
| - } |
104 |
| - return Reflect.get(target, prop, receiver); |
105 |
| - }, |
106 |
| - }); |
107 |
| -} |
108 |
| - |
109 |
| -function transactionHasBreadcrumbs(transaction: Transaction): transaction is TransactionWithBreadcrumbs { |
110 |
| - return ( |
111 |
| - typeof (transaction as TransactionWithBreadcrumbs).getBreadcrumbs === 'function' && |
112 |
| - typeof (transaction as TransactionWithBreadcrumbs).addBreadcrumb === 'function' |
113 |
| - ); |
114 |
| -} |
115 |
| - |
116 |
| -/** Add a breadcrumb to a transaction. */ |
117 |
| -function addBreadcrumb(this: TransactionWithBreadcrumbs, breadcrumb: Breadcrumb, maxBreadcrumbs?: number): void { |
118 |
| - const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS; |
119 |
| - |
120 |
| - // No data has been changed, so don't notify scope listeners |
121 |
| - if (maxCrumbs <= 0) { |
122 |
| - return; |
123 |
| - } |
124 |
| - |
125 |
| - const mergedBreadcrumb = { |
126 |
| - timestamp: dateTimestampInSeconds(), |
127 |
| - ...breadcrumb, |
128 |
| - }; |
129 |
| - |
130 |
| - const breadcrumbs = this._breadcrumbs; |
131 |
| - breadcrumbs.push(mergedBreadcrumb); |
132 |
| - this._breadcrumbs = breadcrumbs.length > maxCrumbs ? breadcrumbs.slice(-maxCrumbs) : breadcrumbs; |
133 |
| -} |
134 |
| - |
135 |
| -/** Get all breadcrumbs from a transaction. */ |
136 |
| -function getBreadcrumbs(this: TransactionWithBreadcrumbs): Breadcrumb[] { |
137 |
| - return this._breadcrumbs; |
| 65 | + return activeSpan && (activeSpan.transaction as TransactionWithBreadcrumbs | undefined); |
138 | 66 | }
|
0 commit comments