From a5513134ae98417d6aabbdafe8f5d0743049a195 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Tue, 30 Jun 2020 11:15:28 +0200 Subject: [PATCH] feat: Pick up sentry-trace in JS tag (#2703) * feat: Pick up sentry-trace in frontend * meta: Add changelog * ref: Code review --- CHANGELOG.md | 3 ++ packages/apm/src/integrations/tracing.ts | 43 +++++++++++++++++++++--- packages/node/src/handlers.ts | 3 ++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb203f9addf5..f850bcdeb173 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ - [tracing] fix: Add manual Location typing (#2700) - [react] feat: Expose eventId on ErrorBoundary component +- [tracing] feat: Pick up sentry-trace in JS tag (#2703) +- [tracing] fix: Respect sample decision when continuing trace from header in node (#2703) + ## 5.18.1 - [react] feat: Update peer dependencies for `react` and `react-dom` (#2694) diff --git a/packages/apm/src/integrations/tracing.ts b/packages/apm/src/integrations/tracing.ts index 4cb2453324d0..860e4aec212f 100644 --- a/packages/apm/src/integrations/tracing.ts +++ b/packages/apm/src/integrations/tracing.ts @@ -285,6 +285,44 @@ export class Tracing implements Integration { }); } + /** + * Returns a new Transaction either continued from sentry-trace meta or a new one + */ + private static _getNewTransaction(hub: Hub, transactionContext: TransactionContext): Transaction { + let traceId; + let parentSpanId; + let sampled; + + const header = Tracing._getMeta('sentry-trace'); + if (header) { + const span = SpanClass.fromTraceparent(header); + if (span) { + traceId = span.traceId; + parentSpanId = span.parentSpanId; + sampled = span.sampled; + Tracing._log( + `[Tracing] found 'sentry-meta' '' continuing trace with: trace_id: ${traceId} span_id: ${parentSpanId}`, + ); + } + } + + return hub.startTransaction({ + parentSpanId, + sampled, + traceId, + trimEnd: true, + ...transactionContext, + }) as Transaction; + } + + /** + * Returns the value of a meta tag + */ + private static _getMeta(metaName: string): string | null { + const el = document.querySelector(`meta[name=${metaName}]`); + return el ? el.getAttribute('content') : null; + } + /** * Pings the heartbeat */ @@ -456,10 +494,7 @@ export class Tracing implements Integration { return undefined; } - Tracing._activeTransaction = hub.startTransaction({ - trimEnd: true, - ...transactionContext, - }) as Transaction; + Tracing._activeTransaction = Tracing._getNewTransaction(hub, transactionContext); // We set the transaction here on the scope so error events pick up the trace context and attach it to the error hub.configureScope(scope => scope.setSpan(Tracing._activeTransaction)); diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index baab3f0a1753..f47703ccaca4 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -34,6 +34,7 @@ export function tracingHandler(): ( let traceId; let parentSpanId; + let sampled; // If there is a trace header set, we extract the data from it and set the span on the scope // to be the origin an created transaction set the parent_span_id / trace_id @@ -42,6 +43,7 @@ export function tracingHandler(): ( if (span) { traceId = span.traceId; parentSpanId = span.parentSpanId; + sampled = span.sampled; } } @@ -49,6 +51,7 @@ export function tracingHandler(): ( name: `${reqMethod} ${reqUrl}`, op: 'http.server', parentSpanId, + sampled, traceId, });