diff --git a/packages/otel/src/bootstrap/main.ts b/packages/otel/src/bootstrap/main.ts index ded32a93..36d5d54f 100644 --- a/packages/otel/src/bootstrap/main.ts +++ b/packages/otel/src/bootstrap/main.ts @@ -1,3 +1,5 @@ +import process from 'node:process' + import { trace } from '@opentelemetry/api' import { SugaredTracer } from '@opentelemetry/api/experimental' import { Resource } from '@opentelemetry/resources' @@ -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.prototype.hasOwnProperty.call(globalThis, 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