Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 18 additions & 24 deletions packages/otel/src/bootstrap/main.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -9,20 +17,13 @@ export interface TracerProviderOptions {
siteUrl: string
siteId: string
siteName: string
instrumentations?: (Instrumentation | Promise<Instrumentation>)[]
spanProcessors?: (SpanProcessor | Promise<SpanProcessor>)[]
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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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))
},
})

Expand All @@ -80,9 +77,6 @@ export const createTracerProvider = async (options: TracerProviderOptions) => {
})
}

export const getBaseSpanProcessor = async (): Promise<SpanProcessor> => {
const { SimpleSpanProcessor } = await import('@opentelemetry/sdk-trace-node')
const { NetlifySpanExporter } = await import('../exporters/netlify.js')

export const getBaseSpanProcessor = (): SpanProcessor => {
return new SimpleSpanProcessor(new NetlifySpanExporter())
}
8 changes: 3 additions & 5 deletions packages/otel/src/instrumentations/fetch.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
Expand Down
6 changes: 3 additions & 3 deletions packages/otel/src/main.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
Expand Down
Loading