diff --git a/dev-packages/browser-integration-tests/suites/public-api/startSpan/streamed/test.ts b/dev-packages/browser-integration-tests/suites/public-api/startSpan/streamed/test.ts index 0b6af5fb420d..6b1d532f1436 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/startSpan/streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/startSpan/streamed/test.ts @@ -12,6 +12,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_STATUS_MESSAGE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { sentryTest } from '../../../../utils/fixtures'; import { shouldSkipTracingTest } from '../../../../utils/helpers'; @@ -100,6 +101,10 @@ sentryTest( type: 'string', value: 'production', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }, end_timestamp: expect.any(Number), is_segment: false, @@ -136,6 +141,10 @@ sentryTest( type: 'string', value: 'production', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }, end_timestamp: expect.any(Number), is_segment: false, @@ -176,6 +185,10 @@ sentryTest( type: 'string', value: 'Connection Refused', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }, end_timestamp: expect.any(Number), is_segment: false, @@ -252,6 +265,10 @@ sentryTest( type: 'string', value: 'production', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }, end_timestamp: expect.any(Number), is_segment: true, diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions-streamed/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions-streamed/test.ts index 8d4269d2c88b..327aac7972cf 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions-streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions-streamed/test.ts @@ -11,6 +11,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { sentryTest } from '../../../../utils/fixtures'; import { shouldSkipTracingTest } from '../../../../utils/helpers'; @@ -42,6 +43,10 @@ sentryTest('captures streamed interaction span tree. @firefox', async ({ browser expect(interactionSegmentSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'culture.calendar': { type: 'string', value: expect.any(String), @@ -122,6 +127,10 @@ sentryTest('captures streamed interaction span tree. @firefox', async ({ browser const interactionSpan = interactionSpanTree.find(span => getSpanOp(span) === 'ui.interaction.click'); expect(interactionSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'ui.interaction.click', diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-streamed/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-streamed/test.ts index af6f8bedb75e..54128df8b210 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-streamed/test.ts @@ -7,6 +7,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { sentryTest } from '../../../../utils/fixtures'; import { shouldSkipTracingTest } from '../../../../utils/helpers'; @@ -71,6 +72,10 @@ sentryTest('starts a streamed navigation span on page navigation', async ({ brow expect(navigationSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'culture.calendar': { type: 'string', value: expect.any(String), diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/pageload-streamed/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/pageload-streamed/test.ts index 027c3e62aca5..bed58af888b0 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/pageload-streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/pageload-streamed/test.ts @@ -11,6 +11,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { sentryTest } from '../../../../utils/fixtures'; import { shouldSkipTracingTest } from '../../../../utils/helpers'; @@ -64,6 +65,10 @@ sentryTest( expect(pageloadSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'culture.calendar': { type: 'string', value: expect.any(String), diff --git a/dev-packages/cloudflare-integration-tests/suites/public-api/startSpan-streamed/test.ts b/dev-packages/cloudflare-integration-tests/suites/public-api/startSpan-streamed/test.ts index c51a400e7857..c21799da7c6f 100644 --- a/dev-packages/cloudflare-integration-tests/suites/public-api/startSpan-streamed/test.ts +++ b/dev-packages/cloudflare-integration-tests/suites/public-api/startSpan-streamed/test.ts @@ -12,6 +12,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { expect, it } from 'vitest'; import { createRunner } from '../../../runner'; @@ -77,6 +78,7 @@ it('sends a streamed span envelope with correct spans for a manually started spa expect(childSpan).toBeDefined(); expect(childSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test-child', @@ -103,6 +105,7 @@ it('sends a streamed span envelope with correct spans for a manually started spa expect(inactiveSpan).toBeDefined(); expect(inactiveSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: { type: 'string', value: 'manual' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: CLOUDFLARE_SDK }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, @@ -138,6 +141,7 @@ it('sends a streamed span envelope with correct spans for a manually started spa expect(manualSpan).toBeDefined(); expect(manualSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: { type: 'string', value: 'manual' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: CLOUDFLARE_SDK }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, @@ -158,6 +162,7 @@ it('sends a streamed span envelope with correct spans for a manually started spa expect(parentTestSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: CLOUDFLARE_SDK }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, @@ -179,6 +184,7 @@ it('sends a streamed span envelope with correct spans for a manually started spa expect(segmentSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: CLOUDFLARE_SDK }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: { diff --git a/dev-packages/e2e-tests/test-applications/deno-streamed/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/deno-streamed/tests/spans.test.ts index 7ed898351fc2..ef8883aacef4 100644 --- a/dev-packages/e2e-tests/test-applications/deno-streamed/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/deno-streamed/tests/spans.test.ts @@ -3,6 +3,10 @@ import { waitForStreamedSpans, getSpanOp } from '@sentry-internal/test-utils'; const SEGMENT_SPAN = { attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'app.start_time': { type: 'string', value: expect.any(String), @@ -170,6 +174,10 @@ test('Sends streamed spans (http.server and manual with Sentry.startSpan)', asyn expect(spans).toEqual([ { attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'sentry.environment': { type: 'string', value: 'qa', @@ -238,6 +246,10 @@ test('OTel span appears as child of Sentry span (interop)', async ({ baseURL }) expect(sentrySpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'sentry.environment': { type: 'string', value: 'qa', @@ -275,6 +287,10 @@ test('OTel span appears as child of Sentry span (interop)', async ({ baseURL }) expect(otelSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'sentry.environment': { type: 'string', value: 'qa', diff --git a/dev-packages/node-core-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts b/dev-packages/node-core-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts index 34b02875830b..b7329ead23b7 100644 --- a/dev-packages/node-core-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts +++ b/dev-packages/node-core-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts @@ -10,6 +10,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { expect, test } from 'vitest'; import { createRunner } from '../../../../utils/runner'; @@ -53,6 +54,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(childSpan).toBeDefined(); expect(childSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test-child', @@ -80,6 +82,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(inactiveSpan).toBeDefined(); expect(inactiveSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node-core' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId }, @@ -116,6 +119,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(manualSpan).toBeDefined(); expect(manualSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node-core' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId }, @@ -136,6 +140,7 @@ test('sends a streamed span envelope with correct spans for a manually started s }); const expectedAttributes: Record = { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test' }, [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: { type: 'integer', value: 1 }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node-core' }, diff --git a/dev-packages/node-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts b/dev-packages/node-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts index cc52933a1106..d2fb4bbe71f6 100644 --- a/dev-packages/node-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts +++ b/dev-packages/node-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts @@ -10,6 +10,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core'; import { expect, test } from 'vitest'; import { createRunner } from '../../../../utils/runner'; @@ -53,6 +54,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(childSpan).toBeDefined(); expect(childSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test-child', @@ -80,6 +82,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(inactiveSpan).toBeDefined(); expect(inactiveSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId }, @@ -116,6 +119,7 @@ test('sends a streamed span envelope with correct spans for a manually started s expect(manualSpan).toBeDefined(); expect(manualSpan).toEqual({ attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node' }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION }, [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId }, @@ -136,6 +140,7 @@ test('sends a streamed span envelope with correct spans for a manually started s }); const expectedAttributes: Record = { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'test' }, [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: { type: 'integer', value: 1 }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node' }, diff --git a/dev-packages/node-integration-tests/suites/tracing/mysql-streamed/test.ts b/dev-packages/node-integration-tests/suites/tracing/mysql-streamed/test.ts index 5c50636e213c..0c6b9d9d8eb4 100644 --- a/dev-packages/node-integration-tests/suites/tracing/mysql-streamed/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/mysql-streamed/test.ts @@ -1,4 +1,4 @@ -import { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core'; +import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE } from '@sentry/core'; import type { SerializedStreamedSpanContainer } from '@sentry/core'; import { afterAll, describe, expect } from 'vitest'; import { cleanupChildProcesses } from '../../../utils/runner'; @@ -90,6 +90,10 @@ describe('mysql auto instrumentation (streamed)', () => { ...(isNode18 && { 'sentry.status.message': { type: 'string', value: expect.stringMatching(/^connect ECONNREFUSED/) }, }), + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }; const COMMON_SPAN_PROPS = { diff --git a/dev-packages/node-integration-tests/suites/tracing/postgres-streamed/test.ts b/dev-packages/node-integration-tests/suites/tracing/postgres-streamed/test.ts index a636185a0c20..8f094de9021f 100644 --- a/dev-packages/node-integration-tests/suites/tracing/postgres-streamed/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/postgres-streamed/test.ts @@ -1,4 +1,4 @@ -import { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core'; +import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE } from '@sentry/core'; import type { SerializedStreamedSpanContainer } from '@sentry/core'; import { afterAll, describe, expect } from 'vitest'; import { conditionalTest } from '../../../utils'; @@ -69,6 +69,10 @@ const COMMON_DB_ATTRIBUTES = { type: 'string', value: 'task', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, }; /** diff --git a/packages/browser/test/integrations/spanstreaming.test.ts b/packages/browser/test/integrations/spanstreaming.test.ts index b480d0240701..e34dacc9da6c 100644 --- a/packages/browser/test/integrations/spanstreaming.test.ts +++ b/packages/browser/test/integrations/spanstreaming.test.ts @@ -3,6 +3,7 @@ import { debug, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, } from '@sentry/core/browser'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { BrowserClient, spanStreamingIntegration } from '../../src'; @@ -137,6 +138,10 @@ describe('spanStreamingIntegration', () => { start_timestamp: expect.any(Number), status: 'ok', attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, 'sentry.origin': { type: 'string', value: 'manual', diff --git a/packages/core/src/semanticAttributes.ts b/packages/core/src/semanticAttributes.ts index 8df3b5e8b013..8976b8bded6d 100644 --- a/packages/core/src/semanticAttributes.ts +++ b/packages/core/src/semanticAttributes.ts @@ -65,6 +65,12 @@ export const SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION = 'sentry.sdk.version'; /** The list of integrations enabled in the Sentry SDK (e.g., ["InboundFilters", "BrowserTracing"]) */ export const SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS = 'sentry.sdk.integrations'; +/** + * Indicates the trace lifecycle mode with which a span was sent by the SDK. + * Either "stream" (streamed span) or "static" (transaction-sent span). + */ +export const SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE = 'sentry.trace_lifecycle'; + /** The user ID */ export const SEMANTIC_ATTRIBUTE_USER_ID = 'user.id'; /** The user email */ diff --git a/packages/core/src/tracing/spans/captureSpan.ts b/packages/core/src/tracing/spans/captureSpan.ts index a2fc6595e348..0f25cd845409 100644 --- a/packages/core/src/tracing/spans/captureSpan.ts +++ b/packages/core/src/tracing/spans/captureSpan.ts @@ -10,6 +10,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, @@ -138,6 +139,7 @@ function applyCommonSpanAttributes( // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation) safeSetSpanJSONAttributes(spanJSON, { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: 'stream', [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release, [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT, [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name, diff --git a/packages/core/test/lib/tracing/spans/captureSpan.test.ts b/packages/core/test/lib/tracing/spans/captureSpan.test.ts index aa81d664ea8c..47da9abe5578 100644 --- a/packages/core/test/lib/tracing/spans/captureSpan.test.ts +++ b/packages/core/test/lib/tracing/spans/captureSpan.test.ts @@ -13,6 +13,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, @@ -67,6 +68,10 @@ describe('captureSpan', () => { status: 'ok', is_segment: true, attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + type: 'string', + value: 'stream', + }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'http.client', @@ -204,6 +209,10 @@ describe('captureSpan', () => { value: 'staging', type: 'string', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + value: 'stream', + type: 'string', + }, [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { value: 'sentry.javascript.node', type: 'string', @@ -300,6 +309,10 @@ describe('captureSpan', () => { value: 'production', type: 'string', }, + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { + value: 'stream', + type: 'string', + }, }, _segmentSpan: span, }); @@ -344,6 +357,7 @@ describe('captureSpan', () => { status: 'ok', is_segment: true, attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_TRACE_LIFECYCLE]: { type: 'string', value: 'stream' }, [SEMANTIC_ATTRIBUTE_SENTRY_OP]: { type: 'string', value: 'http.client' }, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: { type: 'string', value: 'manual' }, [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: { type: 'integer', value: 1 },