Skip to content

Commit a544d2d

Browse files
authored
feat(core): Emit sentry.sdk.integrations on streamed segment spans (#20428)
In the classic (non-streaming) pipeline, SDK integrations are sets on the transaction event wrapper via `event.sdk.integrations`. In the streaming path this metadata is currently missing. This PR sets `sentry.sdk.integrations` on streamed segment spans.
1 parent c9923d2 commit a544d2d

13 files changed

Lines changed: 151 additions & 5 deletions

File tree

dev-packages/browser-integration-tests/suites/public-api/startSpan/streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
SEMANTIC_ATTRIBUTE_SENTRY_OP,
55
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
66
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
7+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
78
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
89
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
910
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
@@ -209,6 +210,10 @@ sentryTest(
209210
type: 'string',
210211
value: SDK_VERSION,
211212
},
213+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
214+
type: 'array',
215+
value: expect.arrayContaining(['SpanStreaming']),
216+
},
212217
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: {
213218
type: 'string',
214219
value: segmentSpanId,

dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions-streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,
55
SEMANTIC_ATTRIBUTE_SENTRY_OP,
66
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
7+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
78
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
89
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
910
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
@@ -80,6 +81,10 @@ sentryTest('captures streamed interaction span tree. @firefox', async ({ browser
8081
type: 'string',
8182
value: SDK_VERSION,
8283
},
84+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
85+
type: 'array',
86+
value: expect.arrayContaining(['BrowserTracing', 'SpanStreaming']),
87+
},
8388
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: {
8489
type: 'string',
8590
value: interactionSegmentSpan!.span_id,

dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
SEMANTIC_ATTRIBUTE_SENTRY_OP,
55
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
66
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
7+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
78
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
89
} from '@sentry/core';
910
import { sentryTest } from '../../../../utils/fixtures';
@@ -131,6 +132,10 @@ sentryTest('starts a streamed navigation span on page navigation', async ({ brow
131132
type: 'string',
132133
value: SDK_VERSION,
133134
},
135+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
136+
type: 'array',
137+
value: expect.arrayContaining(['BrowserTracing', 'SpanStreaming']),
138+
},
134139
'sentry.segment.id': {
135140
type: 'string',
136141
value: navigationSpan.span_id,

dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/pageload-streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
SEMANTIC_ATTRIBUTE_SENTRY_OP,
55
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
66
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
7+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
78
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
89
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
910
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
@@ -138,6 +139,10 @@ sentryTest(
138139
type: 'string',
139140
value: SDK_VERSION,
140141
},
142+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
143+
type: 'array',
144+
value: expect.arrayContaining(['BrowserTracing', 'SpanStreaming']),
145+
},
141146
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: {
142147
type: 'string',
143148
value: pageloadSpan?.span_id,

dev-packages/cloudflare-integration-tests/suites/public-api/startSpan-streamed/test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import type { Envelope, SerializedStreamedSpanContainer } from '@sentry/core';
22
import {
33
SDK_VERSION,
44
SEMANTIC_ATTRIBUTE_SENTRY_OP,
5+
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
56
SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,
7+
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
8+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
69
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
710
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
811
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
912
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,
10-
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
11-
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
1213
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
1314
} from '@sentry/core';
1415
import { expect, it } from 'vitest';
@@ -175,6 +176,10 @@ it('sends a streamed span envelope with correct spans for a manually started spa
175176
attributes: {
176177
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: CLOUDFLARE_SDK },
177178
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION },
179+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
180+
type: 'array',
181+
value: expect.arrayContaining(['SpanStreaming']),
182+
},
178183
[SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: { type: 'string', value: '1.0.0' },
179184
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: { type: 'string', value: 'auto.http.cloudflare' },
180185
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId },

dev-packages/e2e-tests/test-applications/deno-streamed/tests/spans.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ const SEGMENT_SPAN = {
9595
type: 'string',
9696
value: expect.any(String),
9797
},
98+
'sentry.sdk.integrations': {
99+
type: 'array',
100+
value: expect.arrayContaining(['SpanStreaming']),
101+
},
98102
'sentry.segment.id': {
99103
type: 'string',
100104
value: expect.stringMatching(/^[\da-f]{16}$/),

dev-packages/node-core-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
SEMANTIC_ATTRIBUTE_SENTRY_OP,
44
SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,
55
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
6+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
67
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
78
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
89
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
@@ -128,6 +129,10 @@ test('sends a streamed span envelope with correct spans for a manually started s
128129
[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: { type: 'integer', value: 1 },
129130
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node-core' },
130131
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION },
132+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
133+
type: 'array',
134+
value: expect.arrayContaining(['SpanStreaming']),
135+
},
131136
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId },
132137
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: { type: 'string', value: 'test-span' },
133138
[SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: { type: 'string', value: '1.0.0' },

dev-packages/node-integration-tests/suites/public-api/startSpan/basic-usage-streamed/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
SEMANTIC_ATTRIBUTE_SENTRY_OP,
44
SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,
55
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
6+
SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,
67
SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,
78
SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,
89
SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,
@@ -128,6 +129,10 @@ test('sends a streamed span envelope with correct spans for a manually started s
128129
[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: { type: 'integer', value: 1 },
129130
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: { type: 'string', value: 'sentry.javascript.node' },
130131
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: { type: 'string', value: SDK_VERSION },
132+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
133+
type: 'array',
134+
value: expect.arrayContaining(['SpanStreaming']),
135+
},
131136
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: { type: 'string', value: segmentSpanId },
132137
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: { type: 'string', value: 'test-span' },
133138
[SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: { type: 'string', value: '1.0.0' },

packages/browser/test/integrations/spanstreaming.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as SentryCore from '@sentry/core/browser';
2-
import { debug } from '@sentry/core/browser';
2+
import { debug, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS } from '@sentry/core/browser';
33
import { beforeEach, describe, expect, it, vi } from 'vitest';
44
import { BrowserClient, spanStreamingIntegration } from '../../src';
55
import { getDefaultBrowserClientOptions } from '../helper/browser-client-options';
@@ -145,6 +145,10 @@ describe('spanStreamingIntegration', () => {
145145
type: 'string',
146146
value: expect.any(String),
147147
},
148+
[SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: {
149+
type: 'array',
150+
value: ['SpanStreaming'],
151+
},
148152
'sentry.segment.id': {
149153
type: 'string',
150154
value: span.spanContext().spanId,

packages/core/src/client.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,13 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
500500
return this._integrations[integrationName] as T | undefined;
501501
}
502502

503+
/**
504+
* Returns the names of all installed integrations.
505+
*/
506+
public getIntegrationNames(): string[] {
507+
return Object.keys(this._integrations);
508+
}
509+
503510
/**
504511
* Add an integration to the client.
505512
* This can be used to e.g. lazy load integrations.
@@ -1302,8 +1309,8 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
13021309
isolationScope: Scope,
13031310
): PromiseLike<Event | null> {
13041311
const options = this.getOptions();
1305-
const integrations = Object.keys(this._integrations);
1306-
if (!hint.integrations && integrations?.length) {
1312+
const integrations = this.getIntegrationNames();
1313+
if (!hint.integrations && integrations.length) {
13071314
hint.integrations = integrations;
13081315
}
13091316

0 commit comments

Comments
 (0)