@genkit-ai/core
Version:
Genkit AI framework core libraries.
93 lines • 3.18 kB
JavaScript
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