From 87a30fd0411a7903ebbd64820c6889e2f5b3af0a Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Wed, 28 Oct 2026 14:23:25 -0700 Subject: [PATCH] chore(deps): replace deprecated OpenTelemetry trace SDK packages with @opentelemetry/sdk-trace @opentelemetry/sdk-trace-base and @opentelemetry/sdk-trace-node are deprecated in favor of @opentelemetry/sdk-trace. Import the trace SDK from @opentelemetry/sdk-trace 2.10.0, matching the installed core and resources 2.10.0 and staying on @opentelemetry/api 1.9.x so the global API stays shared with the Trigger.dev runtime. BatchSpanProcessor and SimpleSpanProcessor take an options object with the exporter, and BasicTracerProvider is TracerProvider. Every batch option is set explicitly, so the dropped OTEL_BSP_* environment fallbacks change nothing. --- apps/sim/app/api/copilot/chat/stream/route.test.ts | 8 ++------ apps/sim/instrumentation-node.ts | 10 +++++----- apps/sim/lib/mothership/observability/timing.test.ts | 8 ++------ .../lib/mothership/request/lifecycle/headless.test.ts | 4 ++-- .../sim/lib/mothership/request/lifecycle/start.test.ts | 4 ++-- .../request/session/replay-budget.integration.ts | 4 ++-- apps/sim/package.json | 3 +-- bun.lock | 3 +-- 8 files changed, 17 insertions(+), 27 deletions(-) diff --git a/apps/sim/app/api/copilot/chat/stream/route.test.ts b/apps/sim/app/api/copilot/chat/stream/route.test.ts index fc0e429a189..edcdaac695c 100644 --- a/apps/sim/app/api/copilot/chat/stream/route.test.ts +++ b/apps/sim/app/api/copilot/chat/stream/route.test.ts @@ -1,9 +1,5 @@ import { trace } from '@opentelemetry/api' -import { - BasicTracerProvider, - InMemorySpanExporter, - SimpleSpanProcessor, -} from '@opentelemetry/sdk-trace-base' +import { InMemorySpanExporter, SimpleSpanProcessor, TracerProvider } from '@opentelemetry/sdk-trace' import { authMockFns } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -209,7 +205,7 @@ describe('copilot chat stream replay route', () => { it('ends a still-running replay at its cap without a terminal so the client re-attaches', async () => { const exporter = new InMemorySpanExporter() trace.setGlobalTracerProvider( - new BasicTracerProvider({ spanProcessors: [new SimpleSpanProcessor(exporter)] }) + new TracerProvider({ spanProcessors: [new SimpleSpanProcessor({ exporter })] }) ) vi.useFakeTimers() getLatestRunForStream.mockResolvedValue({ diff --git a/apps/sim/instrumentation-node.ts b/apps/sim/instrumentation-node.ts index fa33c50b228..ccf71fe631c 100644 --- a/apps/sim/instrumentation-node.ts +++ b/apps/sim/instrumentation-node.ts @@ -11,7 +11,7 @@ import type { SamplingResult, Span, SpanProcessor, -} from '@opentelemetry/sdk-trace-base' +} from '@opentelemetry/sdk-trace' import { createLogger } from '@sim/logger' import { TraceAttr } from '@/lib/mothership/generated/trace-attributes-v1' import { env } from './lib/core/config/env' @@ -181,9 +181,8 @@ async function initializeOpenTelemetry() { const { PeriodicExportingMetricReader } = await import('@opentelemetry/sdk-metrics') const { OTLPLogExporter } = await import('@opentelemetry/exporter-logs-otlp-http') const { BatchLogRecordProcessor } = await import('@opentelemetry/sdk-logs') - const { BatchSpanProcessor } = await import('@opentelemetry/sdk-trace-node') - const { TraceIdRatioBasedSampler, SamplingDecision } = await import( - '@opentelemetry/sdk-trace-base' + const { BatchSpanProcessor, TraceIdRatioBasedSampler, SamplingDecision } = await import( + '@opentelemetry/sdk-trace' ) // Drops Next framework spans, inherits SAMPLED from business @@ -255,7 +254,8 @@ async function initializeOpenTelemetry() { }) } - const batchProcessor = new BatchSpanProcessor(exporter, { + const batchProcessor = new BatchSpanProcessor({ + exporter, maxQueueSize: telemetryConfig.batchSettings.maxQueueSize, maxExportBatchSize: telemetryConfig.batchSettings.maxExportBatchSize, scheduledDelayMillis: telemetryConfig.batchSettings.scheduledDelayMillis, diff --git a/apps/sim/lib/mothership/observability/timing.test.ts b/apps/sim/lib/mothership/observability/timing.test.ts index 5d87063eb05..fef1e7bb7e7 100644 --- a/apps/sim/lib/mothership/observability/timing.test.ts +++ b/apps/sim/lib/mothership/observability/timing.test.ts @@ -1,10 +1,6 @@ import { context, SpanStatusCode, trace } from '@opentelemetry/api' import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks' -import { - BasicTracerProvider, - InMemorySpanExporter, - SimpleSpanProcessor, -} from '@opentelemetry/sdk-trace-base' +import { InMemorySpanExporter, SimpleSpanProcessor, TracerProvider } from '@opentelemetry/sdk-trace' import { dbChainMockFns } from '@sim/testing/mocks/database.mock' import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' import { createTracedCliTransport } from '@/lib/mothership/agent-cli/traced-transport' @@ -17,7 +13,7 @@ const transaction = dbChainMockFns.transaction describe('Mothership boundary timing', () => { const exporter = new InMemorySpanExporter() - const provider = new BasicTracerProvider({ spanProcessors: [new SimpleSpanProcessor(exporter)] }) + const provider = new TracerProvider({ spanProcessors: [new SimpleSpanProcessor({ exporter })] }) const manager = new AsyncLocalStorageContextManager() beforeAll(() => { diff --git a/apps/sim/lib/mothership/request/lifecycle/headless.test.ts b/apps/sim/lib/mothership/request/lifecycle/headless.test.ts index 14976927672..43f5f801369 100644 --- a/apps/sim/lib/mothership/request/lifecycle/headless.test.ts +++ b/apps/sim/lib/mothership/request/lifecycle/headless.test.ts @@ -1,6 +1,6 @@ import { propagation, trace } from '@opentelemetry/api' import { W3CTraceContextPropagator } from '@opentelemetry/core' -import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base' +import { TracerProvider } from '@opentelemetry/sdk-trace' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { OrchestratorResult } from '@/lib/mothership/request/types' @@ -27,7 +27,7 @@ function createLifecycleResult(overrides?: Partial): Orchest describe('runHeadlessCopilotLifecycle', () => { beforeEach(() => { - trace.setGlobalTracerProvider(new BasicTracerProvider()) + trace.setGlobalTracerProvider(new TracerProvider()) propagation.setGlobalPropagator(new W3CTraceContextPropagator()) }) diff --git a/apps/sim/lib/mothership/request/lifecycle/start.test.ts b/apps/sim/lib/mothership/request/lifecycle/start.test.ts index 0510aaa6fdc..d547cf46957 100644 --- a/apps/sim/lib/mothership/request/lifecycle/start.test.ts +++ b/apps/sim/lib/mothership/request/lifecycle/start.test.ts @@ -1,6 +1,6 @@ import { propagation, trace } from '@opentelemetry/api' import { W3CTraceContextPropagator } from '@opentelemetry/core' -import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base' +import { TracerProvider } from '@opentelemetry/sdk-trace' import { dbChainMockFns, resetDbChainMock, resetEnvFlagsMock, setEnvFlags } from '@sim/testing' import { billingAttributionMock, @@ -187,7 +187,7 @@ describe('createSSEStream terminal error handling', () => { }, }) ) - trace.setGlobalTracerProvider(new BasicTracerProvider()) + trace.setGlobalTracerProvider(new TracerProvider()) propagation.setGlobalPropagator(new W3CTraceContextPropagator()) vi.stubGlobal( 'fetch', diff --git a/apps/sim/lib/mothership/request/session/replay-budget.integration.ts b/apps/sim/lib/mothership/request/session/replay-budget.integration.ts index d24837d9f7d..51a94f73518 100644 --- a/apps/sim/lib/mothership/request/session/replay-budget.integration.ts +++ b/apps/sim/lib/mothership/request/session/replay-budget.integration.ts @@ -132,7 +132,7 @@ vi.mock('@/lib/mothership/request/lifecycle/run', () => ({ })) import { trace } from '@opentelemetry/api' -import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base' +import { TracerProvider } from '@opentelemetry/sdk-trace' import { db } from '@sim/db' import { copilotChats, copilotRuns, permissions, user, workflow, workspace } from '@sim/db/schema' import { generateId } from '@sim/utils/id' @@ -513,7 +513,7 @@ describe.runIf(Boolean(redisUrl))('a turn whose stream exhausts its replay budge beforeAll(() => { trace.disable() trace.setGlobalTracerProvider( - new BasicTracerProvider({ + new TracerProvider({ spanProcessors: [ { onStart: () => {}, diff --git a/apps/sim/package.json b/apps/sim/package.json index dc0d465d8fd..1f33dc7c00c 100644 --- a/apps/sim/package.json +++ b/apps/sim/package.json @@ -115,8 +115,7 @@ "@opentelemetry/sdk-logs": "0.221.0", "@opentelemetry/sdk-metrics": "2.10.0", "@opentelemetry/sdk-node": "0.221.0", - "@opentelemetry/sdk-trace-base": "2.10.0", - "@opentelemetry/sdk-trace-node": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", "@opentelemetry/semantic-conventions": "^1.32.0", "@radix-ui/react-avatar": "1.3.1", "@radix-ui/react-checkbox": "1.4.1", diff --git a/bun.lock b/bun.lock index 37837c8a373..a682761e128 100644 --- a/bun.lock +++ b/bun.lock @@ -229,8 +229,7 @@ "@opentelemetry/sdk-logs": "0.221.0", "@opentelemetry/sdk-metrics": "2.10.0", "@opentelemetry/sdk-node": "0.221.0", - "@opentelemetry/sdk-trace-base": "2.10.0", - "@opentelemetry/sdk-trace-node": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", "@opentelemetry/semantic-conventions": "^1.32.0", "@radix-ui/react-avatar": "1.3.1", "@radix-ui/react-checkbox": "1.4.1",