Skip to content

Commit a09781f

Browse files
feat(performance): Adds span envelope and datacategory (#10706)
Adds span envelopes and datacategory. For use with standalone inp spans
2 parents 811eaa4 + 3f0f558 commit a09781f

File tree

6 files changed

+38
-3
lines changed

6 files changed

+38
-3
lines changed

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export {
7979
export { applyScopeDataToEvent, mergeScopeData } from './utils/applyScopeDataToEvent';
8080
export { prepareEvent } from './utils/prepareEvent';
8181
export { createCheckInEnvelope } from './checkin';
82+
export { createSpanEnvelope } from './span';
8283
export { hasTracingEnabled } from './utils/hasTracingEnabled';
8384
export { isSentryRequestUrl } from './utils/isSentryRequestUrl';
8485
export { handleCallbackErrors } from './utils/handleCallbackErrors';

packages/core/src/span.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { SpanEnvelope, SpanItem } from '@sentry/types';
2+
import type { Span } from '@sentry/types';
3+
import { createEnvelope } from '@sentry/utils';
4+
5+
/**
6+
* Create envelope from Span item.
7+
*/
8+
export function createSpanEnvelope(spans: Span[]): SpanEnvelope {
9+
const headers: SpanEnvelope[0] = {
10+
sent_at: new Date().toISOString(),
11+
};
12+
13+
const items = spans.map(createSpanItem);
14+
return createEnvelope<SpanEnvelope>(headers, items);
15+
}
16+
17+
function createSpanItem(span: Span): SpanItem {
18+
const spanHeaders: SpanItem[0] = {
19+
type: 'span',
20+
};
21+
return [spanHeaders, span];
22+
}

packages/types/src/datacategory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ export type DataCategory =
2727
// Feedback type event (v2)
2828
| 'feedback'
2929
// Unknown data category
30-
| 'unknown';
30+
| 'unknown'
31+
// Span
32+
| 'span';

packages/types/src/envelope.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { Profile } from './profiling';
77
import type { ReplayEvent, ReplayRecordingData } from './replay';
88
import type { SdkInfo } from './sdkinfo';
99
import type { SerializedSession, Session, SessionAggregates } from './session';
10+
import type { Span } from './span';
1011
import type { Transaction } from './transaction';
1112
import type { UserFeedback } from './user';
1213

@@ -41,7 +42,8 @@ export type EnvelopeItemType =
4142
| 'replay_event'
4243
| 'replay_recording'
4344
| 'check_in'
44-
| 'statsd';
45+
| 'statsd'
46+
| 'span';
4547

4648
export type BaseEnvelopeHeaders = {
4749
[key: string]: unknown;
@@ -82,6 +84,7 @@ type ReplayRecordingItemHeaders = { type: 'replay_recording'; length: number };
8284
type CheckInItemHeaders = { type: 'check_in' };
8385
type StatsdItemHeaders = { type: 'statsd'; length: number };
8486
type ProfileItemHeaders = { type: 'profile' };
87+
type SpanItemHeaders = { type: 'span' };
8588

8689
// TODO (v8): Replace `Event` with `SerializedEvent`
8790
export type EventItem = BaseEnvelopeItem<EventItemHeaders, Event>;
@@ -98,13 +101,15 @@ type ReplayRecordingItem = BaseEnvelopeItem<ReplayRecordingItemHeaders, ReplayRe
98101
export type StatsdItem = BaseEnvelopeItem<StatsdItemHeaders, string>;
99102
export type FeedbackItem = BaseEnvelopeItem<FeedbackItemHeaders, FeedbackEvent>;
100103
export type ProfileItem = BaseEnvelopeItem<ProfileItemHeaders, Profile>;
104+
export type SpanItem = BaseEnvelopeItem<SpanItemHeaders, Span>;
101105

102106
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: DynamicSamplingContext };
103107
type SessionEnvelopeHeaders = { sent_at: string };
104108
type CheckInEnvelopeHeaders = { trace?: DynamicSamplingContext };
105109
type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders;
106110
type ReplayEnvelopeHeaders = BaseEnvelopeHeaders;
107111
type StatsdEnvelopeHeaders = BaseEnvelopeHeaders;
112+
type SpanEnvelopeHeaders = BaseEnvelopeHeaders;
108113

109114
export type EventEnvelope = BaseEnvelope<
110115
EventEnvelopeHeaders,
@@ -115,12 +120,14 @@ export type ClientReportEnvelope = BaseEnvelope<ClientReportEnvelopeHeaders, Cli
115120
export type ReplayEnvelope = [ReplayEnvelopeHeaders, [ReplayEventItem, ReplayRecordingItem]];
116121
export type CheckInEnvelope = BaseEnvelope<CheckInEnvelopeHeaders, CheckInItem>;
117122
export type StatsdEnvelope = BaseEnvelope<StatsdEnvelopeHeaders, StatsdItem>;
123+
export type SpanEnvelope = BaseEnvelope<SpanEnvelopeHeaders, SpanItem>;
118124

119125
export type Envelope =
120126
| EventEnvelope
121127
| SessionEnvelope
122128
| ClientReportEnvelope
123129
| ReplayEnvelope
124130
| CheckInEnvelope
125-
| StatsdEnvelope;
131+
| StatsdEnvelope
132+
| SpanEnvelope;
126133
export type EnvelopeItem = Envelope[1][number];

packages/types/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export type {
4545
StatsdItem,
4646
StatsdEnvelope,
4747
ProfileItem,
48+
SpanEnvelope,
49+
SpanItem,
4850
} from './envelope';
4951
export type { ExtendedError } from './error';
5052
export type { Event, EventHint, EventType, ErrorEvent, TransactionEvent, SerializedEvent } from './event';

packages/utils/src/envelope.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ const ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record<EnvelopeItemType, DataCategory> = {
209209
replay_recording: 'replay',
210210
check_in: 'monitor',
211211
feedback: 'feedback',
212+
span: 'span',
212213
// TODO: This is a temporary workaround until we have a proper data category for metrics
213214
statsd: 'unknown',
214215
};

0 commit comments

Comments
 (0)