From d02ad08ed83fee85e5a1d69cd1df0948de9b9b87 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 2 Nov 2022 12:26:22 +0100 Subject: [PATCH 1/2] feat(otel): Add spec for SentryPropagator --- src/docs/sdk/performance/opentelemetry.mdx | 42 +++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/docs/sdk/performance/opentelemetry.mdx b/src/docs/sdk/performance/opentelemetry.mdx index fafe9d8ca3..73cd3fe7ee 100644 --- a/src/docs/sdk/performance/opentelemetry.mdx +++ b/src/docs/sdk/performance/opentelemetry.mdx @@ -152,17 +152,51 @@ const sdk = new NodeSDK({ }); ``` -### Step 2: Define `isSentryRequest` +### Step 2: Implement the SentryPropagator on your SDK Add SentryPropagator -We want to make sure we don't create spans that represent requests to Sentry +`SentryPropagator` is used to inject/extract `sentry-trace` and `baggage` headers to make trace propogation and dynamic sampling work correctly. -TODO @neel +```ts +import { Context, TextMapPropagator } from "@opentelemetry/api"; +import { SpanContext } from "@opentelemetry/api"; + +export class SentryPropogator implements TextMapPropagator { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { + const spanContext = getSpanContext(context); + if (isSentryRequest(spanContext)) { + return; + } + + const sentryTrace = generateSentryTrace(spanContext); + setSentryTraceHeader(carrier, sentryTrace, setter); + + const baggage = generateBaggageFromContext(context); + setBaggageHeader(carrier, baggage, setter); + } + + extract(context: Context, carrier: unknown, getter: TextMapGetter): Context { + const sentryTraceParent = extractSentryTraceFromCarrier(carrier, getter); + setSentryTraceInfoOnSpanContext(context, sentryTraceParent); + + const dynamicSamplingContext = extractBaggageFromCarrier(carrier, getter); + setDynamicSamplingContextOnSpanContext(context, dynamicSamplingContext); + + return context; + } +} +``` + +### Step 3: Define `isSentryRequest` + +We want to make sure that we don't create Sentry Spans for requests to Sentry. + +TODO: We need to make sure we filter these out somehow. Spec WIP ### Step 3: Define `getTraceData` We want to make sure a transaction is started with information from the `sentry-trace` and `baggage` headers. -TODO @neel +If the user is using the `SentryPropagator`, the `sentry-trace` information should be getting attached to incoming spans automatically. This should mean that we don't need to explicitly grab the header. The `SentryPropagator` should also be putting the Dynamic Sampling Context from the baggage header onto the OpenTelemetry Context, which then can be used in `getTraceData` to inject the DSC in during transaction creation. ### Step 4: Define `updateSpanWithOtelData` From f349c45a6e737ca7241f51b8babb6ea7ac296c6b Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 2 Nov 2022 15:55:43 +0100 Subject: [PATCH 2/2] Update src/docs/sdk/performance/opentelemetry.mdx --- src/docs/sdk/performance/opentelemetry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/sdk/performance/opentelemetry.mdx b/src/docs/sdk/performance/opentelemetry.mdx index 73cd3fe7ee..01fd74f96f 100644 --- a/src/docs/sdk/performance/opentelemetry.mdx +++ b/src/docs/sdk/performance/opentelemetry.mdx @@ -160,7 +160,7 @@ const sdk = new NodeSDK({ import { Context, TextMapPropagator } from "@opentelemetry/api"; import { SpanContext } from "@opentelemetry/api"; -export class SentryPropogator implements TextMapPropagator { +export class SentryPropagator implements TextMapPropagator { inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const spanContext = getSpanContext(context); if (isSentryRequest(spanContext)) {