diff --git a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/server.js b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/server.js index 19877ffe3613..3b615e93cd16 100644 --- a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/server.js +++ b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/server.js @@ -4,16 +4,6 @@ const Sentry = require('@sentry/node'); Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', transport: loggingTransport, - beforeSend(event) { - event.contexts = { - ...event.contexts, - traceData: { - ...Sentry.getTraceData(), - metaTags: Sentry.getTraceMetaTags(), - }, - }; - return event; - }, }); // express must be required after Sentry is initialized @@ -21,8 +11,15 @@ const express = require('express'); const app = express(); -app.get('/test', () => { - throw new Error('test error'); +app.get('/test', (_req, res) => { + Sentry.withScope(scope => { + scope.setContext('traceData', { + ...Sentry.getTraceData(), + metaTags: Sentry.getTraceMetaTags(), + }); + Sentry.captureException(new Error('test error 2')); + }); + res.status(200).send(); }); Sentry.setupExpressErrorHandler(app); diff --git a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/test.ts b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/test.ts index e6c0bfff822d..9abb7b1a631c 100644 --- a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp-errors/test.ts @@ -5,7 +5,7 @@ describe('errors in TwP mode have same trace in trace context and getTraceData() cleanupChildProcesses(); }); - test('in incoming request', async () => { + test('in incoming request', done => { createRunner(__dirname, 'server.js') .expect({ event: event => { @@ -17,14 +17,16 @@ describe('errors in TwP mode have same trace in trace context and getTraceData() const traceData = contexts?.traceData || {}; expect(traceData['sentry-trace']).toEqual(`${trace_id}-${span_id}`); + expect(traceData.baggage).toContain(`sentry-trace_id=${trace_id}`); + expect(traceData.baggage).not.toContain('sentry-sampled='); expect(traceData.metaTags).toContain(``); - expect(traceData.metaTags).toContain(`sentr y-trace_id=${trace_id}`); + expect(traceData.metaTags).toContain(`sentry-trace_id=${trace_id}`); expect(traceData.metaTags).not.toContain('sentry-sampled='); }, }) - .start() + .start(done) .makeRequest('get', '/test'); }); @@ -41,6 +43,7 @@ describe('errors in TwP mode have same trace in trace context and getTraceData() expect(traceData['sentry-trace']).toEqual(`${trace_id}-${span_id}`); expect(traceData.baggage).toContain(`sentry-trace_id=${trace_id}`); + expect(traceData.baggage).not.toContain('sentry-sampled='); expect(traceData.metaTags).toContain(``); expect(traceData.metaTags).toContain(`sentry-trace_id=${trace_id}`); diff --git a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp/test.ts b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp/test.ts index f3179beede6d..cca1f34321a2 100644 --- a/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/meta-tags-twp/test.ts @@ -27,5 +27,6 @@ describe('getTraceMetaTags', () => { expect(sentryBaggageContent).toContain('sentry-environment=production'); expect(sentryBaggageContent).toContain('sentry-public_key=public'); expect(sentryBaggageContent).toContain(`sentry-trace_id=${traceId}`); + expect(sentryBaggageContent).not.toContain('sentry-sampled='); }); }); diff --git a/packages/core/src/tracing/dynamicSamplingContext.ts b/packages/core/src/tracing/dynamicSamplingContext.ts index d47dfd7ff317..d96dd726d51f 100644 --- a/packages/core/src/tracing/dynamicSamplingContext.ts +++ b/packages/core/src/tracing/dynamicSamplingContext.ts @@ -9,6 +9,7 @@ import { import { DEFAULT_ENVIRONMENT } from '../constants'; import { getClient } from '../currentScopes'; import { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes'; +import { hasTracingEnabled } from '../utils/hasTracingEnabled'; import { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils'; /** @@ -103,7 +104,12 @@ export function getDynamicSamplingContextFromSpan(span: Span): Readonly { environment: 'production', sampled: 'true', sample_rate: '0.56', - trace_id: expect.any(String), + trace_id: expect.stringMatching(/^[a-f0-9]{32}$/), transaction: 'tx', }); }); @@ -85,7 +86,7 @@ describe('getDynamicSamplingContextFromSpan', () => { environment: 'production', sampled: 'true', sample_rate: '1', - trace_id: expect.any(String), + trace_id: expect.stringMatching(/^[a-f0-9]{32}$/), transaction: 'tx', }); }); @@ -107,7 +108,7 @@ describe('getDynamicSamplingContextFromSpan', () => { environment: 'production', sampled: 'true', sample_rate: '0.56', - trace_id: expect.any(String), + trace_id: expect.stringMatching(/^[a-f0-9]{32}$/), transaction: 'tx', }); }); @@ -144,4 +145,23 @@ describe('getDynamicSamplingContextFromSpan', () => { expect(dsc.transaction).toEqual('tx'); }); }); + + it("doesn't return the sampled flag in the DSC if in Tracing without Performance mode", () => { + const rootSpan = new SentrySpan({ + name: 'tx', + sampled: undefined, + }); + + // Simulate TwP mode by deleting the tracesSampleRate option set in beforeEach + delete getClient()?.getOptions().tracesSampleRate; + + const dynamicSamplingContext = getDynamicSamplingContextFromSpan(rootSpan); + + expect(dynamicSamplingContext).toStrictEqual({ + release: '1.0.1', + environment: 'production', + trace_id: expect.stringMatching(/^[a-f0-9]{32}$/), + transaction: 'tx', + }); + }); });