Skip to content

Commit

Permalink
feat: Pick up sentry-trace in JS <meta/> tag (#2703)
Browse files Browse the repository at this point in the history
* feat: Pick up sentry-trace in frontend

* meta: Add changelog

* ref: Code review
  • Loading branch information
HazAT committed Jun 30, 2020
1 parent 99745d6 commit a551313
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 4 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Expand Up @@ -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 <meta/> 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)
Expand Down
43 changes: 39 additions & 4 deletions packages/apm/src/integrations/tracing.ts
Expand Up @@ -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' '<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
*/
Expand Down Expand Up @@ -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));
Expand Down
3 changes: 3 additions & 0 deletions packages/node/src/handlers.ts
Expand Up @@ -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
Expand All @@ -42,13 +43,15 @@ export function tracingHandler(): (
if (span) {
traceId = span.traceId;
parentSpanId = span.parentSpanId;
sampled = span.sampled;
}
}

const transaction = startTransaction({
name: `${reqMethod} ${reqUrl}`,
op: 'http.server',
parentSpanId,
sampled,
traceId,
});

Expand Down

0 comments on commit a551313

Please sign in to comment.