autotel-drizzle 0.0.6 → 0.0.8

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/drizzle.cjs CHANGED
@@ -319,10 +319,6 @@ function instrumentDrizzleClient(db, config) {
319
319
  if (isObject(db._?.session)) {
320
320
  instrumented = instrumentSession(db._.session, state) || instrumented;
321
321
  }
322
- if (isObject(db.$client)) {
323
- instrumentDrizzle(db.$client, config);
324
- instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;
325
- }
326
322
  if (instrumented) {
327
323
  db[INSTRUMENTED_FLAG] = true;
328
324
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan"],"mappings":"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","file":"drizzle.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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n if (isObject(db.$client)) {\n instrumentDrizzle(db.$client, config);\n instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;\n }\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan"],"mappings":"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","file":"drizzle.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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n // Intentionally do NOT instrument db.$client here. The raw client (e.g.\n // pg.Pool) is the same object that drizzle's session invokes internally from\n // its prepared query's execute(). Wrapping both layers produces nested\n // duplicate spans for every query. Users who need to trace a standalone\n // client without a drizzle wrapper should call `instrumentDrizzle` directly.\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
package/dist/drizzle.js CHANGED
@@ -317,10 +317,6 @@ function instrumentDrizzleClient(db, config) {
317
317
  if (isObject(db._?.session)) {
318
318
  instrumented = instrumentSession(db._.session, state) || instrumented;
319
319
  }
320
- if (isObject(db.$client)) {
321
- instrumentDrizzle(db.$client, config);
322
- instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;
323
- }
324
320
  if (instrumented) {
325
321
  db[INSTRUMENTED_FLAG] = true;
326
322
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":[],"mappings":"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","file":"drizzle.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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n if (isObject(db.$client)) {\n instrumentDrizzle(db.$client, config);\n instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;\n }\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":[],"mappings":"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","file":"drizzle.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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n // Intentionally do NOT instrument db.$client here. The raw client (e.g.\n // pg.Pool) is the same object that drizzle's session invokes internally from\n // its prepared query's execute(). Wrapping both layers produces nested\n // duplicate spans for every query. Users who need to trace a standalone\n // client without a drizzle wrapper should call `instrumentDrizzle` directly.\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -333,10 +333,6 @@ function instrumentDrizzleClient(db, config) {
333
333
  if (isObject(db._?.session)) {
334
334
  instrumented = instrumentSession(db._.session, state) || instrumented;
335
335
  }
336
- if (isObject(db.$client)) {
337
- instrumentDrizzle(db.$client, config);
338
- instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;
339
- }
340
336
  if (instrumented) {
341
337
  db[INSTRUMENTED_FLAG] = true;
342
338
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan"],"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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n if (isObject(db.$client)) {\n instrumentDrizzle(db.$client, config);\n instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;\n }\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","SpanKind","runWithSpan","finalizeSpan"],"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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n // Intentionally do NOT instrument db.$client here. The raw client (e.g.\n // pg.Pool) is the same object that drizzle's session invokes internally from\n // its prepared query's execute(). Wrapping both layers produces nested\n // duplicate spans for every query. Users who need to trace a standalone\n // client without a drizzle wrapper should call `instrumentDrizzle` directly.\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
package/dist/index.js CHANGED
@@ -331,10 +331,6 @@ function instrumentDrizzleClient(db, config) {
331
331
  if (isObject(db._?.session)) {
332
332
  instrumented = instrumentSession(db._.session, state) || instrumented;
333
333
  }
334
- if (isObject(db.$client)) {
335
- instrumentDrizzle(db.$client, config);
336
- instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;
337
- }
338
334
  if (instrumented) {
339
335
  db[INSTRUMENTED_FLAG] = true;
340
336
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":[],"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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n if (isObject(db.$client)) {\n instrumentDrizzle(db.$client, config);\n instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;\n }\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
1
+ {"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":[],"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_SYSTEM_NAME = 'db.system.name' 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;\nexport const SEMATTRS_DB_NAMESPACE = 'db.namespace' as const;\nexport const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' 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\n// Messaging attributes (Kafka, etc.)\nexport const SEMATTRS_MESSAGING_SYSTEM = 'messaging.system' as const;\nexport const SEMATTRS_MESSAGING_DESTINATION_NAME =\n 'messaging.destination.name' as const;\nexport const SEMATTRS_MESSAGING_OPERATION = 'messaging.operation' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_CONSUMER_GROUP =\n 'messaging.kafka.consumer.group' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_PARTITION =\n 'messaging.kafka.partition' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_OFFSET =\n 'messaging.kafka.offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_MESSAGE_KEY =\n 'messaging.kafka.message.key' as const;\n\n// Batch lineage attributes\nexport const SEMATTRS_LINKED_TRACE_ID_COUNT = 'linked_trace_id_count' as const;\nexport const SEMATTRS_LINKED_TRACE_ID_HASH = 'linked_trace_id_hash' as const;\n\n// Correlation ID header name\nexport const CORRELATION_ID_HEADER = 'x-correlation-id' as const;\n\n// BigQuery-specific attributes (namespaced under gcp.bigquery per OTel spec)\nexport const SEMATTRS_GCP_BIGQUERY_JOB_ID = 'gcp.bigquery.job.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_JOB_LOCATION =\n 'gcp.bigquery.job.location' as const;\nexport const SEMATTRS_GCP_BIGQUERY_PROJECT_ID =\n 'gcp.bigquery.project.id' as const;\nexport const SEMATTRS_GCP_BIGQUERY_DESTINATION_TABLE =\n 'gcp.bigquery.destination.table' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SOURCE_TABLES =\n 'gcp.bigquery.source.tables' as const;\nexport const SEMATTRS_GCP_BIGQUERY_STATEMENT_TYPE =\n 'gcp.bigquery.statement_type' as const;\nexport const SEMATTRS_GCP_BIGQUERY_QUERY_HASH =\n 'gcp.bigquery.query.hash' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_AFFECTED =\n 'gcp.bigquery.rows.affected' as const;\nexport const SEMATTRS_GCP_BIGQUERY_ROWS_RETURNED =\n 'gcp.bigquery.rows.returned' as const;\nexport const SEMATTRS_GCP_BIGQUERY_SCHEMA_FIELDS =\n 'gcp.bigquery.schema.fields' as const;\n\n// RabbitMQ-specific attributes (aligned with OTel messaging semantic conventions)\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY =\n 'messaging.rabbitmq.destination.routing_key' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_DESTINATION_EXCHANGE =\n 'messaging.rabbitmq.destination.exchange' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_ACK_RESULT =\n 'messaging.rabbitmq.ack_result' as const;\nexport const SEMATTRS_MESSAGING_RABBITMQ_REQUEUE =\n 'messaging.rabbitmq.requeue' as const;\n\n// Messaging attributes (shared across messaging systems)\nexport const SEMATTRS_MESSAGING_MESSAGE_ID = 'messaging.message.id' as const;\nexport const SEMATTRS_MESSAGING_MESSAGE_CONVERSATION_ID =\n 'messaging.message.conversation_id' as const;\nexport const SEMATTRS_MESSAGING_CONSUMER_ID = 'messaging.consumer.id' as const;\nexport const SEMATTRS_MESSAGING_OPERATION_NAME =\n 'messaging.operation.name' as const;\n\n// Kafka batch consumer attributes\nexport const SEMATTRS_MESSAGING_BATCH_MESSAGE_COUNT =\n 'messaging.batch.message_count' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_FIRST_OFFSET =\n 'messaging.kafka.batch.first_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_LAST_OFFSET =\n 'messaging.kafka.batch.last_offset' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_PROCESSED =\n 'messaging.kafka.batch.messages_processed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_MESSAGES_FAILED =\n 'messaging.kafka.batch.messages_failed' as const;\nexport const SEMATTRS_MESSAGING_KAFKA_BATCH_PROCESSING_TIME_MS =\n 'messaging.kafka.batch.processing_time_ms' as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_SYSTEM,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_PORT,\n} from '../common/constants';\nimport { finalizeSpan, runWithSpan } from 'autotel/trace-helpers';\n\nconst DEFAULT_TRACER_NAME = 'autotel-plugins/drizzle';\nconst DEFAULT_DB_SYSTEM = 'postgresql';\nconst INSTRUMENTED_FLAG = '__autotelDrizzleInstrumented' as const;\nconst PREPARED_QUERY_METHODS = [\n 'all',\n 'execute',\n 'get',\n 'run',\n 'values',\n] as const;\n\ntype QueryCallback = (error: unknown, result: unknown) => void;\ntype QueryFunction = (...args: any[]) => any;\ntype AttributeValue = string | number | boolean;\ntype AttributeMap = Record<string, AttributeValue>;\n\ninterface InstrumentableObject {\n [key: string]: any;\n [INSTRUMENTED_FLAG]?: true;\n}\n\ninterface DrizzleClientLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n}\n\ninterface DrizzleSessionLike extends InstrumentableObject {\n query?: QueryFunction;\n execute?: QueryFunction;\n prepareQuery?: QueryFunction;\n transaction?: QueryFunction;\n}\n\ninterface DrizzleDbLike extends InstrumentableObject {\n $client?: DrizzleClientLike;\n session?: DrizzleSessionLike;\n _?: {\n session?: DrizzleSessionLike;\n [key: string]: any;\n };\n}\n\nexport interface InstrumentDrizzleConfig {\n tracerName?: string;\n dbSystem?: string;\n dbName?: string;\n captureQueryText?: boolean;\n maxQueryTextLength?: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface ResolvedConfig {\n tracerName: string;\n dbSystem: string;\n dbName?: string;\n captureQueryText: boolean;\n maxQueryTextLength: number;\n peerName?: string;\n peerPort?: number;\n}\n\ninterface InstrumentationState {\n tracer: ReturnType<typeof trace.getTracer>;\n config: ResolvedConfig;\n}\n\ninterface MethodInstrumentationOptions {\n flagSuffix: string;\n queryText: (args: any[]) => string | undefined;\n callbackStyle?: 'last-arg';\n extraAttributes?: AttributeMap;\n}\n\nfunction resolveConfig(config?: InstrumentDrizzleConfig): ResolvedConfig {\n return {\n tracerName: config?.tracerName ?? DEFAULT_TRACER_NAME,\n dbSystem: config?.dbSystem ?? DEFAULT_DB_SYSTEM,\n dbName: config?.dbName,\n captureQueryText: config?.captureQueryText ?? true,\n maxQueryTextLength: config?.maxQueryTextLength ?? 1000,\n peerName: config?.peerName,\n peerPort: config?.peerPort,\n };\n}\n\nfunction getState(config?: InstrumentDrizzleConfig): InstrumentationState {\n const resolved = resolveConfig(config);\n return {\n config: resolved,\n tracer: trace.getTracer(resolved.tracerName),\n };\n}\n\nfunction getFlagKey(suffix: string): string {\n return `${INSTRUMENTED_FLAG}:${suffix}`;\n}\n\nfunction isObject(value: unknown): value is InstrumentableObject {\n return value !== null && typeof value === 'object';\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n}\n\nfunction extractQueryText(queryArg: unknown): string | undefined {\n if (typeof queryArg === 'string') {\n return queryArg;\n }\n\n if (!isObject(queryArg)) {\n return undefined;\n }\n\n if (typeof queryArg.sql === 'string') {\n return queryArg.sql;\n }\n\n if (typeof queryArg.text === 'string') {\n return queryArg.text;\n }\n\n if (typeof queryArg.queryString === 'string') {\n return queryArg.queryString;\n }\n\n if (\n isObject(queryArg.queryChunks) &&\n typeof (queryArg as Record<string, unknown>).sql === 'string'\n ) {\n return queryArg.sql as string;\n }\n\n return undefined;\n}\n\nfunction sanitizeQueryText(queryText: string, maxLength: number): string {\n if (queryText.length <= maxLength) {\n return queryText;\n }\n\n return `${queryText.slice(0, Math.max(0, maxLength))}...`;\n}\n\nfunction extractOperation(queryText: string): string | undefined {\n const trimmed = queryText.trimStart();\n const match = /^(?<operation>\\w+)/u.exec(trimmed);\n return match?.groups?.operation?.toUpperCase();\n}\n\nfunction buildSpan(\n state: InstrumentationState,\n queryText: string | undefined,\n extraAttributes?: AttributeMap,\n) {\n const operation = queryText ? extractOperation(queryText) : undefined;\n const spanName = operation\n ? `drizzle.${operation.toLowerCase()}`\n : 'drizzle.query';\n const span = state.tracer.startSpan(spanName, { kind: SpanKind.CLIENT });\n\n span.setAttribute(SEMATTRS_DB_SYSTEM, state.config.dbSystem);\n\n if (operation) {\n span.setAttribute(SEMATTRS_DB_OPERATION, operation);\n }\n\n if (state.config.dbName !== undefined) {\n span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);\n }\n\n if (state.config.captureQueryText && queryText !== undefined) {\n span.setAttribute(\n SEMATTRS_DB_STATEMENT,\n sanitizeQueryText(queryText, state.config.maxQueryTextLength),\n );\n }\n\n if (state.config.peerName !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_NAME, state.config.peerName);\n }\n\n if (state.config.peerPort !== undefined) {\n span.setAttribute(SEMATTRS_NET_PEER_PORT, state.config.peerPort);\n }\n\n if (extraAttributes) {\n for (const [key, value] of Object.entries(extraAttributes)) {\n span.setAttribute(key, value);\n }\n }\n\n return span;\n}\n\nfunction executeWithSpan<T>(span: any, fn: () => T): T {\n return runWithSpan(span, () => {\n try {\n const result = fn();\n\n if (isPromiseLike(result)) {\n return result.then(\n (value) => {\n finalizeSpan(span);\n return value;\n },\n (error) => {\n finalizeSpan(span, error);\n throw error;\n },\n ) as T;\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(span, error);\n throw error;\n }\n });\n}\n\nfunction instrumentMethod(\n target: InstrumentableObject,\n methodName: string,\n state: InstrumentationState,\n options: MethodInstrumentationOptions,\n): boolean {\n if (typeof target[methodName] !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey(options.flagSuffix);\n if (target[flagKey]) {\n return false;\n }\n\n const originalMethod = target[methodName] as QueryFunction;\n\n target[methodName] = function instrumentedMethod(\n this: any,\n ...incomingArgs: any[]\n ) {\n const args = [...incomingArgs];\n const callback =\n options.callbackStyle === 'last-arg' && typeof args.at(-1) === 'function'\n ? (args.pop() as QueryCallback)\n : undefined;\n const span = buildSpan(\n state,\n options.queryText(args),\n options.extraAttributes,\n );\n\n if (callback) {\n return runWithSpan(span, () => {\n const wrappedCallback: QueryCallback = (error, result) => {\n finalizeSpan(span, error);\n callback(error, result);\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 return executeWithSpan(span, () =>\n Reflect.apply(originalMethod, this, args),\n );\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentPreparedQuery(\n prepared: unknown,\n state: InstrumentationState,\n querySource: unknown,\n extraAttributes?: AttributeMap,\n): boolean {\n if (!isObject(prepared)) {\n return false;\n }\n\n let instrumented = false;\n const queryText = extractQueryText(querySource);\n\n for (const methodName of PREPARED_QUERY_METHODS) {\n instrumented =\n instrumentMethod(prepared, methodName, state, {\n flagSuffix: `prepared:${methodName}`,\n queryText: () => queryText,\n extraAttributes,\n }) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentPrepareQuery(\n target: DrizzleSessionLike,\n state: InstrumentationState,\n extraAttributes?: AttributeMap,\n): boolean {\n if (typeof target.prepareQuery !== 'function') {\n return false;\n }\n\n const flagKey = getFlagKey('prepareQuery');\n if (target[flagKey]) {\n return false;\n }\n\n const originalPrepareQuery = target.prepareQuery;\n\n target.prepareQuery = function instrumentedPrepareQuery(\n this: any,\n ...prepareArgs: any[]\n ) {\n const prepared = Reflect.apply(originalPrepareQuery, this, prepareArgs);\n instrumentPreparedQuery(prepared, state, prepareArgs[0], extraAttributes);\n return prepared;\n };\n\n target[flagKey] = true;\n return true;\n}\n\nfunction instrumentTransactionTarget(\n target: unknown,\n state: InstrumentationState,\n): boolean {\n if (!isObject(target)) {\n return false;\n }\n\n const transactionAttributes = { 'db.transaction': true };\n let instrumented = false;\n\n instrumented =\n instrumentMethod(target, 'query', state, {\n flagSuffix: 'transaction:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentMethod(target, 'execute', state, {\n flagSuffix: 'transaction:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n extraAttributes: transactionAttributes,\n }) || instrumented;\n\n instrumented =\n instrumentPrepareQuery(\n target as DrizzleSessionLike,\n state,\n transactionAttributes,\n ) || instrumented;\n\n if (isObject(target.session)) {\n instrumented =\n instrumentTransactionTarget(target.session, state) || instrumented;\n }\n\n if (isObject(target._?.session)) {\n instrumented =\n instrumentTransactionTarget(target._.session, state) || instrumented;\n }\n\n return instrumented;\n}\n\nfunction instrumentSession(\n session: DrizzleSessionLike,\n state: InstrumentationState,\n): boolean {\n let instrumented = false;\n\n instrumented =\n instrumentMethod(session, 'query', state, {\n flagSuffix: 'session:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(session, 'execute', state, {\n flagSuffix: 'session:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented = instrumentPrepareQuery(session, state) || instrumented;\n\n if (typeof session.transaction === 'function') {\n const flagKey = getFlagKey('session:transaction');\n\n if (!session[flagKey]) {\n const originalTransaction = session.transaction;\n\n session.transaction = function instrumentedTransaction(\n this: any,\n callback: QueryFunction,\n ...restArgs: any[]\n ) {\n if (typeof callback !== 'function') {\n return Reflect.apply(originalTransaction, this, [\n callback,\n ...restArgs,\n ]);\n }\n\n const wrappedCallback = (tx: unknown, ...callbackArgs: any[]) => {\n instrumentTransactionTarget(tx, state);\n return Reflect.apply(callback, this, [tx, ...callbackArgs]);\n };\n\n return Reflect.apply(originalTransaction, this, [\n wrappedCallback,\n ...restArgs,\n ]);\n };\n\n session[flagKey] = true;\n instrumented = true;\n }\n }\n\n if (instrumented) {\n session[INSTRUMENTED_FLAG] = true;\n }\n\n return instrumented;\n}\n\nexport function instrumentDrizzle<TClient extends DrizzleClientLike>(\n client: TClient,\n config?: InstrumentDrizzleConfig,\n): TClient {\n if (!client || !isObject(client)) {\n return client;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentMethod(client, 'query', state, {\n flagSuffix: 'client:query',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n instrumented =\n instrumentMethod(client, 'execute', state, {\n flagSuffix: 'client:execute',\n queryText: (args) => extractQueryText(args[0]),\n callbackStyle: 'last-arg',\n }) || instrumented;\n\n if (instrumented) {\n client[INSTRUMENTED_FLAG] = true;\n }\n\n return client;\n}\n\nexport function instrumentDrizzleClient<TDb extends DrizzleDbLike>(\n db: TDb,\n config?: InstrumentDrizzleConfig,\n): TDb {\n if (!db || !isObject(db)) {\n return db;\n }\n\n if (db[INSTRUMENTED_FLAG]) {\n return db;\n }\n\n const state = getState(config);\n let instrumented = false;\n\n instrumented =\n instrumentSession(db as unknown as DrizzleSessionLike, state) ||\n instrumented;\n\n if (isObject(db.session)) {\n instrumented = instrumentSession(db.session, state) || instrumented;\n }\n\n if (isObject(db._?.session)) {\n instrumented = instrumentSession(db._.session, state) || instrumented;\n }\n\n // Intentionally do NOT instrument db.$client here. The raw client (e.g.\n // pg.Pool) is the same object that drizzle's session invokes internally from\n // its prepared query's execute(). Wrapping both layers produces nested\n // duplicate spans for every query. Users who need to trace a standalone\n // client without a drizzle wrapper should call `instrumentDrizzle` directly.\n\n if (instrumented) {\n db[INSTRUMENTED_FLAG] = true;\n }\n\n return db;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-drizzle",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "OpenTelemetry instrumentation for Drizzle ORM",
5
5
  "type": "module",
6
6
  "main": "./dist/drizzle.js",
@@ -36,7 +36,7 @@
36
36
  "@opentelemetry/api": "^1.9.1",
37
37
  "@opentelemetry/instrumentation": "^0.214.0",
38
38
  "@opentelemetry/semantic-conventions": "^1.40.0",
39
- "autotel": "2.26.1"
39
+ "autotel": "2.26.2"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "drizzle-orm": ">=0.45.2"
@@ -248,24 +248,58 @@ describe('instrumentDrizzleClient', () => {
248
248
  expect(getSpan(1).attributes['db.operation']).toBe('SELECT');
249
249
  });
250
250
 
251
- it('instruments multiple surfaces on the same db instance', async () => {
251
+ it('instruments the session but leaves $client untouched', async () => {
252
+ const originalClientQuery = vi.fn(async () => ({ rows: ['client'] }));
252
253
  const db = {
253
254
  session: {
254
255
  execute: vi.fn(async () => ({ rows: ['session'] })),
255
256
  },
256
257
  $client: {
257
- query: vi.fn(async () => ({ rows: ['client'] })),
258
+ query: originalClientQuery,
258
259
  },
259
260
  };
260
261
 
261
262
  instrumentDrizzleClient(db);
262
263
 
263
264
  await db.session.execute('INSERT INTO users VALUES (1)');
265
+ expect(spans).toHaveLength(1);
266
+ expect(getSpan(0).name).toBe('drizzle.insert');
267
+
268
+ // $client.query must remain the original reference. Instrumenting it here
269
+ // would produce duplicate spans because drizzle's session internally calls
270
+ // $client.query from within its own already-traced execute path.
271
+ expect(db.$client.query).toBe(originalClientQuery);
272
+
264
273
  await db.$client.query('SELECT 1');
274
+ expect(spans).toHaveLength(1);
275
+ });
265
276
 
266
- expect(spans).toHaveLength(2);
267
- expect(getSpan(0).name).toBe('drizzle.insert');
268
- expect(getSpan(1).name).toBe('drizzle.select');
277
+ it('produces one span when drizzle session.prepareQuery routes through the shared $client', async () => {
278
+ // Simulates the real drizzle-orm/node-postgres flow where
279
+ // prepared.execute() internally dispatches to db.$client.query().
280
+ const client = {
281
+ query: vi.fn(async () => ({ rows: [{ id: 1 }] })),
282
+ };
283
+ const db = {
284
+ $client: client,
285
+ session: {
286
+ prepareQuery: vi.fn((query: { sql: string }) => ({
287
+ execute: vi.fn(async () => client.query(query.sql)),
288
+ })),
289
+ },
290
+ };
291
+
292
+ instrumentDrizzleClient(db);
293
+
294
+ const prepared = db.session.prepareQuery({ sql: 'SELECT 1' });
295
+ await prepared.execute();
296
+
297
+ // Exactly one autotel span should be created — the one from
298
+ // instrumented prepared.execute. The inner $client.query call must
299
+ // NOT create its own span.
300
+ expect(spans).toHaveLength(1);
301
+ expect(getSpan(0).name).toBe('drizzle.select');
302
+ expect(client.query).toHaveBeenCalledTimes(1);
269
303
  });
270
304
 
271
305
  it('instruments transaction execute and nested transaction session queries', async () => {
@@ -317,22 +351,23 @@ describe('instrumentDrizzleClient', () => {
317
351
  });
318
352
 
319
353
  it('is idempotent when called repeatedly', () => {
354
+ const originalClientExecute = vi.fn(async () => ({ rows: [] }));
320
355
  const db = {
321
356
  session: {
322
357
  query: vi.fn(async () => ({ rows: [] })),
323
358
  },
324
359
  $client: {
325
- execute: vi.fn(async () => ({ rows: [] })),
360
+ execute: originalClientExecute,
326
361
  },
327
362
  };
328
363
 
329
364
  instrumentDrizzleClient(db);
330
365
  const firstSessionQuery = db.session.query;
331
- const firstClientExecute = db.$client.execute;
332
366
 
333
367
  instrumentDrizzleClient(db);
334
368
 
335
369
  expect(db.session.query).toBe(firstSessionQuery);
336
- expect(db.$client.execute).toBe(firstClientExecute);
370
+ // $client.execute is intentionally not wrapped by instrumentDrizzleClient.
371
+ expect(db.$client.execute).toBe(originalClientExecute);
337
372
  });
338
373
  });
@@ -520,10 +520,11 @@ export function instrumentDrizzleClient<TDb extends DrizzleDbLike>(
520
520
  instrumented = instrumentSession(db._.session, state) || instrumented;
521
521
  }
522
522
 
523
- if (isObject(db.$client)) {
524
- instrumentDrizzle(db.$client, config);
525
- instrumented = Boolean(db.$client[INSTRUMENTED_FLAG]) || instrumented;
526
- }
523
+ // Intentionally do NOT instrument db.$client here. The raw client (e.g.
524
+ // pg.Pool) is the same object that drizzle's session invokes internally from
525
+ // its prepared query's execute(). Wrapping both layers produces nested
526
+ // duplicate spans for every query. Users who need to trace a standalone
527
+ // client without a drizzle wrapper should call `instrumentDrizzle` directly.
527
528
 
528
529
  if (instrumented) {
529
530
  db[INSTRUMENTED_FLAG] = true;