UNPKG

@genkit-ai/core

Version:

Genkit AI framework core libraries.

1 lines 6.57 kB
{"version":3,"sources":["../../src/tracing/node-telemetry-provider.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BatchLogRecordProcessor,\n SimpleLogRecordProcessor,\n type LogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { logger } from '../logging.mjs';\nimport type { TelemetryConfig } from '../telemetryTypes.mjs';\nimport { setTelemetryProvider } from '../tracing.mjs';\nimport { isDevEnv } from '../utils.mjs';\nimport {\n LogServerExporter,\n TraceServerExporter,\n setTelemetryServerUrl,\n} from './exporter.mjs';\nimport { RealtimeSpanProcessor } from './realtime-span-processor.mjs';\n\nlet telemetrySDK: NodeSDK | null = null;\nlet nodeOtelConfig: TelemetryConfig | null = null;\n\nexport function initNodeTelemetryProvider() {\n setTelemetryProvider({\n enableTelemetry,\n flushTracing,\n });\n}\n\n/**\n * Enables tracing and metrics open telemetry configuration.\n */\nasync function enableTelemetry(\n telemetryConfig: TelemetryConfig | Promise<TelemetryConfig>\n) {\n if (process.env.GENKIT_TELEMETRY_SERVER) {\n setTelemetryServerUrl(process.env.GENKIT_TELEMETRY_SERVER);\n }\n\n telemetryConfig =\n telemetryConfig instanceof Promise\n ? await telemetryConfig\n : telemetryConfig;\n\n nodeOtelConfig = telemetryConfig || {};\n\n const processors: SpanProcessor[] = [createTelemetryServerProcessor()];\n if (nodeOtelConfig.traceExporter) {\n throw new Error('Please specify spanProcessors instead.');\n }\n if (nodeOtelConfig.spanProcessors) {\n processors.push(...nodeOtelConfig.spanProcessors);\n }\n if (nodeOtelConfig.spanProcessor) {\n processors.push(nodeOtelConfig.spanProcessor);\n delete nodeOtelConfig.spanProcessor;\n }\n nodeOtelConfig.spanProcessors = processors;\n\n // Add LogRecordProcessors\n if (process.env.GENKIT_OTEL_ENABLE_LOGS === 'true') {\n const enableRealTimeTelemetry =\n process.env.GENKIT_ENABLE_REALTIME_TELEMETRY === 'true';\n const logExporter = new LogServerExporter();\n const logProcessor: LogRecordProcessor =\n isDevEnv() || enableRealTimeTelemetry\n ? new SimpleLogRecordProcessor(logExporter)\n : new BatchLogRecordProcessor(logExporter);\n nodeOtelConfig.logRecordProcessor = logProcessor;\n }\n\n telemetrySDK = new NodeSDK(nodeOtelConfig);\n telemetrySDK.start();\n process.on('SIGTERM', async () => await cleanUpTracing());\n}\n\nasync function cleanUpTracing(): Promise<void> {\n if (!telemetrySDK) {\n return;\n }\n\n // Metrics are not flushed as part of the shutdown operation. If metrics\n // are enabled, we need to manually flush them *before* the reader\n // receives shutdown order.\n await maybeFlushMetrics();\n await telemetrySDK.shutdown();\n logger.debug('OpenTelemetry SDK shut down.');\n telemetrySDK = null;\n}\n\n/**\n * Creates a new SpanProcessor for exporting data to the telemetry server.\n */\nfunction createTelemetryServerProcessor(): SpanProcessor {\n const exporter = new TraceServerExporter();\n // Use RealtimeSpanProcessor in dev environment (unless disabled), or when explicitly enabled\n const enableRealTimeTelemetry =\n process.env.GENKIT_ENABLE_REALTIME_TELEMETRY === 'true';\n if (isDevEnv() && enableRealTimeTelemetry) {\n return new RealtimeSpanProcessor(exporter);\n } else if (isDevEnv()) {\n return new SimpleSpanProcessor(exporter);\n }\n return new BatchSpanProcessor(exporter);\n}\n\n/** Flush metrics if present. */\nfunction maybeFlushMetrics(): Promise<void> {\n if (nodeOtelConfig?.metricReader) {\n return nodeOtelConfig.metricReader.forceFlush();\n }\n return Promise.resolve();\n}\n\n/**\n * Flushes all configured span and log processors.\n */\nasync function flushTracing() {\n const promises: Promise<void>[] = [];\n if (nodeOtelConfig?.spanProcessors) {\n promises.push(...nodeOtelConfig.spanProcessors.map((p) => p.forceFlush()));\n }\n if (nodeOtelConfig?.logRecordProcessor) {\n promises.push(nodeOtelConfig.logRecordProcessor.forceFlush());\n }\n await Promise.all(promises);\n}\n"],"mappings":"AAgBA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,cAAc;AAEvB,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,6BAA6B;AAEtC,IAAI,eAA+B;AACnC,IAAI,iBAAyC;AAEtC,SAAS,4BAA4B;AAC1C,uBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKA,eAAe,gBACb,iBACA;AACA,MAAI,QAAQ,IAAI,yBAAyB;AACvC,0BAAsB,QAAQ,IAAI,uBAAuB;AAAA,EAC3D;AAEA,oBACE,2BAA2B,UACvB,MAAM,kBACN;AAEN,mBAAiB,mBAAmB,CAAC;AAErC,QAAM,aAA8B,CAAC,+BAA+B,CAAC;AACrE,MAAI,eAAe,eAAe;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,MAAI,eAAe,gBAAgB;AACjC,eAAW,KAAK,GAAG,eAAe,cAAc;AAAA,EAClD;AACA,MAAI,eAAe,eAAe;AAChC,eAAW,KAAK,eAAe,aAAa;AAC5C,WAAO,eAAe;AAAA,EACxB;AACA,iBAAe,iBAAiB;AAGhC,MAAI,QAAQ,IAAI,4BAA4B,QAAQ;AAClD,UAAM,0BACJ,QAAQ,IAAI,qCAAqC;AACnD,UAAM,cAAc,IAAI,kBAAkB;AAC1C,UAAM,eACJ,SAAS,KAAK,0BACV,IAAI,yBAAyB,WAAW,IACxC,IAAI,wBAAwB,WAAW;AAC7C,mBAAe,qBAAqB;AAAA,EACtC;AAEA,iBAAe,IAAI,QAAQ,cAAc;AACzC,eAAa,MAAM;AACnB,UAAQ,GAAG,WAAW,YAAY,MAAM,eAAe,CAAC;AAC1D;AAEA,eAAe,iBAAgC;AAC7C,MAAI,CAAC,cAAc;AACjB;AAAA,EACF;AAKA,QAAM,kBAAkB;AACxB,QAAM,aAAa,SAAS;AAC5B,SAAO,MAAM,8BAA8B;AAC3C,iBAAe;AACjB;AAKA,SAAS,iCAAgD;AACvD,QAAM,WAAW,IAAI,oBAAoB;AAEzC,QAAM,0BACJ,QAAQ,IAAI,qCAAqC;AACnD,MAAI,SAAS,KAAK,yBAAyB;AACzC,WAAO,IAAI,sBAAsB,QAAQ;AAAA,EAC3C,WAAW,SAAS,GAAG;AACrB,WAAO,IAAI,oBAAoB,QAAQ;AAAA,EACzC;AACA,SAAO,IAAI,mBAAmB,QAAQ;AACxC;AAGA,SAAS,oBAAmC;AAC1C,MAAI,gBAAgB,cAAc;AAChC,WAAO,eAAe,aAAa,WAAW;AAAA,EAChD;AACA,SAAO,QAAQ,QAAQ;AACzB;AAKA,eAAe,eAAe;AAC5B,QAAM,WAA4B,CAAC;AACnC,MAAI,gBAAgB,gBAAgB;AAClC,aAAS,KAAK,GAAG,eAAe,eAAe,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAAA,EAC3E;AACA,MAAI,gBAAgB,oBAAoB;AACtC,aAAS,KAAK,eAAe,mBAAmB,WAAW,CAAC;AAAA,EAC9D;AACA,QAAM,QAAQ,IAAI,QAAQ;AAC5B;","names":[]}