Skip to content

Commit 51721cb

Browse files
committed
feat: implement client logging initialization with dynamic configuration
1 parent 847f8e1 commit 51721cb

1 file changed

Lines changed: 40 additions & 19 deletions

File tree

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

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,27 @@
11
import {OTLPLogExporter} from "@opentelemetry/exporter-logs-otlp-http"
22
import {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"
44
import {recordException} from "@core/util/open-telemetry-exceptions"
5+
import {logs} from "@opentelemetry/api-logs"
56
import {parseHeaders} from "@core/util/headers";
67

78
export 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-
1713
export 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

Comments
 (0)