From e747276e06b4bc8444833b944cf366496378d0f8 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 4 Feb 2026 11:01:33 +0100 Subject: [PATCH 1/5] feat(core): Add Spanv2 envelope creation function --- packages/core/src/index.ts | 2 - packages/core/src/tracing/spans/README.md | 2 + packages/core/src/tracing/spans/envelope.ts | 36 +++ .../test/lib/tracing/spans/envelope.test.ts | 232 ++++++++++++++++++ 4 files changed, 270 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/tracing/spans/README.md create mode 100644 packages/core/src/tracing/spans/envelope.ts create mode 100644 packages/core/test/lib/tracing/spans/envelope.test.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b05934465dfb..508ac8b2f649 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -453,8 +453,6 @@ export type { SpanContextData, TraceFlag, StreamedSpanJSON, - SerializedSpanContainer, - SerializedSpan, } from './types-hoist/span'; export type { SpanStatus } from './types-hoist/spanStatus'; export type { Log, LogSeverityLevel } from './types-hoist/log'; diff --git a/packages/core/src/tracing/spans/README.md b/packages/core/src/tracing/spans/README.md new file mode 100644 index 000000000000..fa40e8a0ff11 --- /dev/null +++ b/packages/core/src/tracing/spans/README.md @@ -0,0 +1,2 @@ +For now, all span streaming related tracing code is in this sub directory. +Once we get rid of transaction-based tracing, we can clean up and flatten the entire tracing directory. diff --git a/packages/core/src/tracing/spans/envelope.ts b/packages/core/src/tracing/spans/envelope.ts new file mode 100644 index 000000000000..33d671f71dbb --- /dev/null +++ b/packages/core/src/tracing/spans/envelope.ts @@ -0,0 +1,36 @@ +import type { Client } from '../../client'; +import type { DynamicSamplingContext, SpanContainerItem, SpanV2Envelope } from '../../types-hoist/envelope'; +import type { SerializedSpan } from '../../types-hoist/span'; +import { dsnToString } from '../../utils/dsn'; +import { createEnvelope } from '../../utils/envelope'; + +/** + * Creates a span v2 span streaming envelope + */ +export function createSpanV2Envelope( + serializedSpans: Array, + dsc: Partial, + client: Client, +): SpanV2Envelope { + const dsn = client.getDsn(); + const tunnel = client.getOptions().tunnel; + const sdk = client.getOptions()._metadata?.sdk; + + const headers: SpanV2Envelope[0] = { + sent_at: new Date().toISOString(), + ...(dscHasRequiredProps(dsc) && { trace: dsc }), + ...(sdk && { sdk: sdk }), + ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }), + }; + + const spanContainer: SpanContainerItem = [ + { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' }, + { items: serializedSpans }, + ]; + + return createEnvelope(headers, [spanContainer]); +} + +function dscHasRequiredProps(dsc: Partial): dsc is DynamicSamplingContext { + return !!dsc.trace_id && !!dsc.public_key; +} diff --git a/packages/core/test/lib/tracing/spans/envelope.test.ts b/packages/core/test/lib/tracing/spans/envelope.test.ts new file mode 100644 index 000000000000..1a4b5bfb433b --- /dev/null +++ b/packages/core/test/lib/tracing/spans/envelope.test.ts @@ -0,0 +1,232 @@ +import { describe, expect, it } from 'vitest'; +import { createSpanV2Envelope } from '../../../../src/tracing/spans/envelope'; +import type { DynamicSamplingContext } from '../../../../src/types-hoist/envelope'; +import type { SerializedSpan } from '../../../../src/types-hoist/span'; +import { getDefaultTestClientOptions, TestClient } from '../../../mocks/client'; + +function createMockSerializedSpan(overrides: Partial = {}): SerializedSpan { + return { + trace_id: 'abc123', + span_id: 'def456', + name: 'test-span', + start_timestamp: 1713859200, + end_timestamp: 1713859201, + status: 'ok', + is_segment: false, + ...overrides, + }; +} + +describe('createSpanV2Envelope', () => { + describe('envelope headers', () => { + it('creates an envelope with sent_at header', () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).toHaveProperty('sent_at', expect.any(String)); + }); + + it('includes trace header when DSC has required props (trace_id and public_key)', () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: DynamicSamplingContext = { + trace_id: 'trace-123', + public_key: 'public-key-abc', + sample_rate: '1.0', + release: 'v1.0.0', + }; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).toHaveProperty('trace', dsc); + }); + + it("does't include trace header when DSC is missing trace_id", () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = { + public_key: 'public-key-abc', + }; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).not.toHaveProperty('trace'); + }); + + it("does't include trace header when DSC is missing public_key", () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = { + trace_id: 'trace-123', + }; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).not.toHaveProperty('trace'); + }); + + it('includes SDK info when available in client options', () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient( + getDefaultTestClientOptions({ + _metadata: { + sdk: { name: 'sentry.javascript.browser', version: '8.0.0' }, + }, + }), + ); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).toHaveProperty('sdk', { name: 'sentry.javascript.browser', version: '8.0.0' }); + }); + + it("does't include SDK info when not available", () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).not.toHaveProperty('sdk'); + }); + + it('includes DSN when tunnel and DSN are configured', () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient( + getDefaultTestClientOptions({ + dsn: 'https://abc123@example.sentry.io/456', + tunnel: 'https://tunnel.example.com', + }), + ); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).toHaveProperty('dsn', 'https://abc123@example.sentry.io/456'); + }); + + it("does't include DSN when tunnel is not configured", () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient( + getDefaultTestClientOptions({ + dsn: 'https://abc123@example.sentry.io/456', + }), + ); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).not.toHaveProperty('dsn'); + }); + + it("does't include DSN when DSN is not available", () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient( + getDefaultTestClientOptions({ + tunnel: 'https://tunnel.example.com', + }), + ); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).not.toHaveProperty('dsn'); + }); + + it('includes all headers when all options are provided', () => { + const mockSpan = createMockSerializedSpan(); + const mockClient = new TestClient( + getDefaultTestClientOptions({ + dsn: 'https://abc123@example.sentry.io/456', + tunnel: 'https://tunnel.example.com', + _metadata: { + sdk: { name: 'sentry.javascript.node', version: '10.38.0' }, + }, + }), + ); + const dsc: DynamicSamplingContext = { + trace_id: 'trace-123', + public_key: 'public-key-abc', + environment: 'production', + }; + + const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + + expect(result[0]).toEqual({ + sent_at: expect.any(String), + trace: dsc, + sdk: { name: 'sentry.javascript.node', version: '10.38.0' }, + dsn: 'https://abc123@example.sentry.io/456', + }); + }); + }); + + describe('envelope item', () => { + it('creates a span container item with correct structure', () => { + const mockSpan = createMockSerializedSpan({ name: 'span-1' }); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = {}; + + const envelopeItems = createSpanV2Envelope([mockSpan], dsc, mockClient)[1]; + + expect(envelopeItems).toEqual([ + [ + { + content_type: 'application/vnd.sentry.items.span.v2+json', + item_count: 1, + type: 'span', + }, + { + items: [mockSpan], + }, + ], + ]); + }); + + it('sets correct item_count for multiple spans', () => { + const mockSpan1 = createMockSerializedSpan({ span_id: 'span-1' }); + const mockSpan2 = createMockSerializedSpan({ span_id: 'span-2' }); + const mockSpan3 = createMockSerializedSpan({ span_id: 'span-3' }); + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = {}; + + const envelopeItems = createSpanV2Envelope([mockSpan1, mockSpan2, mockSpan3], dsc, mockClient)[1]; + + expect(envelopeItems).toEqual([ + [ + { type: 'span', item_count: 3, content_type: 'application/vnd.sentry.items.span.v2+json' }, + { items: [mockSpan1, mockSpan2, mockSpan3] }, + ], + ]); + }); + + it('handles empty spans array', () => { + const mockClient = new TestClient(getDefaultTestClientOptions()); + const dsc: Partial = {}; + + const result = createSpanV2Envelope([], dsc, mockClient); + + expect(result).toEqual([ + { + sent_at: expect.any(String), + }, + [ + [ + { + content_type: 'application/vnd.sentry.items.span.v2+json', + item_count: 0, + type: 'span', + }, + { + items: [], + }, + ], + ], + ]); + }); + }); +}); From b4b9bafd08c83813af5e645bdc22be4f3e1af3a5 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 4 Feb 2026 13:12:41 +0100 Subject: [PATCH 2/5] redundant field --- packages/core/src/tracing/spans/envelope.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/tracing/spans/envelope.ts b/packages/core/src/tracing/spans/envelope.ts index 33d671f71dbb..88c5145fca3c 100644 --- a/packages/core/src/tracing/spans/envelope.ts +++ b/packages/core/src/tracing/spans/envelope.ts @@ -19,7 +19,7 @@ export function createSpanV2Envelope( const headers: SpanV2Envelope[0] = { sent_at: new Date().toISOString(), ...(dscHasRequiredProps(dsc) && { trace: dsc }), - ...(sdk && { sdk: sdk }), + ...(sdk && { sdk }), ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }), }; From 9c159b2fd7810c97965aebbbc0df768b556587f6 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 4 Feb 2026 15:39:49 +0100 Subject: [PATCH 3/5] s/v2/streamed --- packages/core/src/index.ts | 2 +- packages/core/src/tracing/spans/envelope.ts | 10 +++---- packages/core/src/types-hoist/envelope.ts | 6 ++-- .../test/lib/tracing/spans/envelope.test.ts | 30 +++++++++---------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 508ac8b2f649..beae21bd3bf8 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -384,7 +384,7 @@ export type { ProfileChunkEnvelope, ProfileChunkItem, SpanEnvelope, - SpanV2Envelope, + StreamedSpanEnvelope, SpanItem, LogEnvelope, MetricEnvelope, diff --git a/packages/core/src/tracing/spans/envelope.ts b/packages/core/src/tracing/spans/envelope.ts index 88c5145fca3c..a34618bbb589 100644 --- a/packages/core/src/tracing/spans/envelope.ts +++ b/packages/core/src/tracing/spans/envelope.ts @@ -1,5 +1,5 @@ import type { Client } from '../../client'; -import type { DynamicSamplingContext, SpanContainerItem, SpanV2Envelope } from '../../types-hoist/envelope'; +import type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types-hoist/envelope'; import type { SerializedSpan } from '../../types-hoist/span'; import { dsnToString } from '../../utils/dsn'; import { createEnvelope } from '../../utils/envelope'; @@ -7,16 +7,16 @@ import { createEnvelope } from '../../utils/envelope'; /** * Creates a span v2 span streaming envelope */ -export function createSpanV2Envelope( +export function createStreamedSpanEnvelope( serializedSpans: Array, dsc: Partial, client: Client, -): SpanV2Envelope { +): StreamedSpanEnvelope { const dsn = client.getDsn(); const tunnel = client.getOptions().tunnel; const sdk = client.getOptions()._metadata?.sdk; - const headers: SpanV2Envelope[0] = { + const headers: StreamedSpanEnvelope[0] = { sent_at: new Date().toISOString(), ...(dscHasRequiredProps(dsc) && { trace: dsc }), ...(sdk && { sdk }), @@ -28,7 +28,7 @@ export function createSpanV2Envelope( { items: serializedSpans }, ]; - return createEnvelope(headers, [spanContainer]); + return createEnvelope(headers, [spanContainer]); } function dscHasRequiredProps(dsc: Partial): dsc is DynamicSamplingContext { diff --git a/packages/core/src/types-hoist/envelope.ts b/packages/core/src/types-hoist/envelope.ts index 7251f85b5df0..175c974ae2e7 100644 --- a/packages/core/src/types-hoist/envelope.ts +++ b/packages/core/src/types-hoist/envelope.ts @@ -149,7 +149,7 @@ type CheckInEnvelopeHeaders = { trace?: DynamicSamplingContext }; type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders; type ReplayEnvelopeHeaders = BaseEnvelopeHeaders; type SpanEnvelopeHeaders = BaseEnvelopeHeaders & { trace?: DynamicSamplingContext }; -type SpanV2EnvelopeHeaders = BaseEnvelopeHeaders & { trace?: DynamicSamplingContext }; +type StreamedSpanEnvelopeHeaders = BaseEnvelopeHeaders & { trace?: DynamicSamplingContext }; type LogEnvelopeHeaders = BaseEnvelopeHeaders; type MetricEnvelopeHeaders = BaseEnvelopeHeaders; export type EventEnvelope = BaseEnvelope< @@ -161,7 +161,7 @@ export type ClientReportEnvelope = BaseEnvelope; export type SpanEnvelope = BaseEnvelope; -export type SpanV2Envelope = BaseEnvelope; +export type StreamedSpanEnvelope = BaseEnvelope; export type ProfileChunkEnvelope = BaseEnvelope; export type RawSecurityEnvelope = BaseEnvelope; export type LogEnvelope = BaseEnvelope; @@ -175,7 +175,7 @@ export type Envelope = | ReplayEnvelope | CheckInEnvelope | SpanEnvelope - | SpanV2Envelope + | StreamedSpanEnvelope | RawSecurityEnvelope | LogEnvelope | MetricEnvelope; diff --git a/packages/core/test/lib/tracing/spans/envelope.test.ts b/packages/core/test/lib/tracing/spans/envelope.test.ts index 1a4b5bfb433b..41cbb1f2432f 100644 --- a/packages/core/test/lib/tracing/spans/envelope.test.ts +++ b/packages/core/test/lib/tracing/spans/envelope.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { createSpanV2Envelope } from '../../../../src/tracing/spans/envelope'; +import { createStreamedSpanEnvelope } from '../../../../src/tracing/spans/envelope'; import type { DynamicSamplingContext } from '../../../../src/types-hoist/envelope'; import type { SerializedSpan } from '../../../../src/types-hoist/span'; import { getDefaultTestClientOptions, TestClient } from '../../../mocks/client'; @@ -17,14 +17,14 @@ function createMockSerializedSpan(overrides: Partial = {}): Seri }; } -describe('createSpanV2Envelope', () => { +describe('createStreamedSpanEnvelope', () => { describe('envelope headers', () => { it('creates an envelope with sent_at header', () => { const mockSpan = createMockSerializedSpan(); const mockClient = new TestClient(getDefaultTestClientOptions()); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).toHaveProperty('sent_at', expect.any(String)); }); @@ -39,7 +39,7 @@ describe('createSpanV2Envelope', () => { release: 'v1.0.0', }; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).toHaveProperty('trace', dsc); }); @@ -51,7 +51,7 @@ describe('createSpanV2Envelope', () => { public_key: 'public-key-abc', }; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).not.toHaveProperty('trace'); }); @@ -63,7 +63,7 @@ describe('createSpanV2Envelope', () => { trace_id: 'trace-123', }; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).not.toHaveProperty('trace'); }); @@ -79,7 +79,7 @@ describe('createSpanV2Envelope', () => { ); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).toHaveProperty('sdk', { name: 'sentry.javascript.browser', version: '8.0.0' }); }); @@ -89,7 +89,7 @@ describe('createSpanV2Envelope', () => { const mockClient = new TestClient(getDefaultTestClientOptions()); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).not.toHaveProperty('sdk'); }); @@ -104,7 +104,7 @@ describe('createSpanV2Envelope', () => { ); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).toHaveProperty('dsn', 'https://abc123@example.sentry.io/456'); }); @@ -118,7 +118,7 @@ describe('createSpanV2Envelope', () => { ); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).not.toHaveProperty('dsn'); }); @@ -132,7 +132,7 @@ describe('createSpanV2Envelope', () => { ); const dsc: Partial = {}; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).not.toHaveProperty('dsn'); }); @@ -154,7 +154,7 @@ describe('createSpanV2Envelope', () => { environment: 'production', }; - const result = createSpanV2Envelope([mockSpan], dsc, mockClient); + const result = createStreamedSpanEnvelope([mockSpan], dsc, mockClient); expect(result[0]).toEqual({ sent_at: expect.any(String), @@ -171,7 +171,7 @@ describe('createSpanV2Envelope', () => { const mockClient = new TestClient(getDefaultTestClientOptions()); const dsc: Partial = {}; - const envelopeItems = createSpanV2Envelope([mockSpan], dsc, mockClient)[1]; + const envelopeItems = createStreamedSpanEnvelope([mockSpan], dsc, mockClient)[1]; expect(envelopeItems).toEqual([ [ @@ -194,7 +194,7 @@ describe('createSpanV2Envelope', () => { const mockClient = new TestClient(getDefaultTestClientOptions()); const dsc: Partial = {}; - const envelopeItems = createSpanV2Envelope([mockSpan1, mockSpan2, mockSpan3], dsc, mockClient)[1]; + const envelopeItems = createStreamedSpanEnvelope([mockSpan1, mockSpan2, mockSpan3], dsc, mockClient)[1]; expect(envelopeItems).toEqual([ [ @@ -208,7 +208,7 @@ describe('createSpanV2Envelope', () => { const mockClient = new TestClient(getDefaultTestClientOptions()); const dsc: Partial = {}; - const result = createSpanV2Envelope([], dsc, mockClient); + const result = createStreamedSpanEnvelope([], dsc, mockClient); expect(result).toEqual([ { From aa1bfc4f2ab33ee0d0832d8ccd5e063a2c0bc198 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 4 Feb 2026 16:35:52 +0100 Subject: [PATCH 4/5] use minimal sdk envelope header for now --- packages/core/src/tracing/spans/envelope.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/tracing/spans/envelope.ts b/packages/core/src/tracing/spans/envelope.ts index a34618bbb589..6f2a74d783b3 100644 --- a/packages/core/src/tracing/spans/envelope.ts +++ b/packages/core/src/tracing/spans/envelope.ts @@ -2,7 +2,7 @@ import type { Client } from '../../client'; import type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types-hoist/envelope'; import type { SerializedSpan } from '../../types-hoist/span'; import { dsnToString } from '../../utils/dsn'; -import { createEnvelope } from '../../utils/envelope'; +import { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope'; /** * Creates a span v2 span streaming envelope @@ -14,7 +14,7 @@ export function createStreamedSpanEnvelope( ): StreamedSpanEnvelope { const dsn = client.getDsn(); const tunnel = client.getOptions().tunnel; - const sdk = client.getOptions()._metadata?.sdk; + const sdk = getSdkMetadataForEnvelopeHeader(client.getOptions()._metadata); const headers: StreamedSpanEnvelope[0] = { sent_at: new Date().toISOString(), From d5683f9ad5edb4e133f793fc1441039c6e5331ca Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 4 Feb 2026 16:39:30 +0100 Subject: [PATCH 5/5] s/serializedSpan/serializedStreamedSpan --- packages/core/src/tracing/spans/envelope.ts | 4 ++-- packages/core/src/types-hoist/envelope.ts | 4 ++-- packages/core/src/types-hoist/span.ts | 8 ++++---- packages/core/test/lib/tracing/spans/envelope.test.ts | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/core/src/tracing/spans/envelope.ts b/packages/core/src/tracing/spans/envelope.ts index 6f2a74d783b3..8429b22d7e1c 100644 --- a/packages/core/src/tracing/spans/envelope.ts +++ b/packages/core/src/tracing/spans/envelope.ts @@ -1,6 +1,6 @@ import type { Client } from '../../client'; import type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types-hoist/envelope'; -import type { SerializedSpan } from '../../types-hoist/span'; +import type { SerializedStreamedSpan } from '../../types-hoist/span'; import { dsnToString } from '../../utils/dsn'; import { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope'; @@ -8,7 +8,7 @@ import { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/env * Creates a span v2 span streaming envelope */ export function createStreamedSpanEnvelope( - serializedSpans: Array, + serializedSpans: Array, dsc: Partial, client: Client, ): StreamedSpanEnvelope { diff --git a/packages/core/src/types-hoist/envelope.ts b/packages/core/src/types-hoist/envelope.ts index 175c974ae2e7..d8b8a1822b04 100644 --- a/packages/core/src/types-hoist/envelope.ts +++ b/packages/core/src/types-hoist/envelope.ts @@ -11,7 +11,7 @@ import type { Profile, ProfileChunk } from './profiling'; import type { ReplayEvent, ReplayRecordingData } from './replay'; import type { SdkInfo } from './sdkinfo'; import type { SerializedSession, SessionAggregates } from './session'; -import type { SerializedSpanContainer, SpanJSON } from './span'; +import type { SerializedStreamedSpanContainer, SpanJSON } from './span'; // Based on: https://develop.sentry.dev/sdk/envelopes/ @@ -138,7 +138,7 @@ export type FeedbackItem = BaseEnvelopeItem; export type ProfileItem = BaseEnvelopeItem; export type ProfileChunkItem = BaseEnvelopeItem; export type SpanItem = BaseEnvelopeItem>; -export type SpanContainerItem = BaseEnvelopeItem; +export type SpanContainerItem = BaseEnvelopeItem; export type LogContainerItem = BaseEnvelopeItem; export type MetricContainerItem = BaseEnvelopeItem; export type RawSecurityItem = BaseEnvelopeItem; diff --git a/packages/core/src/types-hoist/span.ts b/packages/core/src/types-hoist/span.ts index 8b7ea3e02275..a918cc57859c 100644 --- a/packages/core/src/types-hoist/span.ts +++ b/packages/core/src/types-hoist/span.ts @@ -38,7 +38,7 @@ export type SpanTimeInput = HrTime | number | Date; /** * Intermediate JSON reporesentation of a v2 span, which users and our SDK integrations will interact with. * This is NOT the final serialized JSON span, but an intermediate step still holding raw attributes. - * The final, serialized span is a {@link SerializedSpan}. + * The final, serialized span is a {@link SerializedStreamedSpan}. * Main reason: Make it easier and safer for users to work with attributes. */ export interface StreamedSpanJSON { @@ -60,7 +60,7 @@ export interface StreamedSpanJSON { * The intermediate representation is {@link StreamedSpanJSON}. * Main difference: Attributes are converted to {@link Attributes}, thus including the `type` annotation. */ -export type SerializedSpan = Omit & { +export type SerializedStreamedSpan = Omit & { attributes?: Attributes; links?: SpanLinkJSON[]; }; @@ -68,8 +68,8 @@ export type SerializedSpan = Omit & { /** * Envelope span item container. */ -export type SerializedSpanContainer = { - items: Array; +export type SerializedStreamedSpanContainer = { + items: Array; }; /** A JSON representation of a span. */ diff --git a/packages/core/test/lib/tracing/spans/envelope.test.ts b/packages/core/test/lib/tracing/spans/envelope.test.ts index 41cbb1f2432f..197b7ed40365 100644 --- a/packages/core/test/lib/tracing/spans/envelope.test.ts +++ b/packages/core/test/lib/tracing/spans/envelope.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from 'vitest'; import { createStreamedSpanEnvelope } from '../../../../src/tracing/spans/envelope'; import type { DynamicSamplingContext } from '../../../../src/types-hoist/envelope'; -import type { SerializedSpan } from '../../../../src/types-hoist/span'; +import type { SerializedStreamedSpan } from '../../../../src/types-hoist/span'; import { getDefaultTestClientOptions, TestClient } from '../../../mocks/client'; -function createMockSerializedSpan(overrides: Partial = {}): SerializedSpan { +function createMockSerializedSpan(overrides: Partial = {}): SerializedStreamedSpan { return { trace_id: 'abc123', span_id: 'def456',