From f9cfc9d4645e1ff34515c9b408aefc04717b6e5b Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 10 Apr 2024 15:48:47 +0200 Subject: [PATCH 1/2] feat(performance): Adds span envelope and datacategory (#10706) Adds span envelopes and datacategory. For use with standalone inp spans --- packages/core/src/index.ts | 1 + packages/core/src/span.ts | 22 ++++++++++++++++++++++ packages/types/src/datacategory.ts | 4 +++- packages/types/src/envelope.ts | 11 +++++++++-- packages/types/src/index.ts | 2 ++ packages/utils/src/envelope.ts | 4 +++- 6 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/span.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e3f827605aeb..89c602660df3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -69,6 +69,7 @@ export { export { applyScopeDataToEvent, mergeScopeData } from './utils/applyScopeDataToEvent'; export { prepareEvent } from './utils/prepareEvent'; export { createCheckInEnvelope } from './checkin'; +export { createSpanEnvelope } from './span'; export { hasTracingEnabled } from './utils/hasTracingEnabled'; export { isSentryRequestUrl } from './utils/isSentryRequestUrl'; export { handleCallbackErrors } from './utils/handleCallbackErrors'; diff --git a/packages/core/src/span.ts b/packages/core/src/span.ts new file mode 100644 index 000000000000..405ceeddab30 --- /dev/null +++ b/packages/core/src/span.ts @@ -0,0 +1,22 @@ +import type { SpanEnvelope, SpanItem } from '@sentry/types'; +import type { Span } from '@sentry/types'; +import { createEnvelope } from '@sentry/utils'; + +/** + * Create envelope from Span item. + */ +export function createSpanEnvelope(spans: Span[]): SpanEnvelope { + const headers: SpanEnvelope[0] = { + sent_at: new Date().toISOString(), + }; + + const items = spans.map(createSpanItem); + return createEnvelope(headers, items); +} + +function createSpanItem(span: Span): SpanItem { + const spanHeaders: SpanItem[0] = { + type: 'span', + }; + return [spanHeaders, span]; +} diff --git a/packages/types/src/datacategory.ts b/packages/types/src/datacategory.ts index 96e6d7ae65ae..9f3ea2a5653d 100644 --- a/packages/types/src/datacategory.ts +++ b/packages/types/src/datacategory.ts @@ -29,4 +29,6 @@ export type DataCategory = // Statsd type event for metrics | 'statsd' // Unknown data category - | 'unknown'; + | 'unknown' + // Span + | 'span'; diff --git a/packages/types/src/envelope.ts b/packages/types/src/envelope.ts index 7a9ad2e4d5c3..9c5c045a4648 100644 --- a/packages/types/src/envelope.ts +++ b/packages/types/src/envelope.ts @@ -8,6 +8,7 @@ import type { Profile } from './profiling'; import type { ReplayEvent, ReplayRecordingData } from './replay'; import type { SdkInfo } from './sdkinfo'; import type { SerializedSession, Session, SessionAggregates } from './session'; +import type { Span } from './span'; // Based on: https://develop.sentry.dev/sdk/envelopes/ @@ -36,7 +37,8 @@ export type EnvelopeItemType = | 'replay_event' | 'replay_recording' | 'check_in' - | 'statsd'; + | 'statsd' + | 'span'; export type BaseEnvelopeHeaders = { [key: string]: unknown; @@ -77,6 +79,7 @@ type ReplayRecordingItemHeaders = { type: 'replay_recording'; length: number }; type CheckInItemHeaders = { type: 'check_in' }; type StatsdItemHeaders = { type: 'statsd'; length: number }; type ProfileItemHeaders = { type: 'profile' }; +type SpanItemHeaders = { type: 'span' }; // TODO (v8): Replace `Event` with `SerializedEvent` export type EventItem = BaseEnvelopeItem; @@ -93,6 +96,7 @@ type ReplayRecordingItem = BaseEnvelopeItem; export type FeedbackItem = BaseEnvelopeItem; export type ProfileItem = BaseEnvelopeItem; +export type SpanItem = BaseEnvelopeItem; export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: DynamicSamplingContext }; type SessionEnvelopeHeaders = { sent_at: string }; @@ -100,6 +104,7 @@ type CheckInEnvelopeHeaders = { trace?: DynamicSamplingContext }; type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders; type ReplayEnvelopeHeaders = BaseEnvelopeHeaders; type StatsdEnvelopeHeaders = BaseEnvelopeHeaders; +type SpanEnvelopeHeaders = BaseEnvelopeHeaders; export type EventEnvelope = BaseEnvelope< EventEnvelopeHeaders, @@ -110,6 +115,7 @@ export type ClientReportEnvelope = BaseEnvelope; export type StatsdEnvelope = BaseEnvelope; +export type SpanEnvelope = BaseEnvelope; export type Envelope = | EventEnvelope @@ -117,5 +123,6 @@ export type Envelope = | ClientReportEnvelope | ReplayEnvelope | CheckInEnvelope - | StatsdEnvelope; + | StatsdEnvelope + | SpanEnvelope; export type EnvelopeItem = Envelope[1][number]; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 2e2c61dad4b6..50041db6eb0b 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -45,6 +45,8 @@ export type { StatsdItem, StatsdEnvelope, ProfileItem, + SpanEnvelope, + SpanItem, } from './envelope'; export type { ExtendedError } from './error'; export type { Event, EventHint, EventType, ErrorEvent, TransactionEvent } from './event'; diff --git a/packages/utils/src/envelope.ts b/packages/utils/src/envelope.ts index 461bf6fcb47b..4c6a6eea724d 100644 --- a/packages/utils/src/envelope.ts +++ b/packages/utils/src/envelope.ts @@ -208,7 +208,9 @@ const ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record = { replay_recording: 'replay', check_in: 'monitor', feedback: 'feedback', - statsd: 'statsd', + span: 'span', + // TODO: This is a temporary workaround until we have a proper data category for metrics + statsd: 'unknown', }; /** From 769f62932423c7400b01062aab97b1c0762682ce Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 10 Apr 2024 16:40:10 +0200 Subject: [PATCH 2/2] move up --- packages/types/src/datacategory.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/types/src/datacategory.ts b/packages/types/src/datacategory.ts index 9f3ea2a5653d..de482bc3d7cc 100644 --- a/packages/types/src/datacategory.ts +++ b/packages/types/src/datacategory.ts @@ -28,7 +28,7 @@ export type DataCategory = | 'feedback' // Statsd type event for metrics | 'statsd' - // Unknown data category - | 'unknown' // Span - | 'span'; + | 'span' + // Unknown data category + | 'unknown';