Skip to content

Commit bb9efed

Browse files
authored
feat(tracing): Adds span envelope and datacategory (#11534)
Adds span envelopes and datacategory. For use with standalone inp spans Forward port of #10706
1 parent 326f52a commit bb9efed

File tree

6 files changed

+39
-3
lines changed

6 files changed

+39
-3
lines changed

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export {
6969
export { applyScopeDataToEvent, mergeScopeData } from './utils/applyScopeDataToEvent';
7070
export { prepareEvent } from './utils/prepareEvent';
7171
export { createCheckInEnvelope } from './checkin';
72+
export { createSpanEnvelope } from './span';
7273
export { hasTracingEnabled } from './utils/hasTracingEnabled';
7374
export { isSentryRequestUrl } from './utils/isSentryRequestUrl';
7475
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,7 @@ export type DataCategory =
2828
| 'feedback'
2929
// Statsd type event for metrics
3030
| 'statsd'
31+
// Span
32+
| 'span'
3133
// Unknown data category
3234
| 'unknown';

packages/types/src/envelope.ts

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

1213
// Based on: https://develop.sentry.dev/sdk/envelopes/
1314

@@ -36,7 +37,8 @@ export type EnvelopeItemType =
3637
| 'replay_event'
3738
| 'replay_recording'
3839
| 'check_in'
39-
| 'statsd';
40+
| 'statsd'
41+
| 'span';
4042

4143
export type BaseEnvelopeHeaders = {
4244
[key: string]: unknown;
@@ -77,6 +79,7 @@ type ReplayRecordingItemHeaders = { type: 'replay_recording'; length: number };
7779
type CheckInItemHeaders = { type: 'check_in' };
7880
type StatsdItemHeaders = { type: 'statsd'; length: number };
7981
type ProfileItemHeaders = { type: 'profile' };
82+
type SpanItemHeaders = { type: 'span' };
8083

8184
// TODO (v8): Replace `Event` with `SerializedEvent`
8285
export type EventItem = BaseEnvelopeItem<EventItemHeaders, Event>;
@@ -93,13 +96,15 @@ type ReplayRecordingItem = BaseEnvelopeItem<ReplayRecordingItemHeaders, ReplayRe
9396
export type StatsdItem = BaseEnvelopeItem<StatsdItemHeaders, string>;
9497
export type FeedbackItem = BaseEnvelopeItem<FeedbackItemHeaders, FeedbackEvent>;
9598
export type ProfileItem = BaseEnvelopeItem<ProfileItemHeaders, Profile>;
99+
export type SpanItem = BaseEnvelopeItem<SpanItemHeaders, Span>;
96100

97101
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: DynamicSamplingContext };
98102
type SessionEnvelopeHeaders = { sent_at: string };
99103
type CheckInEnvelopeHeaders = { trace?: DynamicSamplingContext };
100104
type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders;
101105
type ReplayEnvelopeHeaders = BaseEnvelopeHeaders;
102106
type StatsdEnvelopeHeaders = BaseEnvelopeHeaders;
107+
type SpanEnvelopeHeaders = BaseEnvelopeHeaders;
103108

104109
export type EventEnvelope = BaseEnvelope<
105110
EventEnvelopeHeaders,
@@ -110,12 +115,14 @@ export type ClientReportEnvelope = BaseEnvelope<ClientReportEnvelopeHeaders, Cli
110115
export type ReplayEnvelope = [ReplayEnvelopeHeaders, [ReplayEventItem, ReplayRecordingItem]];
111116
export type CheckInEnvelope = BaseEnvelope<CheckInEnvelopeHeaders, CheckInItem>;
112117
export type StatsdEnvelope = BaseEnvelope<StatsdEnvelopeHeaders, StatsdItem>;
118+
export type SpanEnvelope = BaseEnvelope<SpanEnvelopeHeaders, SpanItem>;
113119

114120
export type Envelope =
115121
| EventEnvelope
116122
| SessionEnvelope
117123
| ClientReportEnvelope
118124
| ReplayEnvelope
119125
| CheckInEnvelope
120-
| StatsdEnvelope;
126+
| StatsdEnvelope
127+
| SpanEnvelope;
121128
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 } from './event';

packages/utils/src/envelope.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,9 @@ const ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record<EnvelopeItemType, DataCategory> = {
208208
replay_recording: 'replay',
209209
check_in: 'monitor',
210210
feedback: 'feedback',
211-
statsd: 'statsd',
211+
span: 'span',
212+
// TODO: This is a temporary workaround until we have a proper data category for metrics
213+
statsd: 'unknown',
212214
};
213215

214216
/**

0 commit comments

Comments
 (0)