From 291827e4bb202e71ba89d2e315bda93eaa0d5d7a Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 25 Nov 2025 20:00:23 -0500 Subject: [PATCH 1/3] fix: prevent multiple instances of the tracer provider --- packages/otel/src/bootstrap/main.ts | 8 ++++++-- packages/otel/src/main.ts | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/otel/src/bootstrap/main.ts b/packages/otel/src/bootstrap/main.ts index ded32a93..5fedc5fe 100644 --- a/packages/otel/src/bootstrap/main.ts +++ b/packages/otel/src/bootstrap/main.ts @@ -1,4 +1,6 @@ -import { trace } from '@opentelemetry/api' +import process from 'node:process' + +import { trace } from '@opentelemetry/api/trace-api' import { SugaredTracer } from '@opentelemetry/api/experimental' import { Resource } from '@opentelemetry/resources' import { type Instrumentation, registerInstrumentations } from '@opentelemetry/instrumentation' @@ -8,7 +10,6 @@ import { NodeTracerProvider, SimpleSpanProcessor, type SpanProcessor } from '@op import { GET_TRACER, SHUTDOWN_TRACERS } from '../constants.js' import { NetlifySpanExporter } from '../exporters/netlify.js' import packageJson from '../../package.json' with { type: 'json' } -import process from 'node:process' export interface TracerProviderOptions { serviceName: string @@ -22,6 +23,9 @@ export interface TracerProviderOptions { } export const createTracerProvider = (options: TracerProviderOptions) => { + // Prevent multiple tracers from being created + if (Object.getOwnPropertyNames(globalThis).includes(GET_TRACER)) return + // remove the v prefix from the version to match the spec const runtimeVersion = process.version.slice(1) diff --git a/packages/otel/src/main.ts b/packages/otel/src/main.ts index 67befeca..cb20d3a9 100644 --- a/packages/otel/src/main.ts +++ b/packages/otel/src/main.ts @@ -1,6 +1,7 @@ -import { type SugaredSpanOptions, type SugaredTracer } from '@opentelemetry/api/experimental' -import { GET_TRACER, SHUTDOWN_TRACERS } from './constants.js' import type { Context, Span } from '@opentelemetry/api' +import type { SugaredSpanOptions, SugaredTracer } from '@opentelemetry/api/experimental' + +import { GET_TRACER, SHUTDOWN_TRACERS } from './constants.js' type GlobalThisExtended = typeof globalThis & { [GET_TRACER]?: (name?: string, version?: string) => SugaredTracer | undefined From 4b024a40dffa8d32948c5626c5e8592069a5af05 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Wed, 26 Nov 2025 09:55:40 -0500 Subject: [PATCH 2/3] fix: fetch property directly --- packages/otel/src/bootstrap/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/otel/src/bootstrap/main.ts b/packages/otel/src/bootstrap/main.ts index 5fedc5fe..986bda95 100644 --- a/packages/otel/src/bootstrap/main.ts +++ b/packages/otel/src/bootstrap/main.ts @@ -24,7 +24,7 @@ export interface TracerProviderOptions { export const createTracerProvider = (options: TracerProviderOptions) => { // Prevent multiple tracers from being created - if (Object.getOwnPropertyNames(globalThis).includes(GET_TRACER)) return + if (Object.prototype.hasOwnProperty.call(globalThis, GET_TRACER)) return // remove the v prefix from the version to match the spec const runtimeVersion = process.version.slice(1) From a71f912804001f71f080f84d721f01b0151e2004 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Wed, 26 Nov 2025 10:34:29 -0500 Subject: [PATCH 3/3] fix: typo in import --- packages/otel/src/bootstrap/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/otel/src/bootstrap/main.ts b/packages/otel/src/bootstrap/main.ts index 986bda95..36d5d54f 100644 --- a/packages/otel/src/bootstrap/main.ts +++ b/packages/otel/src/bootstrap/main.ts @@ -1,6 +1,6 @@ import process from 'node:process' -import { trace } from '@opentelemetry/api/trace-api' +import { trace } from '@opentelemetry/api' import { SugaredTracer } from '@opentelemetry/api/experimental' import { Resource } from '@opentelemetry/resources' import { type Instrumentation, registerInstrumentations } from '@opentelemetry/instrumentation'