Skip to content

Commit 039f955

Browse files
feat!: add spanProcessors property (#460)
* feat!: add `spanProcessors` property * chore: update test * feat: export more types * refactor: remove `extraSpanProcessors`
1 parent e0c0016 commit 039f955

File tree

6 files changed

+65
-19
lines changed

6 files changed

+65
-19
lines changed

packages/otel/package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@
6565
"types": "./dist/instrumentations/fetch.d.ts",
6666
"default": "./dist/instrumentations/fetch.js"
6767
}
68+
},
69+
"./opentelemetry": {
70+
"require": {
71+
"types": "./dist/opentelemetry.d.cts",
72+
"default": "./dist/opentelemetry.cjs"
73+
},
74+
"import": {
75+
"types": "./dist/opentelemetry.d.ts",
76+
"default": "./dist/opentelemetry.js"
77+
},
78+
"default": {
79+
"types": "./dist/opentelemetry.d.ts",
80+
"default": "./dist/opentelemetry.js"
81+
}
6882
}
6983
},
7084
"files": [

packages/otel/src/bootstrap/main.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,26 @@ import type { Instrumentation } from '@opentelemetry/instrumentation'
33
import { GET_TRACER, SHUTDOWN_TRACERS } from '../constants.js'
44

55
export interface TracerProviderOptions {
6-
/**
7-
* The request headers (checked for presence of the `x-nf-enable-tracing` header)
8-
*/
9-
headers: Headers
106
serviceName: string
117
serviceVersion: string
128
deploymentEnvironment: string
139
siteUrl: string
1410
siteId: string
1511
siteName: string
1612
instrumentations?: (Instrumentation | Promise<Instrumentation>)[]
17-
extraSpanProcessors?: (SpanProcessor | Promise<SpanProcessor>)[]
13+
spanProcessors?: (SpanProcessor | Promise<SpanProcessor>)[]
1814
}
1915

2016
export const createTracerProvider = async (options: TracerProviderOptions) => {
21-
if (!options.headers.has('x-nf-enable-tracing')) {
22-
return
23-
}
2417
const { version: nodeVersion } = await import('node:process')
18+
2519
// remove the v prefix from the version to match the spec
2620
const runtimeVersion = nodeVersion.slice(1)
2721

2822
const { Resource } = await import('@opentelemetry/resources')
29-
const { NodeTracerProvider, SimpleSpanProcessor } = await import('@opentelemetry/sdk-trace-node')
30-
23+
const { NodeTracerProvider } = await import('@opentelemetry/sdk-trace-node')
3124
const { registerInstrumentations } = await import('@opentelemetry/instrumentation')
3225

33-
const { NetlifySpanExporter } = await import('../exporters/netlify.js')
34-
3526
const resource = new Resource({
3627
'service.name': options.serviceName,
3728
'service.version': options.serviceVersion,
@@ -43,12 +34,11 @@ export const createTracerProvider = async (options: TracerProviderOptions) => {
4334
'netlify.site.name': options.siteName,
4435
})
4536

37+
const spanProcessors = await Promise.all(options.spanProcessors ?? [await getBaseSpanProcessor()])
38+
4639
const nodeTracerProvider = new NodeTracerProvider({
4740
resource,
48-
spanProcessors: [
49-
new SimpleSpanProcessor(new NetlifySpanExporter()),
50-
...(await Promise.all(options.extraSpanProcessors ?? [])),
51-
],
41+
spanProcessors,
5242
})
5343

5444
nodeTracerProvider.register()
@@ -86,3 +76,10 @@ export const createTracerProvider = async (options: TracerProviderOptions) => {
8676
},
8777
})
8878
}
79+
80+
export const getBaseSpanProcessor = async (): Promise<SpanProcessor> => {
81+
const { SimpleSpanProcessor } = await import('@opentelemetry/sdk-trace-node')
82+
const { NetlifySpanExporter } = await import('../exporters/netlify.js')
83+
84+
return new SimpleSpanProcessor(new NetlifySpanExporter())
85+
}

packages/otel/src/main.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ describe('`getTracer` export', () => {
99
})
1010
test('Returns tracer if tracing has been previously activated', async () => {
1111
await createTracerProvider({
12-
headers: new Headers({ 'x-nf-enable-tracing': 'true' }),
1312
serviceName: 'test-service',
1413
serviceVersion: '1.0.0',
1514
deploymentEnvironment: 'test',
@@ -27,7 +26,6 @@ describe('`shutdownTracers` export', () => {
2726
})
2827
test('Returns undefined if tracing has been previously activated', async () => {
2928
await createTracerProvider({
30-
headers: new Headers({ 'x-nf-enable-tracing': 'true' }),
3129
serviceName: 'test-service',
3230
serviceVersion: '1.0.0',
3331
deploymentEnvironment: 'test',
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, test, expect } from 'vitest'
2+
import { SimpleSpanProcessor, BatchSpanProcessor } from './opentelemetry.js'
3+
4+
describe('OpenTelemetry exports', () => {
5+
test('exports SimpleSpanProcessor', () => {
6+
expect(SimpleSpanProcessor).toBeDefined()
7+
expect(typeof SimpleSpanProcessor).toBe('function')
8+
})
9+
10+
test('exports BatchSpanProcessor', () => {
11+
expect(BatchSpanProcessor).toBeDefined()
12+
expect(typeof BatchSpanProcessor).toBe('function')
13+
})
14+
})

packages/otel/src/opentelemetry.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Re-exports of commonly used OpenTelemetry primitives
3+
* This ensures version compatibility when building custom exporters and processors
4+
*/
5+
export type {
6+
Span,
7+
Context,
8+
Attributes,
9+
SpanContext,
10+
SpanKind,
11+
SpanStatus,
12+
SpanStatusCode,
13+
TimeInput,
14+
} from '@opentelemetry/api'
15+
export type { ExportResult, ExportResultCode } from '@opentelemetry/core'
16+
export { SimpleSpanProcessor, BatchSpanProcessor } from '@opentelemetry/sdk-trace-node'
17+
export type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-node'

packages/otel/tsup.config.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ export default defineConfig([
66
{
77
clean: true,
88
format: ['cjs', 'esm'],
9-
entry: ['src/bootstrap/main.ts', 'src/main.ts', 'src/exporters/netlify.ts', 'src/instrumentations/fetch.ts'],
9+
entry: [
10+
'src/bootstrap/main.ts',
11+
'src/main.ts',
12+
'src/exporters/netlify.ts',
13+
'src/instrumentations/fetch.ts',
14+
'src/opentelemetry.ts',
15+
],
1016
tsconfig: 'tsconfig.json',
1117
splitting: false,
1218
bundle: true,

0 commit comments

Comments
 (0)