@genkit-ai/core
Version:
Genkit AI framework core libraries.
74 lines • 2.48 kB
JavaScript
import { NodeSDK } from "@opentelemetry/sdk-node";
import {
BatchSpanProcessor,
SimpleSpanProcessor
} from "@opentelemetry/sdk-trace-base";
import { logger } from "../logging.js";
import { setTelemetryProvider } from "../tracing.js";
import { isDevEnv } from "../utils.js";
import { TraceServerExporter, setTelemetryServerUrl } from "./exporter.js";
import { RealtimeSpanProcessor } from "./realtime-span-processor.js";
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;
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() {
if (nodeOtelConfig?.spanProcessors) {
await Promise.all(nodeOtelConfig.spanProcessors.map((p) => p.forceFlush()));
}
}
export {
initNodeTelemetryProvider
};
//# sourceMappingURL=node-telemetry-provider.mjs.map