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()) } 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',