From 4bafc3032135838debc62fc024986bb7aaf9c4f5 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Mon, 29 Jun 2020 13:04:16 +0200 Subject: [PATCH 1/3] feat: Pick up sentry-trace in frontend --- packages/apm/src/integrations/tracing.ts | 51 ++++++++++++++++++++++-- packages/node/src/handlers.ts | 3 ++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/packages/apm/src/integrations/tracing.ts b/packages/apm/src/integrations/tracing.ts index 4f9793f33ac5..60e06abd772f 100644 --- a/packages/apm/src/integrations/tracing.ts +++ b/packages/apm/src/integrations/tracing.ts @@ -283,6 +283,52 @@ 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 metas = document.getElementsByTagName('meta'); + + // tslint:disable-next-line: prefer-for-of + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute('name') === metaName) { + return metas[i].getAttribute('content'); + } + } + + return null; + } + /** * Pings the heartbeat */ @@ -454,10 +500,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, }); From 44cb67ecceb7ca1193238f1f7af9b9ff9a782da1 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Tue, 30 Jun 2020 10:15:59 +0200 Subject: [PATCH 2/3] meta: Add changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6a287d4b77a..3ced16da1e0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott +- [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) From cb0494e2363fdc1e92fb5577ba5369dc29a91413 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Tue, 30 Jun 2020 10:56:02 +0200 Subject: [PATCH 3/3] ref: Code review --- packages/apm/src/integrations/tracing.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/apm/src/integrations/tracing.ts b/packages/apm/src/integrations/tracing.ts index 60e06abd772f..a38c6f00d440 100644 --- a/packages/apm/src/integrations/tracing.ts +++ b/packages/apm/src/integrations/tracing.ts @@ -298,10 +298,10 @@ export class Tracing implements Integration { traceId = span.traceId; parentSpanId = span.parentSpanId; sampled = span.sampled; + Tracing._log( + `[Tracing] found 'sentry-meta' '' continuing trace with: trace_id: ${traceId} span_id: ${parentSpanId}`, + ); } - Tracing._log( - `[Tracing] found 'sentry-meta' '' continuing trace with: trace_id: ${traceId} span_id: ${parentSpanId}`, - ); } return hub.startTransaction({ @@ -317,16 +317,8 @@ export class Tracing implements Integration { * Returns the value of a meta tag */ private static _getMeta(metaName: string): string | null { - const metas = document.getElementsByTagName('meta'); - - // tslint:disable-next-line: prefer-for-of - for (let i = 0; i < metas.length; i++) { - if (metas[i].getAttribute('name') === metaName) { - return metas[i].getAttribute('content'); - } - } - - return null; + const el = document.querySelector(`meta[name=${metaName}]`); + return el ? el.getAttribute('content') : null; } /**