UNPKG

@genkit-ai/core

Version:

Genkit AI framework core libraries.

1 lines 5.33 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 { NodeSDK } from '@opentelemetry/sdk-node';\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { logger } from '../logging.js';\nimport type { TelemetryConfig } from '../telemetryTypes.js';\nimport { setTelemetryProvider } from '../tracing.js';\nimport { isDevEnv } from '../utils.js';\nimport { TraceServerExporter, setTelemetryServerUrl } from './exporter.js';\nimport { RealtimeSpanProcessor } from './realtime-span-processor.js';\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 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 processors.\n */\nasync function flushTracing() {\n if (nodeOtelConfig?.spanProcessors) {\n await Promise.all(nodeOtelConfig.spanProcessors.map((p) => p.forceFlush()));\n }\n}\n"],"mappings":"AAgBA,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,cAAc;AAEvB,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB,6BAA6B;AAC3D,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;AAChC,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,MAAI,gBAAgB,gBAAgB;AAClC,UAAM,QAAQ,IAAI,eAAe,eAAe,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAAA,EAC5E;AACF;","names":[]}