Skip to content

Commit 694c5b3

Browse files
committed
feat: implement client trace initialization with runtime configuration
1 parent 51721cb commit 694c5b3

1 file changed

Lines changed: 43 additions & 29 deletions

File tree

src/packages/core/src/util/open-telemetry-traces.ts

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,67 @@ import {OTLPTraceExporter} from '@opentelemetry/exporter-trace-otlp-http'
22
import {WebTracerProvider} from '@opentelemetry/sdk-trace-web'
33
import {BatchSpanProcessor} from '@opentelemetry/sdk-trace-base'
44
import {XMLHttpRequestInstrumentation} from '@opentelemetry/instrumentation-xml-http-request'
5-
import {resource, serverResource} from "@core/util/open-telemetry"
5+
import {buildClientResource, ClientOtelConfig, serverResource} from "@core/util/open-telemetry"
66
import {registerInstrumentations} from '@opentelemetry/instrumentation'
77
import {FetchInstrumentation} from '@opentelemetry/instrumentation-fetch'
88
import {ZoneContextManager} from '@opentelemetry/context-zone'
9+
import {trace} from "@opentelemetry/api"
910
import {parseHeaders} from "@core/util/headers";
1011

1112
export const openTelemetryServerTracesReader = process.env.OTEL_TRACES_ENDPOINT ? new OTLPTraceExporter({
1213
url: process.env.OTEL_TRACES_ENDPOINT,
1314
headers: parseHeaders(process.env.OTEL_HEADER),
1415
}) : undefined
1516

16-
export const openTelemetryClientTracesReader = process.env.NEXT_PUBLIC_OTEL_TRACES_ENDPOINT ? new OTLPTraceExporter({
17-
url: process.env.NEXT_PUBLIC_OTEL_TRACES_ENDPOINT || "",
18-
headers: parseHeaders(process.env.NEXT_PUBLIC_OTEL_HEADER),
19-
}) : undefined
20-
2117
export const openTelemetryServerTracesProvider = openTelemetryServerTracesReader ? new WebTracerProvider({
2218
resource: serverResource,
2319
spanProcessors: [new BatchSpanProcessor(openTelemetryServerTracesReader)],
2420
}) : undefined
2521

26-
export const openTelemetryClientTracesProvider = openTelemetryClientTracesReader ? new WebTracerProvider({
27-
resource: resource,
28-
spanProcessors: [new BatchSpanProcessor(openTelemetryClientTracesReader)],
29-
}) : undefined
30-
31-
export default (level: 'server' | "client" = "server") => {
22+
export default () => {
3223

33-
if (level === 'server' && openTelemetryServerTracesProvider) {
24+
if (openTelemetryServerTracesProvider) {
3425
openTelemetryServerTracesProvider.register({
3526
contextManager: new ZoneContextManager(),
3627
})
37-
} else if (level === 'client' && openTelemetryClientTracesProvider) {
38-
openTelemetryClientTracesProvider.register({
39-
contextManager: new ZoneContextManager(),
40-
})
41-
42-
registerInstrumentations({
43-
instrumentations: [
44-
new FetchInstrumentation({
45-
propagateTraceHeaderCorsUrls: /.*/,
46-
}),
47-
new XMLHttpRequestInstrumentation({
48-
propagateTraceHeaderCorsUrls: /.*/,
49-
}),
50-
],
51-
})
5228
}
29+
}
30+
31+
/**
32+
* Builds and registers the browser trace provider from runtime configuration.
33+
* Returns the provider so the caller can install it as the global tracer
34+
* provider, or undefined when tracing is not configured.
35+
*/
36+
export const initializeClientTraces = (config: ClientOtelConfig) => {
37+
38+
if (!config.tracesEndpoint) return undefined
39+
40+
const exporter = new OTLPTraceExporter({
41+
url: config.tracesEndpoint,
42+
headers: parseHeaders(config.header ?? undefined),
43+
})
44+
45+
const provider = new WebTracerProvider({
46+
resource: buildClientResource(config),
47+
spanProcessors: [new BatchSpanProcessor(exporter)],
48+
})
49+
50+
provider.register({
51+
contextManager: new ZoneContextManager(),
52+
})
53+
54+
registerInstrumentations({
55+
instrumentations: [
56+
new FetchInstrumentation({
57+
propagateTraceHeaderCorsUrls: /.*/,
58+
}),
59+
new XMLHttpRequestInstrumentation({
60+
propagateTraceHeaderCorsUrls: /.*/,
61+
}),
62+
],
63+
})
64+
65+
trace.setGlobalTracerProvider(provider)
5366

54-
}
67+
return provider
68+
}

0 commit comments

Comments
 (0)