UNPKG

openlit

Version:

OpenTelemetry-native Auto instrumentation library for monitoring LLM Applications, facilitating the integration of observability into your GenAI-driven projects

198 lines 11.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const api_1 = require("@opentelemetry/api"); const config_1 = __importDefault(require("../../config")); const helpers_1 = __importDefault(require("../../helpers")); const semantic_convention_1 = __importDefault(require("../../semantic-convention")); const base_wrapper_1 = __importDefault(require("../base-wrapper")); class PineconeWrapper extends base_wrapper_1.default { // Safely resolve the namespace string from the Index instance. // `this.namespace` on a Pinecone Index is a METHOD that creates namespace-scoped // sub-indices, not a string property. The actual namespace string may be stored // internally in `this.target.namespace` depending on the SDK version. static _resolveNamespace(indexInstance, paramsNamespace) { if (paramsNamespace && typeof paramsNamespace === 'string') return paramsNamespace; const ns = indexInstance?.target?.namespace ?? indexInstance?._namespace ?? ''; return typeof ns === 'string' && ns ? ns : 'default'; } static _setCommonAttributes(span, dbOperation, namespace) { const applicationName = config_1.default.applicationName || ''; const environment = config_1.default.environment || ''; span.setAttribute(semantic_convention_1.default.DB_SYSTEM_NAME, PineconeWrapper.dbSystem); span.setAttribute(semantic_convention_1.default.DB_OPERATION_NAME, dbOperation); span.setAttribute(semantic_convention_1.default.DB_NAMESPACE, namespace); span.setAttribute(semantic_convention_1.default.SERVER_ADDRESS, PineconeWrapper.serverAddress); span.setAttribute(semantic_convention_1.default.SERVER_PORT, PineconeWrapper.serverPort); span.setAttribute(semantic_convention_1.default.GEN_AI_ENVIRONMENT, environment); span.setAttribute(semantic_convention_1.default.GEN_AI_APPLICATION_NAME, applicationName); } static _patchQuery(tracer) { const dbOperation = semantic_convention_1.default.DB_OPERATION_QUERY; return (originalMethod) => { return async function (...args) { const params = args[0] || {}; const namespace = PineconeWrapper._resolveNamespace(this, params.namespace); const spanName = `${dbOperation} ${namespace}`; const span = tracer.startSpan(spanName, { kind: api_1.SpanKind.CLIENT }); const startTime = Date.now(); return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), async () => { try { const response = await originalMethod.apply(this, args); const duration = (Date.now() - startTime) / 1000; PineconeWrapper._setCommonAttributes(span, dbOperation, namespace); span.setAttribute(semantic_convention_1.default.DB_VECTOR_QUERY_TOP_K, params.topK || 0); span.setAttribute(semantic_convention_1.default.DB_CLIENT_OPERATION_DURATION, duration); if (params.filter) { span.setAttribute(semantic_convention_1.default.DB_FILTER, JSON.stringify(params.filter)); } const matchCount = response?.matches?.length || 0; span.setAttribute(semantic_convention_1.default.DB_N_RESULTS, matchCount); if (config_1.default.captureMessageContent && params.vector) { span.setAttribute(semantic_convention_1.default.DB_QUERY_TEXT, JSON.stringify(params.vector?.slice(0, 10))); } span.setAttribute(semantic_convention_1.default.DB_QUERY_SUMMARY, `${dbOperation} ${namespace} top_k=${params.topK || 0} filtered=${params.filter ? 'true' : 'false'}`); span.setStatus({ code: 1 }); // SpanStatusCode.OK return response; } catch (e) { helpers_1.default.handleException(span, e); throw e; } finally { span.end(); } }); }; }; } static _patchUpsert(tracer) { const dbOperation = semantic_convention_1.default.DB_OPERATION_UPSERT; return (originalMethod) => { return async function (...args) { const namespace = PineconeWrapper._resolveNamespace(this); const spanName = `${dbOperation} ${namespace}`; const span = tracer.startSpan(spanName, { kind: api_1.SpanKind.CLIENT }); const startTime = Date.now(); return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), async () => { try { const response = await originalMethod.apply(this, args); const records = Array.isArray(args[0]) ? args[0] : []; const duration = (Date.now() - startTime) / 1000; PineconeWrapper._setCommonAttributes(span, dbOperation, namespace); span.setAttribute(semantic_convention_1.default.DB_VECTOR_COUNT, records.length); span.setAttribute(semantic_convention_1.default.DB_CLIENT_OPERATION_DURATION, duration); span.setAttribute(semantic_convention_1.default.DB_QUERY_SUMMARY, `${dbOperation} ${namespace} vectors_count=${records.length}`); if (config_1.default.captureMessageContent && records.length > 0) { span.setAttribute(semantic_convention_1.default.DB_QUERY_TEXT, JSON.stringify(records.map((r) => r.id))); } span.setStatus({ code: 1 }); return response; } catch (e) { helpers_1.default.handleException(span, e); throw e; } finally { span.end(); } }); }; }; } static _patchDelete(tracer, operationName) { const dbOperation = semantic_convention_1.default.DB_OPERATION_DELETE; return (originalMethod) => { return async function (...args) { const namespace = PineconeWrapper._resolveNamespace(this); const spanName = `${dbOperation} ${namespace}`; const span = tracer.startSpan(spanName, { kind: api_1.SpanKind.CLIENT }); const startTime = Date.now(); return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), async () => { try { const response = await originalMethod.apply(this, args); const params = args[0] || {}; const duration = (Date.now() - startTime) / 1000; PineconeWrapper._setCommonAttributes(span, `${dbOperation}.${operationName}`, namespace); span.setAttribute(semantic_convention_1.default.DB_CLIENT_OPERATION_DURATION, duration); // deleteOne passes an id string; deleteMany passes an array of ids let ids = []; if (typeof params === 'string') { ids = [params]; span.setAttribute(semantic_convention_1.default.DB_ID_COUNT, 1); } else if (Array.isArray(params)) { ids = params; span.setAttribute(semantic_convention_1.default.DB_ID_COUNT, params.length); } else if (params.ids) { ids = Array.isArray(params.ids) ? params.ids : [params.ids]; span.setAttribute(semantic_convention_1.default.DB_ID_COUNT, ids.length); } if (params.deleteAll) { span.setAttribute(semantic_convention_1.default.DB_DELETE_ALL, true); } if (params.filter) { span.setAttribute(semantic_convention_1.default.DB_FILTER, JSON.stringify(params.filter)); } span.setAttribute(semantic_convention_1.default.DB_QUERY_SUMMARY, `${dbOperation} ${namespace} ids=${JSON.stringify(ids)} delete_all=${params.deleteAll || false}`); span.setStatus({ code: 1 }); return response; } catch (e) { helpers_1.default.handleException(span, e); throw e; } finally { span.end(); } }); }; }; } static _patchUpdate(tracer) { const dbOperation = semantic_convention_1.default.DB_OPERATION_UPDATE; return (originalMethod) => { return async function (...args) { const namespace = PineconeWrapper._resolveNamespace(this); const spanName = `${dbOperation} ${namespace}`; const span = tracer.startSpan(spanName, { kind: api_1.SpanKind.CLIENT }); const startTime = Date.now(); return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), async () => { try { const response = await originalMethod.apply(this, args); const params = args[0] || {}; const duration = (Date.now() - startTime) / 1000; PineconeWrapper._setCommonAttributes(span, dbOperation, namespace); span.setAttribute(semantic_convention_1.default.DB_CLIENT_OPERATION_DURATION, duration); if (params.id) span.setAttribute(semantic_convention_1.default.DB_UPDATE_ID, params.id); if (params.values) span.setAttribute(semantic_convention_1.default.DB_UPDATE_VALUES, String(params.values?.length || 0)); if (params.metadata) { span.setAttribute(semantic_convention_1.default.DB_UPDATE_METADATA, JSON.stringify(params.metadata)); } span.setAttribute(semantic_convention_1.default.DB_QUERY_SUMMARY, `${dbOperation} ${namespace} id=${params.id || ''} values=${params.values?.length || 0} set_metadata=${params.metadata ? JSON.stringify(params.metadata) : ''}`); span.setStatus({ code: 1 }); return response; } catch (e) { helpers_1.default.handleException(span, e); throw e; } finally { span.end(); } }); }; }; } } PineconeWrapper.dbSystem = semantic_convention_1.default.DB_SYSTEM_PINECONE; PineconeWrapper.serverAddress = 'pinecone.io'; PineconeWrapper.serverPort = 443; exports.default = PineconeWrapper; //# sourceMappingURL=wrapper.js.map