diff --git a/packages/cloudflare/src/sdk.ts b/packages/cloudflare/src/sdk.ts index c7ef682aec86..d74ab861bb74 100644 --- a/packages/cloudflare/src/sdk.ts +++ b/packages/cloudflare/src/sdk.ts @@ -9,7 +9,6 @@ import { initAndBind, linkedErrorsIntegration, requestDataIntegration, - spanStreamingIntegration, stackParserFromStackParserOptions, } from '@sentry/core'; import type { CloudflareClientOptions, CloudflareOptions } from './client'; @@ -59,15 +58,10 @@ export function init(options: CloudflareOptions): CloudflareClient | undefined { const flushLock = options.ctx ? makeFlushLock(options.ctx) : undefined; delete options.ctx; - const resolvedIntegrations = getIntegrationsToSetup(options); - if (options.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) { - resolvedIntegrations.push(spanStreamingIntegration()); - } - const clientOptions: CloudflareClientOptions = { ...options, stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser), - integrations: resolvedIntegrations, + integrations: getIntegrationsToSetup(options), transport: options.transport || makeCloudflareTransport, flushLock, }; diff --git a/packages/core/src/server-runtime-client.ts b/packages/core/src/server-runtime-client.ts index 26ae3e80f3b1..9b1c2374e50a 100644 --- a/packages/core/src/server-runtime-client.ts +++ b/packages/core/src/server-runtime-client.ts @@ -2,6 +2,7 @@ import { createCheckInEnvelope } from './checkin'; import { Client } from './client'; import { getIsolationScope } from './currentScopes'; import { DEBUG_BUILD } from './debug-build'; +import { spanStreamingIntegration } from './integrations/spanStreaming'; import type { Scope } from './scope'; import { DEFAULT_TRANSPORT_BUFFER_SIZE } from './transports/base'; import { addUserAgentToTransportHeaders } from './transports/userAgent'; @@ -39,6 +40,13 @@ export class ServerRuntimeClient< public constructor(options: O) { addUserAgentToTransportHeaders(options); + // When span streaming is enabled (`traceLifecycle: 'stream'`), the `spanStreamingIntegration` + // is required to flush spans. We add it here so the individual server SDKs don't have to. + // A user-provided `spanStreamingIntegration` always takes precedence over the one we add. + if (options.traceLifecycle === 'stream' && !options.integrations.some(i => i.name === 'SpanStreaming')) { + options.integrations.push(spanStreamingIntegration()); + } + super(options); this._setUpMetricsProcessing(); diff --git a/packages/deno/src/sdk.ts b/packages/deno/src/sdk.ts index b3e80d117691..5846d5f02747 100644 --- a/packages/deno/src/sdk.ts +++ b/packages/deno/src/sdk.ts @@ -9,7 +9,6 @@ import { linkedErrorsIntegration, nodeStackLineParser, requestDataIntegration, - spanStreamingIntegration, stackParserFromStackParserOptions, } from '@sentry/core'; import { DenoClient } from './client'; @@ -118,15 +117,10 @@ export function init(options: DenoOptions = {}): Client { options.defaultIntegrations = getDefaultIntegrations(options); } - const resolvedIntegrations = getIntegrationsToSetup(options); - if (options.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) { - resolvedIntegrations.push(spanStreamingIntegration()); - } - const clientOptions: ServerRuntimeClientOptions = { ...options, stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser), - integrations: resolvedIntegrations, + integrations: getIntegrationsToSetup(options), transport: options.transport || makeFetchTransport, }; diff --git a/packages/node-core/src/light/sdk.ts b/packages/node-core/src/light/sdk.ts index 1d57da67a0ab..74564859f129 100644 --- a/packages/node-core/src/light/sdk.ts +++ b/packages/node-core/src/light/sdk.ts @@ -11,7 +11,6 @@ import { linkedErrorsIntegration, propagationContextFromHeaders, requestDataIntegration, - spanStreamingIntegration, stackParserFromStackParserOptions, } from '@sentry/core'; import { DEBUG_BUILD } from '../debug-build'; @@ -168,10 +167,6 @@ function getClientOptions( integrations, }); - if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) { - resolvedIntegrations.push(spanStreamingIntegration()); - } - return { ...mergedOptions, integrations: resolvedIntegrations, diff --git a/packages/node-core/src/sdk/index.ts b/packages/node-core/src/sdk/index.ts index 31493a273d4a..444f88702677 100644 --- a/packages/node-core/src/sdk/index.ts +++ b/packages/node-core/src/sdk/index.ts @@ -13,7 +13,6 @@ import { linkedErrorsIntegration, propagationContextFromHeaders, requestDataIntegration, - spanStreamingIntegration, stackParserFromStackParserOptions, } from '@sentry/core'; import { @@ -218,10 +217,6 @@ function getClientOptions( integrations, }); - if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) { - resolvedIntegrations.push(spanStreamingIntegration()); - } - return { ...mergedOptions, integrations: resolvedIntegrations, diff --git a/packages/vercel-edge/src/sdk.ts b/packages/vercel-edge/src/sdk.ts index be5ef0ea9403..f9f6f39b4612 100644 --- a/packages/vercel-edge/src/sdk.ts +++ b/packages/vercel-edge/src/sdk.ts @@ -16,7 +16,6 @@ import { linkedErrorsIntegration, nodeStackLineParser, requestDataIntegration, - spanStreamingIntegration, stackParserFromStackParserOptions, } from '@sentry/core'; import { @@ -93,15 +92,10 @@ export function init(options: VercelEdgeOptions = {}): Client | undefined { options.environment = options.environment || process.env.SENTRY_ENVIRONMENT || getVercelEnv(false) || process.env.NODE_ENV; - const resolvedIntegrations = getIntegrationsToSetup(options); - if (options.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) { - resolvedIntegrations.push(spanStreamingIntegration()); - } - const client = new VercelEdgeClient({ ...options, stackParser: stackParserFromStackParserOptions(options.stackParser || nodeStackParser), - integrations: resolvedIntegrations, + integrations: getIntegrationsToSetup(options), transport: options.transport || makeEdgeTransport, }); // The client is on the current scope, from where it generally is inherited