autotel-plugins 0.6.6 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -465,7 +465,7 @@ function instrumentDrizzleClient(db, config) {
465
465
  var DEFAULT_TRACER_NAME2 = "autotel-plugins/mongoose";
466
466
  var DEFAULT_DB_SYSTEM2 = "mongoose";
467
467
  var INSTRUMENTED_FLAG2 = "__autotelMongooseInstrumented";
468
- var _STORED_PARENT_SPAN = Symbol("stored-parent-span");
468
+ var _STORED_PARENT_SPAN = /* @__PURE__ */ Symbol("stored-parent-span");
469
469
  function createSpan(tracer, operation, modelName, collectionName, config) {
470
470
  const spanName = collectionName ? `mongoose.${collectionName}.${operation}` : modelName ? `mongoose.${modelName}.${operation}` : `mongoose.${operation}`;
471
471
  const attributes = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts","../src/mongoose/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan","tracerName","dbSystem","dbName","captureQueryText","maxQueryTextLength","peerName","peerPort","tracer","instrumented","DEFAULT_TRACER_NAME","DEFAULT_DB_SYSTEM","INSTRUMENTED_FLAG","getActiveSpan"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` types are necessary for dynamic instrumentation patterns\n// where we need to wrap arbitrary methods and preserve their signatures\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\n\ntype QueryFunction = (...args: any[]) => any;\n\ninterface DrizzleClientLike {\n query?: QueryFunction;\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Configuration options for Drizzle instrumentation.\n */\nexport interface InstrumentDrizzleConfig {\n /**\n * Custom tracer name. Defaults to \"autotel-plugins/drizzle\".\n */\n tracerName?: string;\n\n /**\n * Database system identifier (e.g., \"postgresql\", \"mysql\", \"sqlite\").\n * Defaults to \"postgresql\".\n */\n dbSystem?: string;\n\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Whether to capture full SQL query text in spans.\n * Defaults to true.\n */\n captureQueryText?: boolean;\n\n /**\n * Maximum length for captured query text. Queries longer than this\n * will be truncated. Defaults to 1000 characters.\n */\n maxQueryTextLength?: number;\n\n /**\n * Remote hostname or IP address of the database server.\n * Example: \"db.example.com\" or \"192.168.1.100\"\n */\n peerName?: string;\n\n /**\n * Remote port number of the database server.\n * Example: 5432 for PostgreSQL, 3306 for MySQL\n */\n peerPort?: number;\n}\n\n/**\n * Extracts SQL query text from various query argument formats.\n */\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n if (queryArg && typeof queryArg === 'object') {\n // Generic SQL object format (used by LibSQL, MySQL, and others)\n if (typeof (queryArg as { sql?: unknown }).sql === 'string') {\n return (queryArg as { sql: string }).sql;\n }\n // PostgreSQL-style query object\n if (typeof (queryArg as { text?: unknown }).text === 'string') {\n return (queryArg as { text: string }).text;\n }\n // Drizzle SQL object\n if (\n typeof (queryArg as { queryChunks?: unknown }).queryChunks === 'object'\n ) {\n // Drizzle query objects may have complex structure, try to extract meaningful info\n const drizzleQuery = queryArg as Record<string, unknown>;\n if (typeof drizzleQuery.sql === 'string') {\n return drizzleQuery.sql;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Sanitizes and truncates query text for safe inclusion in spans.\n */\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, etc.) from query text.\n */\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<op>\\w+)/u.exec(trimmed);\n return match?.groups?.op?.toUpperCase();\n}\n\n/**\n * Instruments a database connection pool/client with OpenTelemetry tracing.\n *\n * This function wraps the connection's `query` and `execute` methods to create spans for each database\n * operation.\n * The instrumentation is idempotent - calling it multiple times on the same connection will only\n * instrument it once.\n *\n * @typeParam TClient - The type of the database connection pool or client\n * @param client - The database connection pool or client to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented pool/client (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const instrumentedPool = instrumentDrizzle(pool, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * const db = drizzle({ client: instrumentedPool });\n * ```\n *\n * @example\n * ```typescript\n * // MySQL with mysql2\n * import { drizzle } from 'drizzle-orm/mysql2';\n * import mysql from 'mysql2/promise';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const connection = await mysql.createConnection({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb',\n * });\n * const instrumentedConnection = instrumentDrizzle(connection, { dbSystem: 'mysql' });\n * const db = drizzle({ client: instrumentedConnection });\n * ```\n *\n * @example\n * ```typescript\n * // SQLite with better-sqlite3\n * import { drizzle } from 'drizzle-orm/better-sqlite3';\n * import Database from 'better-sqlite3';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const sqlite = new Database('sqlite.db');\n * const instrumentedSqlite = instrumentDrizzle(sqlite, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedSqlite });\n * ```\n *\n * @example\n * ```typescript\n * // LibSQL/Turso\n * import { drizzle } from 'drizzle-orm/libsql';\n * import { createClient } from '@libsql/client';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const client = createClient({\n * url: process.env.DATABASE_URL!,\n * authToken: process.env.DATABASE_AUTH_TOKEN,\n * });\n * const instrumentedClient = instrumentDrizzle(client, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedClient });\n * ```\n */\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client) {\n return client;\n }\n\n // Check if client has query or execute method\n const hasQuery = typeof client.query === 'function';\n const hasExecute = typeof client.execute === 'function';\n\n if (!hasQuery && !hasExecute) {\n return client;\n }\n\n if (client[INSTRUMENTED_FLAG]) {\n return client;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n\n // Store the original method (query or execute)\n const originalMethod = hasQuery ? client.query : client.execute;\n\n if (!originalMethod) {\n return client;\n }\n\n const instrumentedMethod: QueryFunction = function instrumented(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n let callback: QueryCallback | undefined;\n\n // Detect callback pattern\n if (typeof args.at(-1) === 'function') {\n callback = args.pop() as QueryCallback;\n }\n\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Callback-based pattern\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (err, result) => {\n finalizeSpan(span, err);\n if (callback) {\n callback(err, result);\n }\n };\n\n try {\n return Reflect.apply(originalMethod, this, [\n ...args,\n wrappedCallback,\n ]);\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n }\n\n // Promise-based pattern\n return runWithSpan(span, () => {\n try {\n const result = originalMethod.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n client[INSTRUMENTED_FLAG] = true;\n\n // Replace the original method with the instrumented one\n if (hasQuery) {\n client.query = instrumentedMethod;\n } else {\n client.execute = instrumentedMethod;\n }\n\n return client;\n}\n\n/**\n * Interface for Drizzle database instances with minimal type requirements.\n */\ninterface DrizzleDbLike {\n $client?: DrizzleClientLike | any; // Allow any client type\n execute?: QueryFunction; // Direct execute method on db\n transaction?: QueryFunction; // Transaction method on db\n _?: {\n session?: {\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any;\n };\n [key: string]: any;\n };\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Instruments a Drizzle database instance with OpenTelemetry tracing.\n *\n * This function instruments the database at the session level, automatically tracing all database\n * operations including query builders, direct SQL execution, and transactions.\n *\n * The instrumentation is idempotent - calling it multiple times on the same\n * database will only instrument it once.\n *\n * @typeParam TDb - The type of the Drizzle database instance\n * @param db - The Drizzle database instance to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented database instance (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with postgres.js\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a client instance\n * const queryClient = postgres(process.env.DATABASE_URL!);\n * const db = drizzle({ client: queryClient });\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n * ```\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres (pg)\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a pool\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const db = drizzle({ client: pool });\n * instrumentDrizzleClient(db, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * ```\n */\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db) {\n return db;\n }\n\n // Check if already instrumented\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n let instrumented = false;\n\n // First priority: Instrument the session directly\n // This is where all queries actually go through\n if ((db as any).session && !instrumented) {\n const session = (db as any).session;\n\n // Check if session has prepareQuery method (used by select/insert/update/delete)\n if (\n typeof session.prepareQuery === 'function' &&\n !session[INSTRUMENTED_FLAG]\n ) {\n const originalPrepareQuery = session.prepareQuery;\n\n session.prepareQuery = function (...args: any[]) {\n const prepared = originalPrepareQuery.apply(this, args);\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (this: any, ...executeArgs: any[]) {\n // Extract query information from the query object\n const queryObj = args[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n session[INSTRUMENTED_FLAG] = true;\n instrumented = true;\n }\n\n // Also instrument direct query method if exists\n if (\n typeof session.query === 'function' &&\n !session[INSTRUMENTED_FLAG + '_query']\n ) {\n const originalQuery = session.query;\n\n session.query = function (this: any, queryString: string, params: any[]) {\n const operation = queryString\n ? extractOperation(queryString)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryString !== undefined) {\n const sanitized = sanitizeQueryText(queryString, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = Reflect.apply(originalQuery, this, [\n queryString,\n params,\n ]);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG + '_query'] = true;\n instrumented = true;\n }\n\n // Instrument transaction method to ensure transaction sessions are also instrumented\n if (\n typeof session.transaction === 'function' &&\n !session[INSTRUMENTED_FLAG + '_transaction']\n ) {\n const originalTransaction = session.transaction;\n\n session.transaction = function (\n this: any,\n transactionCallback: any,\n ...restArgs: any[]\n ) {\n // Wrap the transaction callback to instrument the tx object\n const wrappedCallback = async function (tx: any) {\n // Instrument the transaction's session if it has one\n if (tx && (tx.session || tx._?.session || tx)) {\n const txSession = tx.session || tx._?.session || tx;\n\n // Instrument tx.execute if it exists\n if (\n typeof tx.execute === 'function' &&\n !tx[INSTRUMENTED_FLAG + '_execute']\n ) {\n const originalTxExecute = tx.execute;\n\n tx.execute = function (this: any, ...executeArgs: any[]) {\n const queryText = extractQueryText(executeArgs[0]);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = originalTxExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n tx[INSTRUMENTED_FLAG + '_execute'] = true;\n }\n\n // Also instrument txSession.prepareQuery if it exists\n if (\n typeof txSession.prepareQuery === 'function' &&\n !txSession[INSTRUMENTED_FLAG + '_tx']\n ) {\n const originalTxPrepareQuery = txSession.prepareQuery;\n\n txSession.prepareQuery = function (...prepareArgs: any[]) {\n const prepared = originalTxPrepareQuery.apply(\n this,\n prepareArgs,\n );\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (\n this: any,\n ...executeArgs: any[]\n ) {\n // Extract query information from the query object\n const queryObj = prepareArgs[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(\n this,\n executeArgs,\n );\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n txSession[INSTRUMENTED_FLAG + '_tx'] = true;\n }\n }\n\n // Call the original callback with the instrumented tx\n return transactionCallback(tx);\n };\n\n // Call the original transaction with the wrapped callback\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[INSTRUMENTED_FLAG + '_transaction'] = true;\n instrumented = true;\n }\n }\n\n if (db.$client && !instrumented) {\n const client = db.$client;\n // Check if client has query or execute function\n if (\n typeof client.query === 'function' ||\n typeof client.execute === 'function'\n ) {\n instrumentDrizzle(client, config);\n instrumented = true;\n }\n }\n\n // Third priority: Try to instrument via session.execute as fallback\n if (\n db._ &&\n db._.session &&\n typeof db._.session.execute === 'function' &&\n !instrumented\n ) {\n const session = db._.session;\n\n // Check if already instrumented\n if (session[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n const originalExecute = session.execute;\n\n if (!originalExecute) {\n return db;\n }\n\n const instrumentedExecute: QueryFunction = function instrumented(\n this: any,\n ...args: any[]\n ) {\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Promise-based pattern (session.execute is typically promise-based)\n return runWithSpan(span, () => {\n try {\n const result = originalExecute.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG] = true;\n session.execute = instrumentedExecute;\n instrumented = true;\n }\n\n // Mark the db as instrumented if we instrumented anything\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts","../src/mongoose/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan","tracerName","dbSystem","dbName","captureQueryText","maxQueryTextLength","peerName","peerPort","tracer","instrumented","DEFAULT_TRACER_NAME","DEFAULT_DB_SYSTEM","INSTRUMENTED_FLAG","getActiveSpan"],"mappings":";;;;;;;AAMO,IAAM,kBAAA,GAAqB;AAC3B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,gBAAA,GAAmB;AAGzB,IAAM,8BAAA,GAAiC,uBAAA;AAGvC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,sBAAA,GAAyB;ACFtC,IAAM,mBAAA,GAAsB,yBAAA;AAC5B,IAAM,iBAAA,GAAoB,YAAA;AAC1B,IAAM,iBAAA,GAAoB,8BAAA;AA6D1B,SAAS,iBAAiB,QAAA,EAAuC;AAC/D,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAE5C,IAAA,IAAI,OAAQ,QAAA,CAA+B,GAAA,KAAQ,QAAA,EAAU;AAC3D,MAAA,OAAQ,QAAA,CAA6B,GAAA;AAAA,IACvC;AAEA,IAAA,IAAI,OAAQ,QAAA,CAAgC,IAAA,KAAS,QAAA,EAAU;AAC7D,MAAA,OAAQ,QAAA,CAA8B,IAAA;AAAA,IACxC;AAEA,IAAA,IACE,OAAQ,QAAA,CAAuC,WAAA,KAAgB,QAAA,EAC/D;AAEA,MAAA,MAAM,YAAA,GAAe,QAAA;AACrB,MAAA,IAAI,OAAO,YAAA,CAAa,GAAA,KAAQ,QAAA,EAAU;AACxC,QAAA,OAAO,YAAA,CAAa,GAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,iBAAA,CAAkB,WAAmB,SAAA,EAA2B;AACvE,EAAA,IAAI,SAAA,CAAU,UAAU,SAAA,EAAW;AACjC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA,GAAA,CAAA;AACtD;AAKA,SAAS,iBAAiB,SAAA,EAAuC;AAC/D,EAAA,MAAM,OAAA,GAAU,UAAU,SAAA,EAAU;AACpC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AACzC,EAAA,OAAO,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,WAAA,EAAY;AACxC;AA2EO,SAAS,iBAAA,CACd,QACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,KAAA,KAAU,UAAA;AACzC,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,OAAA,KAAY,UAAA;AAE7C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,UAAA,EAAY;AAC5B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,iBAAiB,CAAA,EAAG;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,mBAAA;AAAA,IACb,QAAA,GAAW,iBAAA;AAAA,IACX,MAAA;AAAA,IACA,gBAAA,GAAmB,IAAA;AAAA,IACnB,kBAAA,GAAqB,GAAA;AAAA,IACrB,QAAA;AAAA,IACA;AAAA,GACF,GAAI,UAAU,EAAC;AAEf,EAAA,MAAM,MAAA,GAASA,SAAA,CAAM,SAAA,CAAU,UAAU,CAAA;AAGzC,EAAA,MAAM,cAAA,GAAiB,QAAA,GAAW,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,OAAA;AAExD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAA,GAAoC,SAAS,YAAA,CAAA,GAE9C,YAAA,EACH;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,YAAY,CAAA;AAC7B,IAAA,IAAI,QAAA;AAGJ,IAAA,IAAI,OAAO,IAAA,CAAK,EAAA,CAAG,EAAE,MAAM,UAAA,EAAY;AACrC,MAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AAAA,IACtB;AAGA,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,SAAA,GAAY,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA;AAC5D,IAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMC,YAAA,CAAS,QAAQ,CAAA;AACjE,IAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAE9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,gBAAA,IAAoB,cAAc,MAAA,EAAW;AAC/C,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,SAAA,EAAW,kBAAkB,CAAA;AACjE,MAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,QAAA,MAAM,eAAA,GAAiC,CAAC,GAAA,EAAK,MAAA,KAAW;AACtD,UAAAC,yBAAA,CAAa,MAAM,GAAG,CAAA;AACtB,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,UACtB;AAAA,QACF,CAAA;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM;AAAA,YACzC,GAAG,IAAA;AAAA,YACH;AAAA,WACD,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,OAAOD,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC9C,QAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,UAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,UAAA,OAAO,KAAA;AAAA,QACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,UAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,UAAA,MAAM,KAAA;AAAA,QACR,CAAC,CAAA;AAAA,MACL,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAA,CAAO,iBAAiB,CAAA,GAAI,IAAA;AAG5B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,KAAA,GAAQ,kBAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,OAAA,GAAU,kBAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;AA0EO,SAAS,uBAAA,CACd,IACA,MAAA,EACK;AACL,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,EAAA,CAAG,iBAAiB,CAAA,EAAG;AACzB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,mBAAA;AAAA,IACb,QAAA,GAAW,iBAAA;AAAA,IACX,MAAA;AAAA,IACA,gBAAA,GAAmB,IAAA;AAAA,IACnB,kBAAA,GAAqB,GAAA;AAAA,IACrB,QAAA;AAAA,IACA;AAAA,GACF,GAAI,UAAU,EAAC;AAEf,EAAA,MAAM,MAAA,GAASH,SAAA,CAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,YAAA,GAAe,KAAA;AAInB,EAAA,IAAK,EAAA,CAAW,OAAA,IAAW,CAAC,YAAA,EAAc;AACxC,IAAA,MAAM,UAAW,EAAA,CAAW,OAAA;AAG5B,IAAA,IACE,OAAO,OAAA,CAAQ,YAAA,KAAiB,cAChC,CAAC,OAAA,CAAQ,iBAAiB,CAAA,EAC1B;AACA,MAAA,MAAM,uBAAuB,OAAA,CAAQ,YAAA;AAErC,MAAA,OAAA,CAAQ,YAAA,GAAe,YAAa,IAAA,EAAa;AAC/C,QAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGtD,QAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,KAAY,UAAA,EAAY;AACtD,UAAA,MAAM,0BAA0B,QAAA,CAAS,OAAA;AAEzC,UAAA,QAAA,CAAS,OAAA,GAAU,YAAwB,WAAA,EAAoB;AAE7D,YAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,YAAA,MAAM,YACJ,QAAA,EAAU,GAAA,IACV,QAAA,EAAU,WAAA,IACV,iBAAiB,QAAQ,CAAA;AAC3B,YAAA,MAAM,SAAA,GAAY,SAAA,GACd,gBAAA,CAAiB,SAAS,CAAA,GAC1B,MAAA;AACJ,YAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,YAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMC,YAAA,CAAS,QAAQ,CAAA;AACjE,YAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAE9C,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,YACpD;AAEA,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAAA,YAC5C;AAEA,YAAA,IAAI,gBAAA,IAAoB,cAAc,MAAA,EAAW;AAC/C,cAAA,MAAM,SAAA,GAAY,iBAAA;AAAA,gBAChB,SAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,YACpD;AAEA,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,YACpD;AAEA,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,YACpD;AAGA,YAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,KAAA,CAAM,IAAA,EAAM,WAAW,CAAA;AAC9D,gBAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,kBAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,kBAAA,OAAO,KAAA;AAAA,gBACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,kBAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,kBAAA,MAAM,KAAA;AAAA,gBACR,CAAC,CAAA;AAAA,cACL,SAAS,KAAA,EAAO;AACd,gBAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF,CAAC,CAAA;AAAA,UACH,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,IAAA;AAC7B,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAGA,IAAA,IACE,OAAO,QAAQ,KAAA,KAAU,UAAA,IACzB,CAAC,OAAA,CAAQ,iBAAA,GAAoB,QAAQ,CAAA,EACrC;AACA,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAE9B,MAAA,OAAA,CAAQ,KAAA,GAAQ,SAAqB,WAAA,EAAqB,MAAA,EAAe;AACvE,QAAA,MAAM,SAAA,GAAY,WAAA,GACd,gBAAA,CAAiB,WAAW,CAAA,GAC5B,MAAA;AACJ,QAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,QAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMF,YAAA,CAAS,QAAQ,CAAA;AACjE,QAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAE9C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAAA,QAC5C;AAEA,QAAA,IAAI,gBAAA,IAAoB,gBAAgB,MAAA,EAAW;AACjD,UAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,WAAA,EAAa,kBAAkB,CAAA;AACnE,UAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,QACpD;AAGA,QAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,aAAA,EAAe,IAAA,EAAM;AAAA,cAChD,WAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,cAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,cAAA,OAAO,KAAA;AAAA,YACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,cAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,cAAA,MAAM,KAAA;AAAA,YACR,CAAC,CAAA;AAAA,UACL,SAAS,KAAA,EAAO;AACd,YAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,OAAA,CAAQ,iBAAA,GAAoB,QAAQ,CAAA,GAAI,IAAA;AACxC,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAGA,IAAA,IACE,OAAO,QAAQ,WAAA,KAAgB,UAAA,IAC/B,CAAC,OAAA,CAAQ,iBAAA,GAAoB,cAAc,CAAA,EAC3C;AACA,MAAA,MAAM,sBAAsB,OAAA,CAAQ,WAAA;AAEpC,MAAA,OAAA,CAAQ,WAAA,GAAc,SAEpB,mBAAA,EAAA,GACG,QAAA,EACH;AAEA,QAAA,MAAM,eAAA,GAAkB,eAAgB,EAAA,EAAS;AAE/C,UAAA,IAAI,OAAO,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,CAAA,EAAG,WAAW,EAAA,CAAA,EAAK;AAC7C,YAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,GAAG,OAAA,IAAW,EAAA;AAGjD,YAAA,IACE,OAAO,GAAG,OAAA,KAAY,UAAA,IACtB,CAAC,EAAA,CAAG,iBAAA,GAAoB,UAAU,CAAA,EAClC;AACA,cAAA,MAAM,oBAAoB,EAAA,CAAG,OAAA;AAE7B,cAAA,EAAA,CAAG,OAAA,GAAU,YAAwB,WAAA,EAAoB;AACvD,gBAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,WAAA,CAAY,CAAC,CAAC,CAAA;AACjD,gBAAA,MAAM,SAAA,GAAY,SAAA,GACd,gBAAA,CAAiB,SAAS,CAAA,GAC1B,MAAA;AACJ,gBAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,gBAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU;AAAA,kBACtC,MAAMF,YAAA,CAAS;AAAA,iBAChB,CAAA;AACD,gBAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAC9C,gBAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,IAAI,CAAA;AAExC,gBAAA,IAAI,SAAA,EAAW;AACb,kBAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,gBACpD;AAEA,gBAAA,IAAI,MAAA,EAAQ;AACV,kBAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAAA,gBAC5C;AAEA,gBAAA,IAAI,gBAAA,IAAoB,cAAc,MAAA,EAAW;AAC/C,kBAAA,MAAM,SAAA,GAAY,iBAAA;AAAA,oBAChB,SAAA;AAAA,oBACA;AAAA,mBACF;AACA,kBAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,gBACpD;AAEA,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,gBACpD;AAEA,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,gBACpD;AAGA,gBAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,kBAAA,IAAI;AACF,oBAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,WAAW,CAAA;AACxD,oBAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,sBAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,sBAAA,OAAO,KAAA;AAAA,oBACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,sBAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,sBAAA,MAAM,KAAA;AAAA,oBACR,CAAC,CAAA;AAAA,kBACL,SAAS,KAAA,EAAO;AACd,oBAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,oBAAA,MAAM,KAAA;AAAA,kBACR;AAAA,gBACF,CAAC,CAAA;AAAA,cACH,CAAA;AAEA,cAAA,EAAA,CAAG,iBAAA,GAAoB,UAAU,CAAA,GAAI,IAAA;AAAA,YACvC;AAGA,YAAA,IACE,OAAO,UAAU,YAAA,KAAiB,UAAA,IAClC,CAAC,SAAA,CAAU,iBAAA,GAAoB,KAAK,CAAA,EACpC;AACA,cAAA,MAAM,yBAAyB,SAAA,CAAU,YAAA;AAEzC,cAAA,SAAA,CAAU,YAAA,GAAe,YAAa,WAAA,EAAoB;AACxD,gBAAA,MAAM,WAAW,sBAAA,CAAuB,KAAA;AAAA,kBACtC,IAAA;AAAA,kBACA;AAAA,iBACF;AAGA,gBAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,KAAY,UAAA,EAAY;AACtD,kBAAA,MAAM,0BAA0B,QAAA,CAAS,OAAA;AAEzC,kBAAA,QAAA,CAAS,OAAA,GAAU,YAEd,WAAA,EACH;AAEA,oBAAA,MAAM,QAAA,GAAW,YAAY,CAAC,CAAA;AAC9B,oBAAA,MAAM,YACJ,QAAA,EAAU,GAAA,IACV,QAAA,EAAU,WAAA,IACV,iBAAiB,QAAQ,CAAA;AAC3B,oBAAA,MAAM,SAAA,GAAY,SAAA,GACd,gBAAA,CAAiB,SAAS,CAAA,GAC1B,MAAA;AACJ,oBAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,oBAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU;AAAA,sBACtC,MAAMF,YAAA,CAAS;AAAA,qBAChB,CAAA;AACD,oBAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAC9C,oBAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,IAAI,CAAA;AAExC,oBAAA,IAAI,SAAA,EAAW;AACb,sBAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,oBACpD;AAEA,oBAAA,IAAI,MAAA,EAAQ;AACV,sBAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAAA,oBAC5C;AAEA,oBAAA,IAAI,gBAAA,IAAoB,cAAc,MAAA,EAAW;AAC/C,sBAAA,MAAM,SAAA,GAAY,iBAAA;AAAA,wBAChB,SAAA;AAAA,wBACA;AAAA,uBACF;AACA,sBAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,oBACpD;AAEA,oBAAA,IAAI,QAAA,EAAU;AACZ,sBAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,oBACpD;AAEA,oBAAA,IAAI,QAAA,EAAU;AACZ,sBAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AAAA,oBACpD;AAGA,oBAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,sBAAA,IAAI;AACF,wBAAA,MAAM,SAAS,uBAAA,CAAwB,KAAA;AAAA,0BACrC,IAAA;AAAA,0BACA;AAAA,yBACF;AACA,wBAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,0BAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,0BAAA,OAAO,KAAA;AAAA,wBACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,0BAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,0BAAA,MAAM,KAAA;AAAA,wBACR,CAAC,CAAA;AAAA,sBACL,SAAS,KAAA,EAAO;AACd,wBAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,wBAAA,MAAM,KAAA;AAAA,sBACR;AAAA,oBACF,CAAC,CAAA;AAAA,kBACH,CAAA;AAAA,gBACF;AAEA,gBAAA,OAAO,QAAA;AAAA,cACT,CAAA;AAEA,cAAA,SAAA,CAAU,iBAAA,GAAoB,KAAK,CAAA,GAAI,IAAA;AAAA,YACzC;AAAA,UACF;AAGA,UAAA,OAAO,oBAAoB,EAAE,CAAA;AAAA,QAC/B,CAAA;AAGA,QAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,mBAAA,EAAqB,IAAA,EAAM;AAAA,UAC9C,eAAA;AAAA,UACA,GAAG;AAAA,SACJ,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,OAAA,CAAQ,iBAAA,GAAoB,cAAc,CAAA,GAAI,IAAA;AAC9C,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,IAAI,EAAA,CAAG,OAAA,IAAW,CAAC,YAAA,EAAc;AAC/B,IAAA,MAAM,SAAS,EAAA,CAAG,OAAA;AAElB,IAAA,IACE,OAAO,MAAA,CAAO,KAAA,KAAU,cACxB,OAAO,MAAA,CAAO,YAAY,UAAA,EAC1B;AACA,MAAA,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AAChC,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,IACE,EAAA,CAAG,CAAA,IACH,EAAA,CAAG,CAAA,CAAE,OAAA,IACL,OAAO,EAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,KAAY,UAAA,IAChC,CAAC,YAAA,EACD;AACA,IAAA,MAAM,OAAA,GAAU,GAAG,CAAA,CAAE,OAAA;AAGrB,IAAA,IAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM;AAAA,MACJ,YAAAC,WAAAA,GAAa,mBAAA;AAAA,MACb,UAAAC,SAAAA,GAAW,iBAAA;AAAA,MACX,MAAA,EAAAC,OAAAA;AAAA,MACA,kBAAAC,iBAAAA,GAAmB,IAAA;AAAA,MACnB,oBAAAC,mBAAAA,GAAqB,GAAA;AAAA,MACrB,QAAA,EAAAC,SAAAA;AAAA,MACA,QAAA,EAAAC;AAAA,KACF,GAAI,UAAU,EAAC;AAEf,IAAA,MAAMC,OAAAA,GAASX,SAAA,CAAM,SAAA,CAAUI,WAAU,CAAA;AACzC,IAAA,MAAM,kBAAkB,OAAA,CAAQ,OAAA;AAEhC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,mBAAA,GAAqC,SAASQ,aAAAA,CAAAA,GAE/C,IAAA,EACH;AAEA,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,SAAA,GAAY,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA;AAC5D,MAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AAGJ,MAAA,MAAM,IAAA,GAAOD,QAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMV,YAAA,CAAS,QAAQ,CAAA;AACjE,MAAA,IAAA,CAAK,YAAA,CAAa,oBAAoBI,SAAQ,CAAA;AAE9C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,MACpD;AAEA,MAAA,IAAIC,OAAAA,EAAQ;AACV,QAAA,IAAA,CAAK,YAAA,CAAa,kBAAkBA,OAAM,CAAA;AAAA,MAC5C;AAEA,MAAA,IAAIC,iBAAAA,IAAoB,cAAc,MAAA,EAAW;AAC/C,QAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,SAAA,EAAWC,mBAAkB,CAAA;AACjE,QAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,MACpD;AAEA,MAAA,IAAIC,SAAAA,EAAU;AACZ,QAAA,IAAA,CAAK,YAAA,CAAa,wBAAwBA,SAAQ,CAAA;AAAA,MACpD;AAEA,MAAA,IAAIC,SAAAA,EAAU;AACZ,QAAA,IAAA,CAAK,YAAA,CAAa,wBAAwBA,SAAQ,CAAA;AAAA,MACpD;AAGA,MAAA,OAAOR,wBAAA,CAAY,MAAM,MAAM;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAM,CAAA,CAC1B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,YAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL,SAAS,KAAA,EAAO;AACd,UAAAA,yBAAA,CAAa,MAAM,KAAK,CAAA;AACxB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,IAAA;AAC7B,IAAA,OAAA,CAAQ,OAAA,GAAU,mBAAA;AAClB,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,EAAA,CAAG,iBAAiB,CAAA,GAAI,IAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,EAAA;AACT;AC92BA,IAAMU,oBAAAA,GAAsB,0BAAA;AAC5B,IAAMC,kBAAAA,GAAoB,UAAA;AAC1B,IAAMC,kBAAAA,GAAoB,+BAAA;AAMnB,IAAM,mBAAA,0BAA4C,oBAAoB,CAAA;AA4C7E,SAAS,UAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACA,gBACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,SAAA,EAAY,cAAc,IAAI,SAAS,CAAA,CAAA,GACvC,SAAA,GACE,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAClC,YAAY,SAAS,CAAA,CAAA;AAE3B,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,CAAC,kBAAkB,GAAGD,kBAAAA;AAAA,IACtB,CAAC,qBAAqB,GAAG;AAAA,GAC3B;AAEA,EAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,IAAA,UAAA,CAAW,8BAA8B,CAAA,GAAI,cAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,UAAA,CAAW,gBAAgB,IAAI,MAAA,CAAO,MAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,sBAAsB,IAAI,MAAA,CAAO,QAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,sBAAsB,IAAI,MAAA,CAAO,QAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAA,CAAO,UAAU,QAAA,EAAU,EAAE,MAAMb,gBAAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AACzE;AAMA,SAAS,gBACP,MAAA,EACA,UAAA,EACA,WACA,iBAAA,EACA,YAAA,EACA,QACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,YAAA,CAAA,GAA2B,IAAA,EAAkB;AACzE,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAOC,wBAAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAE5C,UAAA,MAAA,CAAO,IAAA,GAAO,SAAS,WAAA,GAA4B;AACjD,YAAA,IAAI;AACF,cAAA,MAAM,cAAc,YAAA,EAAa;AAEjC,cAAA,OAAO,QAAQ,OAAA,CAAQ,WAAW,CAAA,CAC/B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,gBAAAC,0BAAa,IAAI,CAAA;AACjB,gBAAA,OAAO,KAAA;AAAA,cACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,gBAAAA,yBAAAA;AAAA,kBACE,IAAA;AAAA,kBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,iBAC1D;AACA,gBAAA,MAAM,KAAA;AAAA,cACR,CAAC,CAAA;AAAA,YACL,SAAS,KAAA,EAAO;AACd,cAAAA,yBAAAA;AAAA,gBACE,IAAA;AAAA,gBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,eAC1D;AACA,cAAA,MAAM,KAAA;AAAA,YACR;AAAA,UACF,CAAA;AAEA,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAA,0BAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,0BAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAKA,SAAS,mBAAA,CAAoB,QAAa,UAAA,EAA0B;AAClE,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,cAAA,CAAA,GAA6B,IAAA,EAAkB;AAC3E,IAAA,MAAM,cAAca,0BAAA,EAAc;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,MAAC,MAAA,CAAe,mBAAmB,CAAA,GAAI,WAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAMA,SAAS,gBAAA,CACP,MAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,2BAAA;AAClB,EAAA,IAAK,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,SAAA,CAAU,GAAA;AACrC,EAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,GAAM,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACtE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,WAAA,EAAa,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU,IAAA;AACtC,EAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AACtC,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,GAAO,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACvE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,YAAA,EAAc,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAEA,EAAC,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,GAAI,IAAA;AACzC;AAMA,SAAS,uBAAuB,OAAA,EAAuB;AACrD,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AAGjC,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,wBAAA,GAA2B;AAAA,IAC/B,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,yBAAyB,IAAA,CAAK,CAAC,YAAY,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA;AAC9E;AAMA,SAAS,eAAA,CACP,OAAA,EACA,QAAA,EACA,QAAA,EACA,QACA,MAAA,EACK;AACL,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAS,eAA0B,IAAA,EAAkB;AAC1D,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAa,SAAA,EAAW;AAC/B,QAAA,SAAA,GAAY,KAAK,WAAA,CAAY,SAAA;AAC7B,QAAA,cAAA,GACE,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MACnD,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,EAAO,SAAA,EAAW;AAChC,QAAA,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AACvB,QAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,SAAA,EAAY,cAAc,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAClD,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMf,gBAAAA,CAAS,UAAU,CAAA;AACnE,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,QAAQ,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,YAAA,CAAa,cAAc,SAAS,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,MAAA,IAAA,CAAK,YAAA,CAAa,gCAAgC,cAAc,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,oBAAoBa,kBAAiB,CAAA;AACvD,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,MAAM,CAAA;AAAA,IACnD;AAEA,IAAA,OAAOZ,wBAAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAEvC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAC,0BAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,0BAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AA6BO,SAAS,kBAAA,CACd,UACA,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAASY,kBAAiB,CAAA,EAAG;AAC/B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAuD;AAAA,IAC3D,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,IAC9B,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,IAC9B,UAAA,EAAY,QAAQ,UAAA,IAAcF,oBAAAA;AAAA,IAClC,qBAAA,EAAuB,QAAQ,qBAAA,IAAyB,IAAA;AAAA,IACxD,eAAA,EAAiB,QAAQ,eAAA,IAAmB;AAAA,GAC9C;AAEA,EAAA,MAAM,MAAA,GAASb,iBAAAA,CAAM,SAAA,CAAU,WAAA,CAAY,UAAU,CAAA;AAGrD,EAAA,IAAI,QAAA,CAAS,MAAA,IAAU,WAAA,CAAY,eAAA,EAAiB;AAClD,IAAA,gBAAA,CAAiB,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAe;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,KAAA,CAAM,SAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAA6D;AAAA,IACjE,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO;AAAA,IACpC,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU;AAAA,IAC1C,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,UAAA,EAAW;AAAA,IAC5C,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,mBAAA,EAAqB,SAAA,EAAW,mBAAA,EAAoB;AAAA,IAC9D,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,gBAAA,EAAiB;AAAA,IACxD,EAAE,MAAA,EAAQ,wBAAA,EAA0B,SAAA,EAAW,wBAAA;AAAyB,GAC1E;AAEA,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,SAAA,EAAU,IAAK,YAAA,EAAc;AAChD,IAAA,eAAA;AAAA,MACE,QAAA,CAAS,KAAA;AAAA,MACT,MAAA;AAAA,MACA,SAAA;AAAA,MACA,sBAAA;AAAA,MACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,MACtB,MAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AACvC,MAAA,mBAAA,CAAoB,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,EAAQ,WAAW,CAAA;AAC5C,EAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,EAAG;AACpC,MAAA,eAAA;AAAA,QACE,SAAS,KAAA,CAAM,SAAA;AAAA,QACf,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OACE,GAAA,CAAI,WAAA,EAAa,UAAA,EAAY,cAAA,IAC7B,IAAI,WAAA,EAAa,SAAA;AAAA,UAErB,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OAAO,IAAI,WAAA,EAAa,SAAA;AAAA,UAC1B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,YAAA,EAAc,aAAa,WAAW,CAAA;AACvE,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG;AAC1B,MAAA,eAAA;AAAA,QACE,QAAA,CAAS,KAAA;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,KAAA,KAAe;AACd,UAAA,IAAI;AACF,YAAA,OAAO,MAAM,UAAA,EAAY,cAAA;AAAA,UAC3B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,QACtB,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AACvC,MAAA,mBAAA,CAAoB,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,QAAA,CAASe,kBAAiB,CAAA,GAAI,IAAA;AAC9B,EAAA,OAAO,QAAA;AACT;AAMO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAAoB,MAAA,EAAwC;AAAxC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAyC;AAAA,EAE7D,OAAO,QAAA,EAAqB;AAC1B,IAAA,kBAAA,CAAmB,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EAC1C;AACF","file":"index.cjs","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` types are necessary for dynamic instrumentation patterns\n// where we need to wrap arbitrary methods and preserve their signatures\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\n\ntype QueryFunction = (...args: any[]) => any;\n\ninterface DrizzleClientLike {\n query?: QueryFunction;\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Configuration options for Drizzle instrumentation.\n */\nexport interface InstrumentDrizzleConfig {\n /**\n * Custom tracer name. Defaults to \"autotel-plugins/drizzle\".\n */\n tracerName?: string;\n\n /**\n * Database system identifier (e.g., \"postgresql\", \"mysql\", \"sqlite\").\n * Defaults to \"postgresql\".\n */\n dbSystem?: string;\n\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Whether to capture full SQL query text in spans.\n * Defaults to true.\n */\n captureQueryText?: boolean;\n\n /**\n * Maximum length for captured query text. Queries longer than this\n * will be truncated. Defaults to 1000 characters.\n */\n maxQueryTextLength?: number;\n\n /**\n * Remote hostname or IP address of the database server.\n * Example: \"db.example.com\" or \"192.168.1.100\"\n */\n peerName?: string;\n\n /**\n * Remote port number of the database server.\n * Example: 5432 for PostgreSQL, 3306 for MySQL\n */\n peerPort?: number;\n}\n\n/**\n * Extracts SQL query text from various query argument formats.\n */\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n if (queryArg && typeof queryArg === 'object') {\n // Generic SQL object format (used by LibSQL, MySQL, and others)\n if (typeof (queryArg as { sql?: unknown }).sql === 'string') {\n return (queryArg as { sql: string }).sql;\n }\n // PostgreSQL-style query object\n if (typeof (queryArg as { text?: unknown }).text === 'string') {\n return (queryArg as { text: string }).text;\n }\n // Drizzle SQL object\n if (\n typeof (queryArg as { queryChunks?: unknown }).queryChunks === 'object'\n ) {\n // Drizzle query objects may have complex structure, try to extract meaningful info\n const drizzleQuery = queryArg as Record<string, unknown>;\n if (typeof drizzleQuery.sql === 'string') {\n return drizzleQuery.sql;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Sanitizes and truncates query text for safe inclusion in spans.\n */\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, etc.) from query text.\n */\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<op>\\w+)/u.exec(trimmed);\n return match?.groups?.op?.toUpperCase();\n}\n\n/**\n * Instruments a database connection pool/client with OpenTelemetry tracing.\n *\n * This function wraps the connection's `query` and `execute` methods to create spans for each database\n * operation.\n * The instrumentation is idempotent - calling it multiple times on the same connection will only\n * instrument it once.\n *\n * @typeParam TClient - The type of the database connection pool or client\n * @param client - The database connection pool or client to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented pool/client (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const instrumentedPool = instrumentDrizzle(pool, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * const db = drizzle({ client: instrumentedPool });\n * ```\n *\n * @example\n * ```typescript\n * // MySQL with mysql2\n * import { drizzle } from 'drizzle-orm/mysql2';\n * import mysql from 'mysql2/promise';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const connection = await mysql.createConnection({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb',\n * });\n * const instrumentedConnection = instrumentDrizzle(connection, { dbSystem: 'mysql' });\n * const db = drizzle({ client: instrumentedConnection });\n * ```\n *\n * @example\n * ```typescript\n * // SQLite with better-sqlite3\n * import { drizzle } from 'drizzle-orm/better-sqlite3';\n * import Database from 'better-sqlite3';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const sqlite = new Database('sqlite.db');\n * const instrumentedSqlite = instrumentDrizzle(sqlite, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedSqlite });\n * ```\n *\n * @example\n * ```typescript\n * // LibSQL/Turso\n * import { drizzle } from 'drizzle-orm/libsql';\n * import { createClient } from '@libsql/client';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const client = createClient({\n * url: process.env.DATABASE_URL!,\n * authToken: process.env.DATABASE_AUTH_TOKEN,\n * });\n * const instrumentedClient = instrumentDrizzle(client, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedClient });\n * ```\n */\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client) {\n return client;\n }\n\n // Check if client has query or execute method\n const hasQuery = typeof client.query === 'function';\n const hasExecute = typeof client.execute === 'function';\n\n if (!hasQuery && !hasExecute) {\n return client;\n }\n\n if (client[INSTRUMENTED_FLAG]) {\n return client;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n\n // Store the original method (query or execute)\n const originalMethod = hasQuery ? client.query : client.execute;\n\n if (!originalMethod) {\n return client;\n }\n\n const instrumentedMethod: QueryFunction = function instrumented(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n let callback: QueryCallback | undefined;\n\n // Detect callback pattern\n if (typeof args.at(-1) === 'function') {\n callback = args.pop() as QueryCallback;\n }\n\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Callback-based pattern\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (err, result) => {\n finalizeSpan(span, err);\n if (callback) {\n callback(err, result);\n }\n };\n\n try {\n return Reflect.apply(originalMethod, this, [\n ...args,\n wrappedCallback,\n ]);\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n }\n\n // Promise-based pattern\n return runWithSpan(span, () => {\n try {\n const result = originalMethod.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n client[INSTRUMENTED_FLAG] = true;\n\n // Replace the original method with the instrumented one\n if (hasQuery) {\n client.query = instrumentedMethod;\n } else {\n client.execute = instrumentedMethod;\n }\n\n return client;\n}\n\n/**\n * Interface for Drizzle database instances with minimal type requirements.\n */\ninterface DrizzleDbLike {\n $client?: DrizzleClientLike | any; // Allow any client type\n execute?: QueryFunction; // Direct execute method on db\n transaction?: QueryFunction; // Transaction method on db\n _?: {\n session?: {\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any;\n };\n [key: string]: any;\n };\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Instruments a Drizzle database instance with OpenTelemetry tracing.\n *\n * This function instruments the database at the session level, automatically tracing all database\n * operations including query builders, direct SQL execution, and transactions.\n *\n * The instrumentation is idempotent - calling it multiple times on the same\n * database will only instrument it once.\n *\n * @typeParam TDb - The type of the Drizzle database instance\n * @param db - The Drizzle database instance to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented database instance (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with postgres.js\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a client instance\n * const queryClient = postgres(process.env.DATABASE_URL!);\n * const db = drizzle({ client: queryClient });\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n * ```\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres (pg)\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a pool\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const db = drizzle({ client: pool });\n * instrumentDrizzleClient(db, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * ```\n */\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db) {\n return db;\n }\n\n // Check if already instrumented\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n let instrumented = false;\n\n // First priority: Instrument the session directly\n // This is where all queries actually go through\n if ((db as any).session && !instrumented) {\n const session = (db as any).session;\n\n // Check if session has prepareQuery method (used by select/insert/update/delete)\n if (\n typeof session.prepareQuery === 'function' &&\n !session[INSTRUMENTED_FLAG]\n ) {\n const originalPrepareQuery = session.prepareQuery;\n\n session.prepareQuery = function (...args: any[]) {\n const prepared = originalPrepareQuery.apply(this, args);\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (this: any, ...executeArgs: any[]) {\n // Extract query information from the query object\n const queryObj = args[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n session[INSTRUMENTED_FLAG] = true;\n instrumented = true;\n }\n\n // Also instrument direct query method if exists\n if (\n typeof session.query === 'function' &&\n !session[INSTRUMENTED_FLAG + '_query']\n ) {\n const originalQuery = session.query;\n\n session.query = function (this: any, queryString: string, params: any[]) {\n const operation = queryString\n ? extractOperation(queryString)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryString !== undefined) {\n const sanitized = sanitizeQueryText(queryString, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = Reflect.apply(originalQuery, this, [\n queryString,\n params,\n ]);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG + '_query'] = true;\n instrumented = true;\n }\n\n // Instrument transaction method to ensure transaction sessions are also instrumented\n if (\n typeof session.transaction === 'function' &&\n !session[INSTRUMENTED_FLAG + '_transaction']\n ) {\n const originalTransaction = session.transaction;\n\n session.transaction = function (\n this: any,\n transactionCallback: any,\n ...restArgs: any[]\n ) {\n // Wrap the transaction callback to instrument the tx object\n const wrappedCallback = async function (tx: any) {\n // Instrument the transaction's session if it has one\n if (tx && (tx.session || tx._?.session || tx)) {\n const txSession = tx.session || tx._?.session || tx;\n\n // Instrument tx.execute if it exists\n if (\n typeof tx.execute === 'function' &&\n !tx[INSTRUMENTED_FLAG + '_execute']\n ) {\n const originalTxExecute = tx.execute;\n\n tx.execute = function (this: any, ...executeArgs: any[]) {\n const queryText = extractQueryText(executeArgs[0]);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = originalTxExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n tx[INSTRUMENTED_FLAG + '_execute'] = true;\n }\n\n // Also instrument txSession.prepareQuery if it exists\n if (\n typeof txSession.prepareQuery === 'function' &&\n !txSession[INSTRUMENTED_FLAG + '_tx']\n ) {\n const originalTxPrepareQuery = txSession.prepareQuery;\n\n txSession.prepareQuery = function (...prepareArgs: any[]) {\n const prepared = originalTxPrepareQuery.apply(\n this,\n prepareArgs,\n );\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (\n this: any,\n ...executeArgs: any[]\n ) {\n // Extract query information from the query object\n const queryObj = prepareArgs[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(\n this,\n executeArgs,\n );\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n txSession[INSTRUMENTED_FLAG + '_tx'] = true;\n }\n }\n\n // Call the original callback with the instrumented tx\n return transactionCallback(tx);\n };\n\n // Call the original transaction with the wrapped callback\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[INSTRUMENTED_FLAG + '_transaction'] = true;\n instrumented = true;\n }\n }\n\n if (db.$client && !instrumented) {\n const client = db.$client;\n // Check if client has query or execute function\n if (\n typeof client.query === 'function' ||\n typeof client.execute === 'function'\n ) {\n instrumentDrizzle(client, config);\n instrumented = true;\n }\n }\n\n // Third priority: Try to instrument via session.execute as fallback\n if (\n db._ &&\n db._.session &&\n typeof db._.session.execute === 'function' &&\n !instrumented\n ) {\n const session = db._.session;\n\n // Check if already instrumented\n if (session[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n const originalExecute = session.execute;\n\n if (!originalExecute) {\n return db;\n }\n\n const instrumentedExecute: QueryFunction = function instrumented(\n this: any,\n ...args: any[]\n ) {\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Promise-based pattern (session.execute is typically promise-based)\n return runWithSpan(span, () => {\n try {\n const result = originalExecute.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG] = true;\n session.execute = instrumentedExecute;\n instrumented = true;\n }\n\n // Mark the db as instrumented if we instrumented anything\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -463,7 +463,7 @@ function instrumentDrizzleClient(db, config) {
463
463
  var DEFAULT_TRACER_NAME2 = "autotel-plugins/mongoose";
464
464
  var DEFAULT_DB_SYSTEM2 = "mongoose";
465
465
  var INSTRUMENTED_FLAG2 = "__autotelMongooseInstrumented";
466
- var _STORED_PARENT_SPAN = Symbol("stored-parent-span");
466
+ var _STORED_PARENT_SPAN = /* @__PURE__ */ Symbol("stored-parent-span");
467
467
  function createSpan(tracer, operation, modelName, collectionName, config) {
468
468
  const spanName = collectionName ? `mongoose.${collectionName}.${operation}` : modelName ? `mongoose.${modelName}.${operation}` : `mongoose.${operation}`;
469
469
  const attributes = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts","../src/mongoose/index.ts"],"names":["tracerName","dbSystem","dbName","captureQueryText","maxQueryTextLength","peerName","peerPort","tracer","instrumented","DEFAULT_TRACER_NAME","DEFAULT_DB_SYSTEM","INSTRUMENTED_FLAG","SpanKind","runWithSpan","finalizeSpan","trace"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` types are necessary for dynamic instrumentation patterns\n// where we need to wrap arbitrary methods and preserve their signatures\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\n\ntype QueryFunction = (...args: any[]) => any;\n\ninterface DrizzleClientLike {\n query?: QueryFunction;\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Configuration options for Drizzle instrumentation.\n */\nexport interface InstrumentDrizzleConfig {\n /**\n * Custom tracer name. Defaults to \"autotel-plugins/drizzle\".\n */\n tracerName?: string;\n\n /**\n * Database system identifier (e.g., \"postgresql\", \"mysql\", \"sqlite\").\n * Defaults to \"postgresql\".\n */\n dbSystem?: string;\n\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Whether to capture full SQL query text in spans.\n * Defaults to true.\n */\n captureQueryText?: boolean;\n\n /**\n * Maximum length for captured query text. Queries longer than this\n * will be truncated. Defaults to 1000 characters.\n */\n maxQueryTextLength?: number;\n\n /**\n * Remote hostname or IP address of the database server.\n * Example: \"db.example.com\" or \"192.168.1.100\"\n */\n peerName?: string;\n\n /**\n * Remote port number of the database server.\n * Example: 5432 for PostgreSQL, 3306 for MySQL\n */\n peerPort?: number;\n}\n\n/**\n * Extracts SQL query text from various query argument formats.\n */\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n if (queryArg && typeof queryArg === 'object') {\n // Generic SQL object format (used by LibSQL, MySQL, and others)\n if (typeof (queryArg as { sql?: unknown }).sql === 'string') {\n return (queryArg as { sql: string }).sql;\n }\n // PostgreSQL-style query object\n if (typeof (queryArg as { text?: unknown }).text === 'string') {\n return (queryArg as { text: string }).text;\n }\n // Drizzle SQL object\n if (\n typeof (queryArg as { queryChunks?: unknown }).queryChunks === 'object'\n ) {\n // Drizzle query objects may have complex structure, try to extract meaningful info\n const drizzleQuery = queryArg as Record<string, unknown>;\n if (typeof drizzleQuery.sql === 'string') {\n return drizzleQuery.sql;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Sanitizes and truncates query text for safe inclusion in spans.\n */\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, etc.) from query text.\n */\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<op>\\w+)/u.exec(trimmed);\n return match?.groups?.op?.toUpperCase();\n}\n\n/**\n * Instruments a database connection pool/client with OpenTelemetry tracing.\n *\n * This function wraps the connection's `query` and `execute` methods to create spans for each database\n * operation.\n * The instrumentation is idempotent - calling it multiple times on the same connection will only\n * instrument it once.\n *\n * @typeParam TClient - The type of the database connection pool or client\n * @param client - The database connection pool or client to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented pool/client (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const instrumentedPool = instrumentDrizzle(pool, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * const db = drizzle({ client: instrumentedPool });\n * ```\n *\n * @example\n * ```typescript\n * // MySQL with mysql2\n * import { drizzle } from 'drizzle-orm/mysql2';\n * import mysql from 'mysql2/promise';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const connection = await mysql.createConnection({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb',\n * });\n * const instrumentedConnection = instrumentDrizzle(connection, { dbSystem: 'mysql' });\n * const db = drizzle({ client: instrumentedConnection });\n * ```\n *\n * @example\n * ```typescript\n * // SQLite with better-sqlite3\n * import { drizzle } from 'drizzle-orm/better-sqlite3';\n * import Database from 'better-sqlite3';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const sqlite = new Database('sqlite.db');\n * const instrumentedSqlite = instrumentDrizzle(sqlite, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedSqlite });\n * ```\n *\n * @example\n * ```typescript\n * // LibSQL/Turso\n * import { drizzle } from 'drizzle-orm/libsql';\n * import { createClient } from '@libsql/client';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const client = createClient({\n * url: process.env.DATABASE_URL!,\n * authToken: process.env.DATABASE_AUTH_TOKEN,\n * });\n * const instrumentedClient = instrumentDrizzle(client, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedClient });\n * ```\n */\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client) {\n return client;\n }\n\n // Check if client has query or execute method\n const hasQuery = typeof client.query === 'function';\n const hasExecute = typeof client.execute === 'function';\n\n if (!hasQuery && !hasExecute) {\n return client;\n }\n\n if (client[INSTRUMENTED_FLAG]) {\n return client;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n\n // Store the original method (query or execute)\n const originalMethod = hasQuery ? client.query : client.execute;\n\n if (!originalMethod) {\n return client;\n }\n\n const instrumentedMethod: QueryFunction = function instrumented(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n let callback: QueryCallback | undefined;\n\n // Detect callback pattern\n if (typeof args.at(-1) === 'function') {\n callback = args.pop() as QueryCallback;\n }\n\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Callback-based pattern\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (err, result) => {\n finalizeSpan(span, err);\n if (callback) {\n callback(err, result);\n }\n };\n\n try {\n return Reflect.apply(originalMethod, this, [\n ...args,\n wrappedCallback,\n ]);\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n }\n\n // Promise-based pattern\n return runWithSpan(span, () => {\n try {\n const result = originalMethod.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n client[INSTRUMENTED_FLAG] = true;\n\n // Replace the original method with the instrumented one\n if (hasQuery) {\n client.query = instrumentedMethod;\n } else {\n client.execute = instrumentedMethod;\n }\n\n return client;\n}\n\n/**\n * Interface for Drizzle database instances with minimal type requirements.\n */\ninterface DrizzleDbLike {\n $client?: DrizzleClientLike | any; // Allow any client type\n execute?: QueryFunction; // Direct execute method on db\n transaction?: QueryFunction; // Transaction method on db\n _?: {\n session?: {\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any;\n };\n [key: string]: any;\n };\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Instruments a Drizzle database instance with OpenTelemetry tracing.\n *\n * This function instruments the database at the session level, automatically tracing all database\n * operations including query builders, direct SQL execution, and transactions.\n *\n * The instrumentation is idempotent - calling it multiple times on the same\n * database will only instrument it once.\n *\n * @typeParam TDb - The type of the Drizzle database instance\n * @param db - The Drizzle database instance to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented database instance (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with postgres.js\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a client instance\n * const queryClient = postgres(process.env.DATABASE_URL!);\n * const db = drizzle({ client: queryClient });\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n * ```\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres (pg)\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a pool\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const db = drizzle({ client: pool });\n * instrumentDrizzleClient(db, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * ```\n */\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db) {\n return db;\n }\n\n // Check if already instrumented\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n let instrumented = false;\n\n // First priority: Instrument the session directly\n // This is where all queries actually go through\n if ((db as any).session && !instrumented) {\n const session = (db as any).session;\n\n // Check if session has prepareQuery method (used by select/insert/update/delete)\n if (\n typeof session.prepareQuery === 'function' &&\n !session[INSTRUMENTED_FLAG]\n ) {\n const originalPrepareQuery = session.prepareQuery;\n\n session.prepareQuery = function (...args: any[]) {\n const prepared = originalPrepareQuery.apply(this, args);\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (this: any, ...executeArgs: any[]) {\n // Extract query information from the query object\n const queryObj = args[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n session[INSTRUMENTED_FLAG] = true;\n instrumented = true;\n }\n\n // Also instrument direct query method if exists\n if (\n typeof session.query === 'function' &&\n !session[INSTRUMENTED_FLAG + '_query']\n ) {\n const originalQuery = session.query;\n\n session.query = function (this: any, queryString: string, params: any[]) {\n const operation = queryString\n ? extractOperation(queryString)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryString !== undefined) {\n const sanitized = sanitizeQueryText(queryString, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = Reflect.apply(originalQuery, this, [\n queryString,\n params,\n ]);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG + '_query'] = true;\n instrumented = true;\n }\n\n // Instrument transaction method to ensure transaction sessions are also instrumented\n if (\n typeof session.transaction === 'function' &&\n !session[INSTRUMENTED_FLAG + '_transaction']\n ) {\n const originalTransaction = session.transaction;\n\n session.transaction = function (\n this: any,\n transactionCallback: any,\n ...restArgs: any[]\n ) {\n // Wrap the transaction callback to instrument the tx object\n const wrappedCallback = async function (tx: any) {\n // Instrument the transaction's session if it has one\n if (tx && (tx.session || tx._?.session || tx)) {\n const txSession = tx.session || tx._?.session || tx;\n\n // Instrument tx.execute if it exists\n if (\n typeof tx.execute === 'function' &&\n !tx[INSTRUMENTED_FLAG + '_execute']\n ) {\n const originalTxExecute = tx.execute;\n\n tx.execute = function (this: any, ...executeArgs: any[]) {\n const queryText = extractQueryText(executeArgs[0]);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = originalTxExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n tx[INSTRUMENTED_FLAG + '_execute'] = true;\n }\n\n // Also instrument txSession.prepareQuery if it exists\n if (\n typeof txSession.prepareQuery === 'function' &&\n !txSession[INSTRUMENTED_FLAG + '_tx']\n ) {\n const originalTxPrepareQuery = txSession.prepareQuery;\n\n txSession.prepareQuery = function (...prepareArgs: any[]) {\n const prepared = originalTxPrepareQuery.apply(\n this,\n prepareArgs,\n );\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (\n this: any,\n ...executeArgs: any[]\n ) {\n // Extract query information from the query object\n const queryObj = prepareArgs[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(\n this,\n executeArgs,\n );\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n txSession[INSTRUMENTED_FLAG + '_tx'] = true;\n }\n }\n\n // Call the original callback with the instrumented tx\n return transactionCallback(tx);\n };\n\n // Call the original transaction with the wrapped callback\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[INSTRUMENTED_FLAG + '_transaction'] = true;\n instrumented = true;\n }\n }\n\n if (db.$client && !instrumented) {\n const client = db.$client;\n // Check if client has query or execute function\n if (\n typeof client.query === 'function' ||\n typeof client.execute === 'function'\n ) {\n instrumentDrizzle(client, config);\n instrumented = true;\n }\n }\n\n // Third priority: Try to instrument via session.execute as fallback\n if (\n db._ &&\n db._.session &&\n typeof db._.session.execute === 'function' &&\n !instrumented\n ) {\n const session = db._.session;\n\n // Check if already instrumented\n if (session[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n const originalExecute = session.execute;\n\n if (!originalExecute) {\n return db;\n }\n\n const instrumentedExecute: QueryFunction = function instrumented(\n this: any,\n ...args: any[]\n ) {\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Promise-based pattern (session.execute is typically promise-based)\n return runWithSpan(span, () => {\n try {\n const result = originalExecute.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG] = true;\n session.execute = instrumentedExecute;\n instrumented = true;\n }\n\n // Mark the db as instrumented if we instrumented anything\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts","../src/mongoose/index.ts"],"names":["tracerName","dbSystem","dbName","captureQueryText","maxQueryTextLength","peerName","peerPort","tracer","instrumented","DEFAULT_TRACER_NAME","DEFAULT_DB_SYSTEM","INSTRUMENTED_FLAG","SpanKind","runWithSpan","finalizeSpan","trace"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` types are necessary for dynamic instrumentation patterns\n// where we need to wrap arbitrary methods and preserve their signatures\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\n\ntype QueryFunction = (...args: any[]) => any;\n\ninterface DrizzleClientLike {\n query?: QueryFunction;\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Configuration options for Drizzle instrumentation.\n */\nexport interface InstrumentDrizzleConfig {\n /**\n * Custom tracer name. Defaults to \"autotel-plugins/drizzle\".\n */\n tracerName?: string;\n\n /**\n * Database system identifier (e.g., \"postgresql\", \"mysql\", \"sqlite\").\n * Defaults to \"postgresql\".\n */\n dbSystem?: string;\n\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Whether to capture full SQL query text in spans.\n * Defaults to true.\n */\n captureQueryText?: boolean;\n\n /**\n * Maximum length for captured query text. Queries longer than this\n * will be truncated. Defaults to 1000 characters.\n */\n maxQueryTextLength?: number;\n\n /**\n * Remote hostname or IP address of the database server.\n * Example: \"db.example.com\" or \"192.168.1.100\"\n */\n peerName?: string;\n\n /**\n * Remote port number of the database server.\n * Example: 5432 for PostgreSQL, 3306 for MySQL\n */\n peerPort?: number;\n}\n\n/**\n * Extracts SQL query text from various query argument formats.\n */\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n if (queryArg && typeof queryArg === 'object') {\n // Generic SQL object format (used by LibSQL, MySQL, and others)\n if (typeof (queryArg as { sql?: unknown }).sql === 'string') {\n return (queryArg as { sql: string }).sql;\n }\n // PostgreSQL-style query object\n if (typeof (queryArg as { text?: unknown }).text === 'string') {\n return (queryArg as { text: string }).text;\n }\n // Drizzle SQL object\n if (\n typeof (queryArg as { queryChunks?: unknown }).queryChunks === 'object'\n ) {\n // Drizzle query objects may have complex structure, try to extract meaningful info\n const drizzleQuery = queryArg as Record<string, unknown>;\n if (typeof drizzleQuery.sql === 'string') {\n return drizzleQuery.sql;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Sanitizes and truncates query text for safe inclusion in spans.\n */\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, etc.) from query text.\n */\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<op>\\w+)/u.exec(trimmed);\n return match?.groups?.op?.toUpperCase();\n}\n\n/**\n * Instruments a database connection pool/client with OpenTelemetry tracing.\n *\n * This function wraps the connection's `query` and `execute` methods to create spans for each database\n * operation.\n * The instrumentation is idempotent - calling it multiple times on the same connection will only\n * instrument it once.\n *\n * @typeParam TClient - The type of the database connection pool or client\n * @param client - The database connection pool or client to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented pool/client (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const instrumentedPool = instrumentDrizzle(pool, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * const db = drizzle({ client: instrumentedPool });\n * ```\n *\n * @example\n * ```typescript\n * // MySQL with mysql2\n * import { drizzle } from 'drizzle-orm/mysql2';\n * import mysql from 'mysql2/promise';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const connection = await mysql.createConnection({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb',\n * });\n * const instrumentedConnection = instrumentDrizzle(connection, { dbSystem: 'mysql' });\n * const db = drizzle({ client: instrumentedConnection });\n * ```\n *\n * @example\n * ```typescript\n * // SQLite with better-sqlite3\n * import { drizzle } from 'drizzle-orm/better-sqlite3';\n * import Database from 'better-sqlite3';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const sqlite = new Database('sqlite.db');\n * const instrumentedSqlite = instrumentDrizzle(sqlite, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedSqlite });\n * ```\n *\n * @example\n * ```typescript\n * // LibSQL/Turso\n * import { drizzle } from 'drizzle-orm/libsql';\n * import { createClient } from '@libsql/client';\n * import { instrumentDrizzle } from 'autotel-plugins/drizzle';\n *\n * const client = createClient({\n * url: process.env.DATABASE_URL!,\n * authToken: process.env.DATABASE_AUTH_TOKEN,\n * });\n * const instrumentedClient = instrumentDrizzle(client, { dbSystem: 'sqlite' });\n * const db = drizzle({ client: instrumentedClient });\n * ```\n */\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client) {\n return client;\n }\n\n // Check if client has query or execute method\n const hasQuery = typeof client.query === 'function';\n const hasExecute = typeof client.execute === 'function';\n\n if (!hasQuery && !hasExecute) {\n return client;\n }\n\n if (client[INSTRUMENTED_FLAG]) {\n return client;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n\n // Store the original method (query or execute)\n const originalMethod = hasQuery ? client.query : client.execute;\n\n if (!originalMethod) {\n return client;\n }\n\n const instrumentedMethod: QueryFunction = function instrumented(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n let callback: QueryCallback | undefined;\n\n // Detect callback pattern\n if (typeof args.at(-1) === 'function') {\n callback = args.pop() as QueryCallback;\n }\n\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Callback-based pattern\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (err, result) => {\n finalizeSpan(span, err);\n if (callback) {\n callback(err, result);\n }\n };\n\n try {\n return Reflect.apply(originalMethod, this, [\n ...args,\n wrappedCallback,\n ]);\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n }\n\n // Promise-based pattern\n return runWithSpan(span, () => {\n try {\n const result = originalMethod.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n client[INSTRUMENTED_FLAG] = true;\n\n // Replace the original method with the instrumented one\n if (hasQuery) {\n client.query = instrumentedMethod;\n } else {\n client.execute = instrumentedMethod;\n }\n\n return client;\n}\n\n/**\n * Interface for Drizzle database instances with minimal type requirements.\n */\ninterface DrizzleDbLike {\n $client?: DrizzleClientLike | any; // Allow any client type\n execute?: QueryFunction; // Direct execute method on db\n transaction?: QueryFunction; // Transaction method on db\n _?: {\n session?: {\n execute?: QueryFunction;\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any;\n };\n [key: string]: any;\n };\n [INSTRUMENTED_FLAG]?: true;\n [key: string]: any; // Allow other properties\n}\n\n/**\n * Instruments a Drizzle database instance with OpenTelemetry tracing.\n *\n * This function instruments the database at the session level, automatically tracing all database\n * operations including query builders, direct SQL execution, and transactions.\n *\n * The instrumentation is idempotent - calling it multiple times on the same\n * database will only instrument it once.\n *\n * @typeParam TDb - The type of the Drizzle database instance\n * @param db - The Drizzle database instance to instrument\n * @param config - Optional configuration for instrumentation behavior\n * @returns The instrumented database instance (same instance, modified in place)\n *\n * @example\n * ```typescript\n * // PostgreSQL with postgres.js\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a client instance\n * const queryClient = postgres(process.env.DATABASE_URL!);\n * const db = drizzle({ client: queryClient });\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n * ```\n *\n * @example\n * ```typescript\n * // PostgreSQL with node-postgres (pg)\n * import { drizzle } from 'drizzle-orm/node-postgres';\n * import { Pool } from 'pg';\n * import { instrumentDrizzleClient } from 'autotel-plugins/drizzle';\n *\n * // Using connection string\n * const db = drizzle(process.env.DATABASE_URL!);\n * instrumentDrizzleClient(db, { dbSystem: 'postgresql' });\n *\n * // Or with a pool\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const db = drizzle({ client: pool });\n * instrumentDrizzleClient(db, {\n * dbSystem: 'postgresql',\n * dbName: 'myapp',\n * peerName: 'db.example.com',\n * peerPort: 5432,\n * });\n * ```\n */\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db) {\n return db;\n }\n\n // Check if already instrumented\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n let instrumented = false;\n\n // First priority: Instrument the session directly\n // This is where all queries actually go through\n if ((db as any).session && !instrumented) {\n const session = (db as any).session;\n\n // Check if session has prepareQuery method (used by select/insert/update/delete)\n if (\n typeof session.prepareQuery === 'function' &&\n !session[INSTRUMENTED_FLAG]\n ) {\n const originalPrepareQuery = session.prepareQuery;\n\n session.prepareQuery = function (...args: any[]) {\n const prepared = originalPrepareQuery.apply(this, args);\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (this: any, ...executeArgs: any[]) {\n // Extract query information from the query object\n const queryObj = args[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n session[INSTRUMENTED_FLAG] = true;\n instrumented = true;\n }\n\n // Also instrument direct query method if exists\n if (\n typeof session.query === 'function' &&\n !session[INSTRUMENTED_FLAG + '_query']\n ) {\n const originalQuery = session.query;\n\n session.query = function (this: any, queryString: string, params: any[]) {\n const operation = queryString\n ? extractOperation(queryString)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryString !== undefined) {\n const sanitized = sanitizeQueryText(queryString, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = Reflect.apply(originalQuery, this, [\n queryString,\n params,\n ]);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG + '_query'] = true;\n instrumented = true;\n }\n\n // Instrument transaction method to ensure transaction sessions are also instrumented\n if (\n typeof session.transaction === 'function' &&\n !session[INSTRUMENTED_FLAG + '_transaction']\n ) {\n const originalTransaction = session.transaction;\n\n session.transaction = function (\n this: any,\n transactionCallback: any,\n ...restArgs: any[]\n ) {\n // Wrap the transaction callback to instrument the tx object\n const wrappedCallback = async function (tx: any) {\n // Instrument the transaction's session if it has one\n if (tx && (tx.session || tx._?.session || tx)) {\n const txSession = tx.session || tx._?.session || tx;\n\n // Instrument tx.execute if it exists\n if (\n typeof tx.execute === 'function' &&\n !tx[INSTRUMENTED_FLAG + '_execute']\n ) {\n const originalTxExecute = tx.execute;\n\n tx.execute = function (this: any, ...executeArgs: any[]) {\n const queryText = extractQueryText(executeArgs[0]);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the query\n return runWithSpan(span, () => {\n try {\n const result = originalTxExecute.apply(this, executeArgs);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n tx[INSTRUMENTED_FLAG + '_execute'] = true;\n }\n\n // Also instrument txSession.prepareQuery if it exists\n if (\n typeof txSession.prepareQuery === 'function' &&\n !txSession[INSTRUMENTED_FLAG + '_tx']\n ) {\n const originalTxPrepareQuery = txSession.prepareQuery;\n\n txSession.prepareQuery = function (...prepareArgs: any[]) {\n const prepared = originalTxPrepareQuery.apply(\n this,\n prepareArgs,\n );\n\n // Wrap the prepared query's execute method\n if (prepared && typeof prepared.execute === 'function') {\n const originalPreparedExecute = prepared.execute;\n\n prepared.execute = function (\n this: any,\n ...executeArgs: any[]\n ) {\n // Extract query information from the query object\n const queryObj = prepareArgs[0]; // The query object passed to prepareQuery\n const queryText =\n queryObj?.sql ||\n queryObj?.queryString ||\n extractQueryText(queryObj);\n const operation = queryText\n ? extractOperation(queryText)\n : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n span.setAttribute('db.transaction', true);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(\n queryText,\n maxQueryTextLength,\n );\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Execute the prepared query\n return runWithSpan(span, () => {\n try {\n const result = originalPreparedExecute.apply(\n this,\n executeArgs,\n );\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n }\n\n return prepared;\n };\n\n txSession[INSTRUMENTED_FLAG + '_tx'] = true;\n }\n }\n\n // Call the original callback with the instrumented tx\n return transactionCallback(tx);\n };\n\n // Call the original transaction with the wrapped callback\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[INSTRUMENTED_FLAG + '_transaction'] = true;\n instrumented = true;\n }\n }\n\n if (db.$client && !instrumented) {\n const client = db.$client;\n // Check if client has query or execute function\n if (\n typeof client.query === 'function' ||\n typeof client.execute === 'function'\n ) {\n instrumentDrizzle(client, config);\n instrumented = true;\n }\n }\n\n // Third priority: Try to instrument via session.execute as fallback\n if (\n db._ &&\n db._.session &&\n typeof db._.session.execute === 'function' &&\n !instrumented\n ) {\n const session = db._.session;\n\n // Check if already instrumented\n if (session[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const {\n tracerName = DEFAULT_TRACER_NAME,\n dbSystem = DEFAULT_DB_SYSTEM,\n dbName,\n captureQueryText = true,\n maxQueryTextLength = 1000,\n peerName,\n peerPort,\n } = config ?? {};\n\n const tracer = trace.getTracer(tracerName);\n const originalExecute = session.execute;\n\n if (!originalExecute) {\n return db;\n }\n\n const instrumentedExecute: QueryFunction = function instrumented(\n this: any,\n ...args: any[]\n ) {\n // Extract query information\n const queryText = extractQueryText(args[0]);\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n\n // Start span\n const span = tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n span.setAttribute(SEMATTRS_DB_SYSTEM, dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, dbName);\n }\n\n if (captureQueryText && queryText !== undefined) {\n const sanitized = sanitizeQueryText(queryText, maxQueryTextLength);\n span.setAttribute(SEMATTRS_DB_STATEMENT, sanitized);\n }\n\n if (peerName) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, peerName);\n }\n\n if (peerPort) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, peerPort);\n }\n\n // Promise-based pattern (session.execute is typically promise-based)\n return runWithSpan(span, () => {\n try {\n const result = originalExecute.apply(this, args);\n return Promise.resolve(result)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error) => {\n finalizeSpan(span, error);\n throw error;\n });\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n };\n\n session[INSTRUMENTED_FLAG] = true;\n session.execute = instrumentedExecute;\n instrumented = true;\n }\n\n // Mark the db as instrumented if we instrumented anything\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
package/dist/mongoose.cjs CHANGED
@@ -15,7 +15,7 @@ var SEMATTRS_NET_PEER_PORT = "net.peer.port";
15
15
  var DEFAULT_TRACER_NAME = "autotel-plugins/mongoose";
16
16
  var DEFAULT_DB_SYSTEM = "mongoose";
17
17
  var INSTRUMENTED_FLAG = "__autotelMongooseInstrumented";
18
- var _STORED_PARENT_SPAN = Symbol("stored-parent-span");
18
+ var _STORED_PARENT_SPAN = /* @__PURE__ */ Symbol("stored-parent-span");
19
19
  function createSpan(tracer, operation, modelName, collectionName, config) {
20
20
  const spanName = collectionName ? `mongoose.${collectionName}.${operation}` : modelName ? `mongoose.${modelName}.${operation}` : `mongoose.${operation}`;
21
21
  const attributes = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/mongoose/index.ts"],"names":["SpanKind","runWithSpan","finalizeSpan","getActiveSpan","trace"],"mappings":";;;;;;;;AAMO,IAAM,kBAAA,GAAqB,WAAA;AAC3B,IAAM,qBAAA,GAAwB,cAAA;AAE9B,IAAM,gBAAA,GAAmB,SAAA;AAGzB,IAAM,8BAAA,GAAiC,uBAAA;AAGvC,IAAM,sBAAA,GAAyB,eAAA;AAC/B,IAAM,sBAAA,GAAyB,eAAA;ACGtC,IAAM,mBAAA,GAAsB,0BAAA;AAC5B,IAAM,iBAAA,GAAoB,UAAA;AAC1B,IAAM,iBAAA,GAAoB,+BAAA;AAMnB,IAAM,mBAAA,GAAqC,OAAO,oBAAoB;AA4C7E,SAAS,UAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACA,gBACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,SAAA,EAAY,cAAc,IAAI,SAAS,CAAA,CAAA,GACvC,SAAA,GACE,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAClC,YAAY,SAAS,CAAA,CAAA;AAE3B,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,CAAC,kBAAkB,GAAG,iBAAA;AAAA,IACtB,CAAC,qBAAqB,GAAG;AAAA,GAC3B;AAEA,EAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,IAAA,UAAA,CAAW,8BAA8B,CAAA,GAAI,cAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,UAAA,CAAW,gBAAgB,IAAI,MAAA,CAAO,MAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,sBAAsB,IAAI,MAAA,CAAO,QAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,sBAAsB,IAAI,MAAA,CAAO,QAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAA,CAAO,UAAU,QAAA,EAAU,EAAE,MAAMA,gBAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AACzE;AAMA,SAAS,gBACP,MAAA,EACA,UAAA,EACA,WACA,iBAAA,EACA,YAAA,EACA,QACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,YAAA,CAAA,GAA2B,IAAA,EAAkB;AACzE,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAE5C,UAAA,MAAA,CAAO,IAAA,GAAO,SAAS,WAAA,GAA4B;AACjD,YAAA,IAAI;AACF,cAAA,MAAM,cAAc,YAAA,EAAa;AAEjC,cAAA,OAAO,QAAQ,OAAA,CAAQ,WAAW,CAAA,CAC/B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,gBAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,gBAAA,OAAO,KAAA;AAAA,cACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,gBAAAA,yBAAA;AAAA,kBACE,IAAA;AAAA,kBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,iBAC1D;AACA,gBAAA,MAAM,KAAA;AAAA,cACR,CAAC,CAAA;AAAA,YACL,SAAS,KAAA,EAAO;AACd,cAAAA,yBAAA;AAAA,gBACE,IAAA;AAAA,gBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,eAC1D;AACA,cAAA,MAAM,KAAA;AAAA,YACR;AAAA,UACF,CAAA;AAEA,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAKA,SAAS,mBAAA,CAAoB,QAAa,UAAA,EAA0B;AAClE,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,cAAA,CAAA,GAA6B,IAAA,EAAkB;AAC3E,IAAA,MAAM,cAAcC,0BAAA,EAAc;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,MAAC,MAAA,CAAe,mBAAmB,CAAA,GAAI,WAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAMA,SAAS,gBAAA,CACP,MAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,2BAAA;AAClB,EAAA,IAAK,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,SAAA,CAAU,GAAA;AACrC,EAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,GAAM,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACtE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,WAAA,EAAa,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU,IAAA;AACtC,EAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AACtC,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,GAAO,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACvE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,YAAA,EAAc,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAEA,EAAC,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,GAAI,IAAA;AACzC;AAMA,SAAS,uBAAuB,OAAA,EAAuB;AACrD,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AAGjC,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,wBAAA,GAA2B;AAAA,IAC/B,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,yBAAyB,IAAA,CAAK,CAAC,YAAY,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA;AAC9E;AAMA,SAAS,eAAA,CACP,OAAA,EACA,QAAA,EACA,QAAA,EACA,QACA,MAAA,EACK;AACL,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAS,eAA0B,IAAA,EAAkB;AAC1D,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAa,SAAA,EAAW;AAC/B,QAAA,SAAA,GAAY,KAAK,WAAA,CAAY,SAAA;AAC7B,QAAA,cAAA,GACE,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MACnD,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,EAAO,SAAA,EAAW;AAChC,QAAA,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AACvB,QAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,SAAA,EAAY,cAAc,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAClD,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMH,gBAAA,CAAS,UAAU,CAAA;AACnE,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,QAAQ,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,YAAA,CAAa,cAAc,SAAS,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,MAAA,IAAA,CAAK,YAAA,CAAa,gCAAgC,cAAc,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,iBAAiB,CAAA;AACvD,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,MAAM,CAAA;AAAA,IACnD;AAEA,IAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAEvC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AA6BO,SAAS,kBAAA,CACd,UACA,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC/B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAuD;AAAA,IAC3D,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,IAC9B,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,IAC9B,UAAA,EAAY,QAAQ,UAAA,IAAc,mBAAA;AAAA,IAClC,qBAAA,EAAuB,QAAQ,qBAAA,IAAyB,IAAA;AAAA,IACxD,eAAA,EAAiB,QAAQ,eAAA,IAAmB;AAAA,GAC9C;AAEA,EAAA,MAAM,MAAA,GAASE,iBAAA,CAAM,SAAA,CAAU,WAAA,CAAY,UAAU,CAAA;AAGrD,EAAA,IAAI,QAAA,CAAS,MAAA,IAAU,WAAA,CAAY,eAAA,EAAiB;AAClD,IAAA,gBAAA,CAAiB,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAe;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,KAAA,CAAM,SAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAA6D;AAAA,IACjE,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO;AAAA,IACpC,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU;AAAA,IAC1C,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,UAAA,EAAW;AAAA,IAC5C,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,mBAAA,EAAqB,SAAA,EAAW,mBAAA,EAAoB;AAAA,IAC9D,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,gBAAA,EAAiB;AAAA,IACxD,EAAE,MAAA,EAAQ,wBAAA,EAA0B,SAAA,EAAW,wBAAA;AAAyB,GAC1E;AAEA,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,SAAA,EAAU,IAAK,YAAA,EAAc;AAChD,IAAA,eAAA;AAAA,MACE,QAAA,CAAS,KAAA;AAAA,MACT,MAAA;AAAA,MACA,SAAA;AAAA,MACA,sBAAA;AAAA,MACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,MACtB,MAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AACvC,MAAA,mBAAA,CAAoB,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,EAAQ,WAAW,CAAA;AAC5C,EAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,EAAG;AACpC,MAAA,eAAA;AAAA,QACE,SAAS,KAAA,CAAM,SAAA;AAAA,QACf,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OACE,GAAA,CAAI,WAAA,EAAa,UAAA,EAAY,cAAA,IAC7B,IAAI,WAAA,EAAa,SAAA;AAAA,UAErB,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OAAO,IAAI,WAAA,EAAa,SAAA;AAAA,UAC1B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,YAAA,EAAc,aAAa,WAAW,CAAA;AACvE,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG;AAC1B,MAAA,eAAA;AAAA,QACE,QAAA,CAAS,KAAA;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,KAAA,KAAe;AACd,UAAA,IAAI;AACF,YAAA,OAAO,MAAM,UAAA,EAAY,cAAA;AAAA,UAC3B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,QACtB,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AACvC,MAAA,mBAAA,CAAoB,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,iBAAiB,CAAA,GAAI,IAAA;AAC9B,EAAA,OAAO,QAAA;AACT;AAMO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAAoB,MAAA,EAAwC;AAAxC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAyC;AAAA,EAE7D,OAAO,QAAA,EAAqB;AAC1B,IAAA,kBAAA,CAAmB,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EAC1C;AACF","file":"mongoose.cjs","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/mongoose/index.ts"],"names":["SpanKind","runWithSpan","finalizeSpan","getActiveSpan","trace"],"mappings":"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","file":"mongoose.cjs","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
package/dist/mongoose.js CHANGED
@@ -13,7 +13,7 @@ var SEMATTRS_NET_PEER_PORT = "net.peer.port";
13
13
  var DEFAULT_TRACER_NAME = "autotel-plugins/mongoose";
14
14
  var DEFAULT_DB_SYSTEM = "mongoose";
15
15
  var INSTRUMENTED_FLAG = "__autotelMongooseInstrumented";
16
- var _STORED_PARENT_SPAN = Symbol("stored-parent-span");
16
+ var _STORED_PARENT_SPAN = /* @__PURE__ */ Symbol("stored-parent-span");
17
17
  function createSpan(tracer, operation, modelName, collectionName, config) {
18
18
  const spanName = collectionName ? `mongoose.${collectionName}.${operation}` : modelName ? `mongoose.${modelName}.${operation}` : `mongoose.${operation}`;
19
19
  const attributes = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/mongoose/index.ts"],"names":["trace"],"mappings":"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","file":"mongoose.js","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/mongoose/index.ts"],"names":["trace"],"mappings":"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","file":"mongoose.js","sourcesContent":["/**\n * OpenTelemetry semantic conventions for database operations.\n * These constants are shared across all plugins.\n */\n\n// Common database attributes\nexport const SEMATTRS_DB_SYSTEM = 'db.system' as const;\nexport const SEMATTRS_DB_OPERATION = 'db.operation' as const;\nexport const SEMATTRS_DB_STATEMENT = 'db.statement' as const;\nexport const SEMATTRS_DB_NAME = 'db.name' as const;\n\n// MongoDB-specific attributes\nexport const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;\n\n// Network attributes\nexport const SEMATTRS_NET_PEER_NAME = 'net.peer.name' as const;\nexport const SEMATTRS_NET_PEER_PORT = 'net.peer.port' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n\nimport { SpanKind, otelTrace as trace, type Span, type Tracer } from 'autotel';\nimport {\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_MONGODB_COLLECTION,\n SEMATTRS_DB_NAME,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/mongoose';\nconst DEFAULT_DB_SYSTEM = 'mongoose';\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n/**\n * Configuration options for Mongoose instrumentation.\n * Focused on Mongoose 8+ with promise-based API only.\n */\nexport interface MongooseInstrumentationConfig {\n /**\n * Database name to include in spans.\n */\n dbName?: string;\n\n /**\n * Remote hostname or IP address of the MongoDB server.\n */\n peerName?: string;\n\n /**\n * Remote port number of the MongoDB server (default: 27017).\n */\n peerPort?: number;\n\n /**\n * Custom tracer name (default: \"autotel-plugins/mongoose\").\n */\n tracerName?: string;\n\n /**\n * Whether to capture collection names in spans (default: true).\n */\n captureCollectionName?: boolean;\n\n /**\n * Whether to instrument Schema hooks (pre/post save, validate, etc).\n * Disabled by default because hooks interact with Mongoose plugins.\n * Enable only if you have user-defined hooks you want to trace.\n * (default: false)\n */\n instrumentHooks?: boolean;\n}\n\n/**\n * Creates a span for a Mongoose operation.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: Required<MongooseInstrumentationConfig>,\n): Span {\n const spanName = collectionName\n ? `mongoose.${collectionName}.${operation}`\n : modelName\n ? `mongoose.${modelName}.${operation}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [SEMATTRS_DB_SYSTEM]: DEFAULT_DB_SYSTEM,\n [SEMATTRS_DB_OPERATION]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[SEMATTRS_DB_MONGODB_COLLECTION] = collectionName;\n }\n\n if (config.dbName) {\n attributes[SEMATTRS_DB_NAME] = config.dbName;\n }\n\n if (config.peerName) {\n attributes[SEMATTRS_NET_PEER_NAME] = config.peerName;\n }\n\n if (config.peerPort) {\n attributes[SEMATTRS_NET_PEER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n/**\n * Wraps a method to trace Query/Aggregate execution with proper span lifecycle.\n * Returns the Query/Aggregate object with wrapped exec() to finalize span.\n */\nfunction wrapQueryMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result is a Query/Aggregate, wrap exec() and preserve it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n\n return Promise.resolve(execPromise)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query/Aggregate, not Promise\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps chainable Query methods (find, findOne, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods (starting with _) and known Mongoose internals.\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or __)\n if (funcName.startsWith('_')) {\n return true;\n }\n\n // Skip other known Mongoose internal hooks\n const mongooseInternalPatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n '$__',\n ];\n\n return mongooseInternalPatterns.some((pattern) => funcName.includes(pattern));\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: Required<MongooseInstrumentationConfig>,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n return function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(SEMATTRS_DB_MONGODB_COLLECTION, collectionName);\n }\n span.setAttribute(SEMATTRS_DB_SYSTEM, DEFAULT_DB_SYSTEM);\n if (config.dbName) {\n span.setAttribute(SEMATTRS_DB_NAME, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-plugins/mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: any,\n config?: MongooseInstrumentationConfig,\n): typeof mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n if (mongoose[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n const finalConfig: Required<MongooseInstrumentationConfig> = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Patch Schema hooks only if enabled\n if (mongoose.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(mongoose.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query methods\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n\n // Also patch chainable Query methods to capture context\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (mongoose.Model.prototype[method]) {\n wrapQueryMethod(\n mongoose.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (mongoose.Model[method]) {\n wrapQueryMethod(\n mongoose.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (mongoose.Query?.prototype?.[method]) {\n wrapChainableMethod(mongoose.Query.prototype, method);\n }\n }\n\n mongoose[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: MongooseInstrumentationConfig) {}\n\n enable(mongoose: any): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-plugins",
3
- "version": "0.6.6",
3
+ "version": "0.7.0",
4
4
  "description": "OpenTelemetry instrumentation for libraries without official support (Drizzle ORM)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -49,7 +49,7 @@
49
49
  "@opentelemetry/api": "^1.9.0",
50
50
  "@opentelemetry/instrumentation": "^0.208.0",
51
51
  "@opentelemetry/semantic-conventions": "^1.38.0",
52
- "autotel": "2.7.0"
52
+ "autotel": "2.8.0"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "drizzle-orm": ">=0.44.7",