11import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http"
22import { BatchLogRecordProcessor , LoggerProvider } from "@opentelemetry/sdk-logs"
3- import { resource , serverResource } from "@core/util/open-telemetry"
3+ import { buildClientResource , ClientOtelConfig , serverResource } from "@core/util/open-telemetry"
44import { recordException } from "@core/util/open-telemetry-exceptions"
5+ import { logs } from "@opentelemetry/api-logs"
56import { parseHeaders } from "@core/util/headers" ;
67
78export const openTelemetryServerLogsReader = process . env . OTEL_LOGS_ENDPOINT ? new OTLPLogExporter ( {
89 url : process . env . OTEL_LOGS_ENDPOINT ,
910 headers : parseHeaders ( process . env . OTEL_HEADER ) ,
1011} ) : undefined
1112
12- export const openTelemetryClientLogsReader = process . env . NEXT_PUBLIC_OTEL_LOGS_ENDPOINT ? new OTLPLogExporter ( {
13- url : process . env . NEXT_PUBLIC_OTEL_LOGS_ENDPOINT ,
14- headers : parseHeaders ( process . env . NEXT_PUBLIC_OTEL_HEADER ) ,
15- } ) : undefined
16-
1713export const openTelemetryServerLogsProvider = openTelemetryServerLogsReader ? new LoggerProvider ( {
1814 resource : serverResource ,
1915 processors : [ new BatchLogRecordProcessor ( openTelemetryServerLogsReader ) ]
2016} ) : undefined
2117
22- export const openTelemetryClientLogsProvider = openTelemetryClientLogsReader ? new LoggerProvider ( {
23- resource : resource ,
24- processors : [ new BatchLogRecordProcessor ( openTelemetryClientLogsReader ) ]
25- } ) : undefined
26-
27- export default ( level : 'server' | "client" = "server" ) => {
18+ /**
19+ * Patches the global `console` methods to forward messages to the given
20+ * OpenTelemetry logger provider (in addition to the original console output).
21+ */
22+ const instrumentConsole = ( provider : LoggerProvider ) => {
2823
29- if ( level === 'server' && ! openTelemetryServerLogsProvider ) return
30- if ( level === 'client' && ! openTelemetryClientLogsProvider ) return
31-
32- const logger = level === "server" ?
33- openTelemetryServerLogsProvider ?. getLogger ( "default" , "1.0.0" ) :
34- openTelemetryClientLogsProvider ?. getLogger ( "default" , "1.0.0" )
24+ const logger = provider . getLogger ( "default" , "1.0.0" )
3525
3626 const originalConsole = {
3727 log : console . log ,
@@ -147,4 +137,35 @@ export default (level: 'server' | "client" = "server") => {
147137 originalConsole . debug . apply ( console , args )
148138 }
149139
150- }
140+ }
141+
142+ export default ( ) => {
143+
144+ if ( ! openTelemetryServerLogsProvider ) return
145+ instrumentConsole ( openTelemetryServerLogsProvider )
146+ }
147+
148+ /**
149+ * Builds and registers the browser logger provider from runtime configuration,
150+ * then patches `console` to forward log records to it. Returns the provider, or
151+ * undefined when logging is not configured.
152+ */
153+ export const initializeClientLogs = ( config : ClientOtelConfig ) => {
154+
155+ if ( ! config . logsEndpoint ) return undefined
156+
157+ const exporter = new OTLPLogExporter ( {
158+ url : config . logsEndpoint ,
159+ headers : parseHeaders ( config . header ?? undefined ) ,
160+ } )
161+
162+ const provider = new LoggerProvider ( {
163+ resource : buildClientResource ( config ) ,
164+ processors : [ new BatchLogRecordProcessor ( exporter ) ]
165+ } )
166+
167+ logs . setGlobalLoggerProvider ( provider )
168+ instrumentConsole ( provider )
169+
170+ return provider
171+ }
0 commit comments