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,
});