|
1 | 1 | import { Hub } from '@sentry/hub'; |
2 | 2 | import { EventProcessor, Integration, Transaction, TransactionContext } from '@sentry/types'; |
3 | | -import { getGlobalObject, logger } from '@sentry/utils'; |
| 3 | +import { getGlobalObject, logger, parseBaggageString } from '@sentry/utils'; |
4 | 4 |
|
5 | 5 | import { IS_DEBUG_BUILD } from '../flags'; |
6 | 6 | import { startIdleTransaction } from '../hubextensions'; |
@@ -204,7 +204,7 @@ export class BrowserTracing implements Integration { |
204 | 204 | // eslint-disable-next-line @typescript-eslint/unbound-method |
205 | 205 | const { beforeNavigate, idleTimeout, finalTimeout } = this.options; |
206 | 206 |
|
207 | | - const parentContextFromHeader = context.op === 'pageload' ? getHeaderContext() : undefined; |
| 207 | + const parentContextFromHeader = context.op === 'pageload' ? extractTraceDataFromMetaTags() : undefined; |
208 | 208 |
|
209 | 209 | const expandedContext = { |
210 | 210 | ...context, |
@@ -256,6 +256,28 @@ export function getHeaderContext(): Partial<TransactionContext> | undefined { |
256 | 256 | return undefined; |
257 | 257 | } |
258 | 258 |
|
| 259 | +/** |
| 260 | + * Gets transaction context data from `sentry-trace` and `baggage` <meta> tags. |
| 261 | + * @returns Transaction context data or undefined neither tag exists or has valid data |
| 262 | + */ |
| 263 | +export function extractTraceDataFromMetaTags(): Partial<TransactionContext> | undefined { |
| 264 | + const sentrytraceValue = getMetaContent('sentry-trace'); |
| 265 | + const baggageValue = getMetaContent('baggage'); |
| 266 | + |
| 267 | + const sentrytraceData = sentrytraceValue ? extractTraceparentData(sentrytraceValue) : undefined; |
| 268 | + const baggage = baggageValue ? parseBaggageString(baggageValue) : undefined; |
| 269 | + |
| 270 | + // TODO more extensive checks for baggage validity/emptyness? |
| 271 | + if (sentrytraceData || baggage) { |
| 272 | + return { |
| 273 | + ...sentrytraceData, |
| 274 | + ...(baggage && { metadata: { baggage } }), |
| 275 | + }; |
| 276 | + } |
| 277 | + |
| 278 | + return undefined; |
| 279 | +} |
| 280 | + |
259 | 281 | /** Returns the value of a meta tag */ |
260 | 282 | export function getMetaContent(metaName: string): string | null { |
261 | 283 | const el = getGlobalObject<Window>().document.querySelector(`meta[name=${metaName}]`); |
|
0 commit comments