UNPKG

langsmith

Version:

Client library to connect to the LangSmith Observability and Evaluation Platform.

96 lines (95 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.initializeOTEL = void 0; // Avoid async hooks as even a peer dep to avoid pulling into // non-node build environments. // eslint-disable-next-line import/no-extraneous-dependencies const context_async_hooks_1 = require("@opentelemetry/context-async-hooks"); const api_1 = require("@opentelemetry/api"); const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base"); const exporter_js_1 = require("./exporter.cjs"); const processor_js_1 = require("./processor.cjs"); const otel_js_1 = require("../../singletons/otel.cjs"); /** * @deprecated Use non-OTEL `wrapAISDK` from `langsmith/experimental/vercel` instead. * * Initializes OpenTelemetry with LangSmith-specific configuration for tracing. * * Call this once at the start of your application to enable tracing integration. Sets global * OpenTelemetry components including the tracer provider and context manager. * * Requires the following peer dependencies to be installed: * - @opentelemetry/api * - @opentelemetry/sdk-trace-base * - @opentelemetry/exporter-trace-otlp-proto * - @opentelemetry/context-async-hooks * * @param options - Configuration options * @param options.globalTracerProvider - Optional custom TracerProvider to use instead of creating and globally setting a new one * @returns Object containing the initialized OTEL components (tracer provider, span processor, exporter) * * @example * ```typescript * import { initializeOTEL } from "langsmith/experimental/otel/setup"; * initializeOTEL(); * ``` * * @example With custom tracer provider * ```typescript * import { initializeOTEL } from "langsmith/experimental/otel/setup"; * import { BasicTracerProvider } from "@opentelemetry/sdk-trace-base"; * * const customProvider = new BasicTracerProvider(); * initializeOTEL({ globalTracerProvider: customProvider }); * ``` */ const initializeOTEL = (config = {}) => { const { globalTracerProvider, globalContextManager, skipGlobalContextManagerSetup, exporterConfig, } = config; const otel = { trace: api_1.trace, context: api_1.context, }; (0, otel_js_1.setOTELInstances)(otel); if (!globalContextManager && !skipGlobalContextManagerSetup) { try { const contextManager = new context_async_hooks_1.AsyncHooksContextManager(); contextManager.enable(); api_1.context.setGlobalContextManager(contextManager); } catch (e) { console.log([ `Could not automatically set up an OTEL context manager.`, `This may be expected if you have (or another imported library has) already set a global context manager.`, `If expected, you can skip this warning by passing "skipGlobalContextManagerSetup: true" into your initializeOTEL call.`, ].join("\n")); } } const DEFAULT_LANGSMITH_SPAN_EXPORTER = new exporter_js_1.LangSmithOTLPTraceExporter(exporterConfig); const DEFAULT_LANGSMITH_SPAN_PROCESSOR = new processor_js_1.LangSmithOTLPSpanProcessor(DEFAULT_LANGSMITH_SPAN_EXPORTER); if (!globalTracerProvider) { const DEFAULT_LANGSMITH_TRACER_PROVIDER = new sdk_trace_base_1.BasicTracerProvider({ spanProcessors: [DEFAULT_LANGSMITH_SPAN_PROCESSOR], }); const defaultComponents = { DEFAULT_LANGSMITH_SPAN_PROCESSOR, DEFAULT_LANGSMITH_TRACER_PROVIDER, DEFAULT_LANGSMITH_SPAN_EXPORTER, }; // If user has set global tracer before, this fails and returns false const globalSuccessfullyOverridden = api_1.trace.setGlobalTracerProvider(defaultComponents.DEFAULT_LANGSMITH_TRACER_PROVIDER); if (globalSuccessfullyOverridden) { (0, otel_js_1.setDefaultOTLPTracerComponents)(defaultComponents); } return defaultComponents; } else { const defaultComponents = { DEFAULT_LANGSMITH_TRACER_PROVIDER: globalTracerProvider, DEFAULT_LANGSMITH_SPAN_PROCESSOR, DEFAULT_LANGSMITH_SPAN_EXPORTER, }; (0, otel_js_1.setDefaultOTLPTracerComponents)(defaultComponents); return defaultComponents; } }; exports.initializeOTEL = initializeOTEL;