UNPKG

@genkit-ai/core

Version:

Genkit AI framework core libraries.

93 lines 3.18 kB
import { BatchLogRecordProcessor, SimpleLogRecordProcessor } from "@opentelemetry/sdk-logs"; import { NodeSDK } from "@opentelemetry/sdk-node"; import { BatchSpanProcessor, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base"; import { logger } from "../logging.mjs"; import { setTelemetryProvider } from "../tracing.mjs"; import { isDevEnv } from "../utils.mjs"; import { LogServerExporter, TraceServerExporter, setTelemetryServerUrl } from "./exporter.mjs"; import { RealtimeSpanProcessor } from "./realtime-span-processor.mjs"; let telemetrySDK = null; let nodeOtelConfig = null; function initNodeTelemetryProvider() { setTelemetryProvider({ enableTelemetry, flushTracing }); } async function enableTelemetry(telemetryConfig) { if (process.env.GENKIT_TELEMETRY_SERVER) { setTelemetryServerUrl(process.env.GENKIT_TELEMETRY_SERVER); } telemetryConfig = telemetryConfig instanceof Promise ? await telemetryConfig : telemetryConfig; nodeOtelConfig = telemetryConfig || {}; const processors = [createTelemetryServerProcessor()]; if (nodeOtelConfig.traceExporter) { throw new Error("Please specify spanProcessors instead."); } if (nodeOtelConfig.spanProcessors) { processors.push(...nodeOtelConfig.spanProcessors); } if (nodeOtelConfig.spanProcessor) { processors.push(nodeOtelConfig.spanProcessor); delete nodeOtelConfig.spanProcessor; } nodeOtelConfig.spanProcessors = processors; if (process.env.GENKIT_OTEL_ENABLE_LOGS === "true") { const enableRealTimeTelemetry = process.env.GENKIT_ENABLE_REALTIME_TELEMETRY === "true"; const logExporter = new LogServerExporter(); const logProcessor = isDevEnv() || enableRealTimeTelemetry ? new SimpleLogRecordProcessor(logExporter) : new BatchLogRecordProcessor(logExporter); nodeOtelConfig.logRecordProcessor = logProcessor; } telemetrySDK = new NodeSDK(nodeOtelConfig); telemetrySDK.start(); process.on("SIGTERM", async () => await cleanUpTracing()); } async function cleanUpTracing() { if (!telemetrySDK) { return; } await maybeFlushMetrics(); await telemetrySDK.shutdown(); logger.debug("OpenTelemetry SDK shut down."); telemetrySDK = null; } function createTelemetryServerProcessor() { const exporter = new TraceServerExporter(); const enableRealTimeTelemetry = process.env.GENKIT_ENABLE_REALTIME_TELEMETRY === "true"; if (isDevEnv() && enableRealTimeTelemetry) { return new RealtimeSpanProcessor(exporter); } else if (isDevEnv()) { return new SimpleSpanProcessor(exporter); } return new BatchSpanProcessor(exporter); } function maybeFlushMetrics() { if (nodeOtelConfig?.metricReader) { return nodeOtelConfig.metricReader.forceFlush(); } return Promise.resolve(); } async function flushTracing() { const promises = []; if (nodeOtelConfig?.spanProcessors) { promises.push(...nodeOtelConfig.spanProcessors.map((p) => p.forceFlush())); } if (nodeOtelConfig?.logRecordProcessor) { promises.push(nodeOtelConfig.logRecordProcessor.forceFlush()); } await Promise.all(promises); } export { initNodeTelemetryProvider }; //# sourceMappingURL=node-telemetry-provider.mjs.map