From 29da4358321baf3485e2e004c1a1e52ce74d3d6c Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 11 Nov 2025 00:38:42 -0500 Subject: [PATCH 1/2] feat!: use static imports --- packages/otel/src/bootstrap/main.ts | 42 +++++++++++++---------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/packages/otel/src/bootstrap/main.ts b/packages/otel/src/bootstrap/main.ts index 7b2eb337..ded32a93 100644 --- a/packages/otel/src/bootstrap/main.ts +++ b/packages/otel/src/bootstrap/main.ts @@ -1,6 +1,14 @@ -import { type SpanProcessor } from '@opentelemetry/sdk-trace-node' -import type { Instrumentation } from '@opentelemetry/instrumentation' +import { trace } from '@opentelemetry/api' +import { SugaredTracer } from '@opentelemetry/api/experimental' +import { Resource } from '@opentelemetry/resources' +import { type Instrumentation, registerInstrumentations } from '@opentelemetry/instrumentation' +import { W3CTraceContextPropagator } from '@opentelemetry/core' +import { NodeTracerProvider, SimpleSpanProcessor, type SpanProcessor } from '@opentelemetry/sdk-trace-node' + 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 @@ -9,20 +17,13 @@ export interface TracerProviderOptions { siteUrl: string siteId: string siteName: string - instrumentations?: (Instrumentation | Promise)[] - spanProcessors?: (SpanProcessor | Promise)[] + instrumentations?: Instrumentation[] + spanProcessors?: SpanProcessor[] } -export const createTracerProvider = async (options: TracerProviderOptions) => { - const { version: nodeVersion } = await import('node:process') - +export const createTracerProvider = (options: TracerProviderOptions) => { // remove the v prefix from the version to match the spec - const runtimeVersion = nodeVersion.slice(1) - - const { W3CTraceContextPropagator } = await import('@opentelemetry/core') - const { Resource } = await import('@opentelemetry/resources') - const { NodeTracerProvider } = await import('@opentelemetry/sdk-trace-node') - const { registerInstrumentations } = await import('@opentelemetry/instrumentation') + const runtimeVersion = process.version.slice(1) const resource = new Resource({ 'service.name': options.serviceName, @@ -35,7 +36,7 @@ export const createTracerProvider = async (options: TracerProviderOptions) => { 'netlify.site.name': options.siteName, }) - const spanProcessors = await Promise.all(options.spanProcessors ?? [await getBaseSpanProcessor()]) + const spanProcessors = options.spanProcessors ?? [getBaseSpanProcessor()] const nodeTracerProvider = new NodeTracerProvider({ resource, @@ -46,17 +47,13 @@ export const createTracerProvider = async (options: TracerProviderOptions) => { propagator: new W3CTraceContextPropagator(), }) - const instrumentations = await Promise.all(options.instrumentations ?? []) + const instrumentations = options.instrumentations ?? [] registerInstrumentations({ instrumentations, tracerProvider: nodeTracerProvider, }) - const { trace } = await import('@opentelemetry/api') - const { SugaredTracer } = await import('@opentelemetry/api/experimental') - const { default: pkg } = await import('../../package.json', { with: { type: 'json' } }) - Object.defineProperty(globalThis, GET_TRACER, { enumerable: false, configurable: true, @@ -66,7 +63,7 @@ export const createTracerProvider = async (options: TracerProviderOptions) => { return new SugaredTracer(trace.getTracer(name, version)) } - return new SugaredTracer(trace.getTracer(pkg.name, pkg.version)) + return new SugaredTracer(trace.getTracer(packageJson.name, packageJson.version)) }, }) @@ -80,9 +77,6 @@ export const createTracerProvider = async (options: TracerProviderOptions) => { }) } -export const getBaseSpanProcessor = async (): Promise => { - const { SimpleSpanProcessor } = await import('@opentelemetry/sdk-trace-node') - const { NetlifySpanExporter } = await import('../exporters/netlify.js') - +export const getBaseSpanProcessor = (): SpanProcessor => { return new SimpleSpanProcessor(new NetlifySpanExporter()) } From 5ae01639e7a50130e1872853df07ca5b62816c49 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Wed, 12 Nov 2025 09:12:25 -0500 Subject: [PATCH 2/2] test: update createTracerProvider references --- packages/otel/src/instrumentations/fetch.test.ts | 8 +++----- packages/otel/src/main.test.ts | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/otel/src/instrumentations/fetch.test.ts b/packages/otel/src/instrumentations/fetch.test.ts index 37c7428b..ca216149 100644 --- a/packages/otel/src/instrumentations/fetch.test.ts +++ b/packages/otel/src/instrumentations/fetch.test.ts @@ -95,9 +95,8 @@ describe('patched fetch', () => { server.listen({ onUnhandledRequest: 'error' }) }) - beforeEach(async () => { - await createTracerProvider({ - headers: new Headers({ 'x-nf-enable-tracing': 'true' }), + beforeEach(() => { + createTracerProvider({ serviceName: 'test-service', serviceVersion: '1.0.0', deploymentEnvironment: 'test', @@ -118,8 +117,7 @@ describe('patched fetch', () => { }) it('can GET url', async () => { - await createTracerProvider({ - headers: new Headers({ 'x-nf-enable-tracing': 'true' }), + createTracerProvider({ serviceName: 'test-service', serviceVersion: '1.0.0', deploymentEnvironment: 'test', diff --git a/packages/otel/src/main.test.ts b/packages/otel/src/main.test.ts index 0b64c38a..31b6af3d 100644 --- a/packages/otel/src/main.test.ts +++ b/packages/otel/src/main.test.ts @@ -7,8 +7,8 @@ describe('`getTracer` export', () => { test('Returns undefined if tracing has not been previously activated', () => { expect(getTracer()).toBeUndefined() }) - test('Returns tracer if tracing has been previously activated', async () => { - await createTracerProvider({ + test('Returns tracer if tracing has been previously activated', () => { + createTracerProvider({ serviceName: 'test-service', serviceVersion: '1.0.0', deploymentEnvironment: 'test', @@ -25,7 +25,7 @@ describe('`shutdownTracers` export', () => { await expect(shutdownTracers()).resolves.toBeUndefined() }) test('Returns undefined if tracing has been previously activated', async () => { - await createTracerProvider({ + createTracerProvider({ serviceName: 'test-service', serviceVersion: '1.0.0', deploymentEnvironment: 'test',