From be1c97cc76b44438144a0cbb2d04d8c67e8b7838 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 28 Jun 2023 15:40:40 -0400 Subject: [PATCH 1/8] update tests --- .../suites/replay/captureReplay/test.ts | 4 ++++ .../suites/replay/captureReplayFromReplayPackage/test.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/browser-integration-tests/suites/replay/captureReplay/test.ts b/packages/browser-integration-tests/suites/replay/captureReplay/test.ts index 421e725bb3e4..f1aff48ac9df 100644 --- a/packages/browser-integration-tests/suites/replay/captureReplay/test.ts +++ b/packages/browser-integration-tests/suites/replay/captureReplay/test.ts @@ -56,6 +56,10 @@ sentryTest('should capture replays (@sentry/browser export)', async ({ getLocalT version: SDK_VERSION, name: 'sentry.javascript.browser', }, +<<<<<<< HEAD +======= + sdkProcessingMetadata: expect.any(Object), +>>>>>>> 929289c22 (update tests) request: { url: expect.stringContaining('/dist/index.html'), headers: { diff --git a/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts b/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts index c42bfc692018..2509bb764020 100644 --- a/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts +++ b/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts @@ -56,6 +56,10 @@ sentryTest('should capture replays (@sentry/replay export)', async ({ getLocalTe version: SDK_VERSION, name: 'sentry.javascript.browser', }, +<<<<<<< HEAD +======= + sdkProcessingMetadata: expect.any(Object), +>>>>>>> 929289c22 (update tests) request: { url: expect.stringContaining('/dist/index.html'), headers: { From 8acb63d638bdc27b95be035c33207c3dbe706bf5 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 28 Jun 2023 16:01:56 -0400 Subject: [PATCH 2/8] remove sdkProcessingMetadata from replay fixtures --- .../suites/replay/captureReplay/test.ts | 4 ---- .../suites/replay/captureReplayFromReplayPackage/test.ts | 4 ---- 2 files changed, 8 deletions(-) diff --git a/packages/browser-integration-tests/suites/replay/captureReplay/test.ts b/packages/browser-integration-tests/suites/replay/captureReplay/test.ts index f1aff48ac9df..421e725bb3e4 100644 --- a/packages/browser-integration-tests/suites/replay/captureReplay/test.ts +++ b/packages/browser-integration-tests/suites/replay/captureReplay/test.ts @@ -56,10 +56,6 @@ sentryTest('should capture replays (@sentry/browser export)', async ({ getLocalT version: SDK_VERSION, name: 'sentry.javascript.browser', }, -<<<<<<< HEAD -======= - sdkProcessingMetadata: expect.any(Object), ->>>>>>> 929289c22 (update tests) request: { url: expect.stringContaining('/dist/index.html'), headers: { diff --git a/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts b/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts index 2509bb764020..c42bfc692018 100644 --- a/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts +++ b/packages/browser-integration-tests/suites/replay/captureReplayFromReplayPackage/test.ts @@ -56,10 +56,6 @@ sentryTest('should capture replays (@sentry/replay export)', async ({ getLocalTe version: SDK_VERSION, name: 'sentry.javascript.browser', }, -<<<<<<< HEAD -======= - sdkProcessingMetadata: expect.any(Object), ->>>>>>> 929289c22 (update tests) request: { url: expect.stringContaining('/dist/index.html'), headers: { From 9ca434fc5956e304d03929f0a97d2661885d272d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 28 Jun 2023 17:31:55 -0400 Subject: [PATCH 3/8] feat(node): Populate propagation context using env variables --- packages/node/src/sdk.ts | 44 +++++++++++++++++++++++++++++--- packages/node/test/index.test.ts | 43 +++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 9e55fd4b5a84..d7232caf42de 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -6,13 +6,16 @@ import { initAndBind, Integrations as CoreIntegrations, } from '@sentry/core'; -import type { SessionStatus, StackParser } from '@sentry/types'; +import type { DynamicSamplingContext, PropagationContext, SessionStatus, StackParser } from '@sentry/types'; import { + baggageHeaderToDynamicSamplingContext, createStackParser, + extractTraceparentData, GLOBAL_OBJ, logger, nodeStackLineParser, stackParserFromStackParserOptions, + uuid4, } from '@sentry/utils'; import { setNodeAsyncContextStrategy } from './async'; @@ -129,8 +132,9 @@ export function init(options: NodeOptions = {}): void { options.dsn = process.env.SENTRY_DSN; } - if (options.tracesSampleRate === undefined && process.env.SENTRY_TRACES_SAMPLE_RATE) { - const tracesSampleRate = parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE); + const sentryTracesSampleRate = process.env.SENTRY_TRACES_SAMPLE_RATE; + if (options.tracesSampleRate === undefined && sentryTracesSampleRate) { + const tracesSampleRate = parseFloat(sentryTracesSampleRate); if (isFinite(tracesSampleRate)) { options.tracesSampleRate = tracesSampleRate; } @@ -171,6 +175,8 @@ export function init(options: NodeOptions = {}): void { if (options.autoSessionTracking) { startSessionTracking(); } + + updateScopeFromEnvVariables(); } /** @@ -285,3 +291,35 @@ function startSessionTracking(): void { if (session && !terminalStates.includes(session.status)) hub.endSession(); }); } + +/** + * Update scope and propagation context based on environmental variables. + * + * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md + * for more details. + */ +function updateScopeFromEnvVariables(): void { + const sentryUseEnvironment = process.env.SENTRY_USE_ENVIRONMENT; + if ( + !['false', 'False', 'FALSE', 'n', 'no', 'No', 'NO', 'off', 'Off', 'OFF', '0'].includes( + sentryUseEnvironment as string, + ) + ) { + const sentryTraceEnv = process.env.SENTRY_TRACE || ''; + const baggageEnv = process.env.SENTRY_BAGGAGE; + + const traceparentData = extractTraceparentData(sentryTraceEnv) || {}; + const { traceId, parentSpanId, parentSampled } = traceparentData; + const propagationContext: PropagationContext = { + traceId: traceId || uuid4(), + spanId: uuid4().substring(16), + parentSpanId, + sampled: parentSampled === undefined ? false : parentSampled, + }; + const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggageEnv); + if (dynamicSamplingContext) { + propagationContext.dsc = dynamicSamplingContext as DynamicSamplingContext; + } + getCurrentHub().getScope().setPropagationContext(propagationContext); + } +} diff --git a/packages/node/test/index.test.ts b/packages/node/test/index.test.ts index ab9bd41adaf9..60b37b44acb1 100644 --- a/packages/node/test/index.test.ts +++ b/packages/node/test/index.test.ts @@ -488,4 +488,47 @@ describe('SentryNode initialization', () => { expect(instrumenter).toEqual('otel'); }); }); + + describe('propagation context', () => { + beforeEach(() => { + process.env.SENTRY_TRACE = '12312012123120121231201212312012-1121201211212012-0'; + process.env.SENTRY_BAGGAGE = 'sentry-release=1.0.0,sentry-environment=production'; + + getCurrentHub().getScope().clear(); + }); + + afterEach(() => { + delete process.env.SENTRY_TRACE; + delete process.env.SENTRY_BAGGAGE; + }); + + it('reads from environmental variables', () => { + init({ dsn }); + + // @ts-expect-error accessing private method for test + expect(getCurrentHub().getScope()._propagationContext).toEqual({ + traceId: '12312012123120121231201212312012', + parentSpanId: '1121201211212012', + spanId: expect.any(String), + sampled: false, + dsc: { + release: '1.0.0', + environment: 'production', + }, + }); + }); + + it.each(['false', 'False', 'FALSE', 'n', 'no', 'No', 'NO', 'off', 'Off', 'OFF', '0'])( + 'does not read from environmental variable if SENTRY_USE_ENVIRONMENT is set to %s', + useEnvValue => { + process.env.SENTRY_USE_ENVIRONMENT = useEnvValue; + init({ dsn }); + + // @ts-expect-error accessing private method for test + expect(getCurrentHub().getScope()._propagationContext.traceId).not.toEqual('12312012123120121231201212312012'); + + delete process.env.SENTRY_USE_ENVIRONMENT; + }, + ); + }); }); From d6f1b1159d8be73c2d0f058cba916abc5f682fb7 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 11:12:53 -0400 Subject: [PATCH 4/8] simplify environment logic --- packages/node/src/sdk.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index d7232caf42de..a8cfb49231fa 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -299,12 +299,8 @@ function startSessionTracking(): void { * for more details. */ function updateScopeFromEnvVariables(): void { - const sentryUseEnvironment = process.env.SENTRY_USE_ENVIRONMENT; - if ( - !['false', 'False', 'FALSE', 'n', 'no', 'No', 'NO', 'off', 'Off', 'OFF', '0'].includes( - sentryUseEnvironment as string, - ) - ) { + const sentryUseEnvironment = (process.env.SENTRY_USE_ENVIRONMENT || '').toLowerCase(); + if (!['false', 'n', 'no', 'off', '0'].includes(sentryUseEnvironment)) { const sentryTraceEnv = process.env.SENTRY_TRACE || ''; const baggageEnv = process.env.SENTRY_BAGGAGE; From 7975864f6604c5898f4ef30fcddc7893bfcbf1be Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 11:48:20 -0400 Subject: [PATCH 5/8] create helper for tracing context --- packages/utils/src/tracing.ts | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/tracing.ts b/packages/utils/src/tracing.ts index 7eee5312ce6d..c75c9d266b85 100644 --- a/packages/utils/src/tracing.ts +++ b/packages/utils/src/tracing.ts @@ -1,4 +1,7 @@ -import type { TraceparentData } from '@sentry/types'; +import type { DynamicSamplingContext, PropagationContext, TraceparentData } from '@sentry/types'; + +import { baggageHeaderToDynamicSamplingContext } from './baggage'; +import { uuid4 } from './misc'; export const TRACEPARENT_REGEXP = new RegExp( '^[ \\t]*' + // whitespace @@ -36,3 +39,40 @@ export function extractTraceparentData(traceparent: string): TraceparentData | u parentSpanId: matches[2], }; } + +/** + * Create tracing context from incoming headers. + */ +export function tracingContextFromHeaders( + sentryTrace: Parameters[0] = '', + baggage: Parameters[0] = '', +): { + traceparentData: TraceparentData | undefined; + dynamicSamplingContext: Partial | undefined; + propagationContext: PropagationContext; +} { + const traceparentData = extractTraceparentData(sentryTrace); + const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggage); + + const { traceId, parentSpanId, parentSampled } = traceparentData || {}; + + const propagationContext: PropagationContext = { + traceId: traceId || uuid4(), + spanId: uuid4().substring(16), + sampled: parentSampled === undefined ? false : parentSampled, + }; + + if (parentSpanId) { + propagationContext.parentSpanId = parentSpanId; + } + + if (dynamicSamplingContext) { + propagationContext.dsc = dynamicSamplingContext as DynamicSamplingContext; + } + + return { + traceparentData, + dynamicSamplingContext, + propagationContext, + }; +} From 4693a711d43e1bfdd6c0fabfd25f9e79148ae727 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 11:51:30 -0400 Subject: [PATCH 6/8] update node env to use helper func --- packages/node/src/sdk.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index a8cfb49231fa..97a1d8fe756c 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -15,6 +15,7 @@ import { logger, nodeStackLineParser, stackParserFromStackParserOptions, + tracingContextFromHeaders, uuid4, } from '@sentry/utils'; @@ -301,21 +302,9 @@ function startSessionTracking(): void { function updateScopeFromEnvVariables(): void { const sentryUseEnvironment = (process.env.SENTRY_USE_ENVIRONMENT || '').toLowerCase(); if (!['false', 'n', 'no', 'off', '0'].includes(sentryUseEnvironment)) { - const sentryTraceEnv = process.env.SENTRY_TRACE || ''; + const sentryTraceEnv = process.env.SENTRY_TRACE; const baggageEnv = process.env.SENTRY_BAGGAGE; - - const traceparentData = extractTraceparentData(sentryTraceEnv) || {}; - const { traceId, parentSpanId, parentSampled } = traceparentData; - const propagationContext: PropagationContext = { - traceId: traceId || uuid4(), - spanId: uuid4().substring(16), - parentSpanId, - sampled: parentSampled === undefined ? false : parentSampled, - }; - const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggageEnv); - if (dynamicSamplingContext) { - propagationContext.dsc = dynamicSamplingContext as DynamicSamplingContext; - } + const { propagationContext } = tracingContextFromHeaders(sentryTraceEnv, baggageEnv); getCurrentHub().getScope().setPropagationContext(propagationContext); } } From 00f509037e05bd2467637411b87f0dbf47adc0b1 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 11:51:55 -0400 Subject: [PATCH 7/8] lint fix --- packages/node/src/sdk.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 97a1d8fe756c..fee681921bb3 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -6,17 +6,14 @@ import { initAndBind, Integrations as CoreIntegrations, } from '@sentry/core'; -import type { DynamicSamplingContext, PropagationContext, SessionStatus, StackParser } from '@sentry/types'; +import type { SessionStatus, StackParser } from '@sentry/types'; import { - baggageHeaderToDynamicSamplingContext, createStackParser, - extractTraceparentData, GLOBAL_OBJ, logger, nodeStackLineParser, stackParserFromStackParserOptions, tracingContextFromHeaders, - uuid4, } from '@sentry/utils'; import { setNodeAsyncContextStrategy } from './async'; From 6b4b04418ef199a81d39eb44298eea48413275e4 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 11:53:09 -0400 Subject: [PATCH 8/8] adjust types --- packages/utils/src/tracing.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/utils/src/tracing.ts b/packages/utils/src/tracing.ts index c75c9d266b85..445c271a0ee5 100644 --- a/packages/utils/src/tracing.ts +++ b/packages/utils/src/tracing.ts @@ -47,8 +47,8 @@ export function tracingContextFromHeaders( sentryTrace: Parameters[0] = '', baggage: Parameters[0] = '', ): { - traceparentData: TraceparentData | undefined; - dynamicSamplingContext: Partial | undefined; + traceparentData: ReturnType; + dynamicSamplingContext: ReturnType; propagationContext: PropagationContext; } { const traceparentData = extractTraceparentData(sentryTrace);