autotel-drizzle 0.0.9 → 0.0.11
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 +8 -0
- package/dist/drizzle.cjs.map +1 -1
- package/dist/drizzle.js +8 -0
- package/dist/drizzle.js.map +1 -1
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/common/constants.ts +8 -0
- package/src/drizzle/index.test.ts +41 -0
- package/src/drizzle/index.ts +18 -0
package/dist/drizzle.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var crypto = require('crypto');
|
|
3
4
|
var api = require('@opentelemetry/api');
|
|
4
5
|
var traceHelpers = require('autotel/trace-helpers');
|
|
5
6
|
|
|
@@ -10,6 +11,7 @@ var SEMATTRS_DB_SYSTEM = "db.system";
|
|
|
10
11
|
var SEMATTRS_DB_OPERATION = "db.operation";
|
|
11
12
|
var SEMATTRS_DB_STATEMENT = "db.statement";
|
|
12
13
|
var SEMATTRS_DB_NAME = "db.name";
|
|
14
|
+
var SEMATTRS_DB_STATEMENT_HASH = "db.statement.hash";
|
|
13
15
|
var SEMATTRS_NET_PEER_NAME = "net.peer.name";
|
|
14
16
|
var SEMATTRS_NET_PEER_PORT = "net.peer.port";
|
|
15
17
|
var DEFAULT_TRACER_NAME = "autotel-plugins/drizzle";
|
|
@@ -76,6 +78,9 @@ function sanitizeQueryText(queryText, maxLength) {
|
|
|
76
78
|
}
|
|
77
79
|
return `${queryText.slice(0, Math.max(0, maxLength))}...`;
|
|
78
80
|
}
|
|
81
|
+
function hashQueryText(queryText) {
|
|
82
|
+
return crypto.createHash("sha1").update(queryText).digest("hex").slice(0, 16);
|
|
83
|
+
}
|
|
79
84
|
function extractOperation(queryText) {
|
|
80
85
|
const trimmed = queryText.trimStart();
|
|
81
86
|
const match = /^(?<operation>\w+)/u.exec(trimmed);
|
|
@@ -92,6 +97,9 @@ function buildSpan(state, queryText, extraAttributes) {
|
|
|
92
97
|
if (state.config.dbName !== void 0) {
|
|
93
98
|
span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);
|
|
94
99
|
}
|
|
100
|
+
if (queryText !== void 0) {
|
|
101
|
+
span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));
|
|
102
|
+
}
|
|
95
103
|
if (state.config.captureQueryText && queryText !== void 0) {
|
|
96
104
|
span.setAttribute(
|
|
97
105
|
SEMATTRS_DB_STATEMENT,
|
package/dist/drizzle.cjs.map
CHANGED
|
@@ -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 // 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","createHash","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 * sha1 hex of the (parameterised, sanitized) statement text. Use to group\n * identical queries in observability tools — the raw `db.statement` is\n * usually unique per call due to inline params or comments, so high-\n * cardinality grouping by it is unhelpful. Example use: aggregate the top\n * 20 queries by total duration by `db.statement.hash`.\n */\nexport const SEMATTRS_DB_STATEMENT_HASH = 'db.statement.hash' 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 { createHash } from 'node:crypto';\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_STATEMENT_HASH,\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\n/**\n * Stable sha1 of a parameterised SQL statement, used as `db.statement.hash`.\n * Hashes the full original text (not the truncated form) so the hash is\n * identical for queries that only differ in trailing length. We keep this\n * cheap (sha1, hex, take 16 chars) — the goal is grouping, not crypto.\n */\nfunction hashQueryText(queryText: string): string {\n return createHash('sha1').update(queryText).digest('hex').slice(0, 16);\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 (queryText !== undefined) {\n // The hash always lives on the span — even when captureQueryText is off\n // (e.g. for privacy / size reasons) — so query grouping still works.\n span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));\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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
1
2
|
import { trace, SpanKind } from '@opentelemetry/api';
|
|
2
3
|
import { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';
|
|
3
4
|
|
|
@@ -8,6 +9,7 @@ var SEMATTRS_DB_SYSTEM = "db.system";
|
|
|
8
9
|
var SEMATTRS_DB_OPERATION = "db.operation";
|
|
9
10
|
var SEMATTRS_DB_STATEMENT = "db.statement";
|
|
10
11
|
var SEMATTRS_DB_NAME = "db.name";
|
|
12
|
+
var SEMATTRS_DB_STATEMENT_HASH = "db.statement.hash";
|
|
11
13
|
var SEMATTRS_NET_PEER_NAME = "net.peer.name";
|
|
12
14
|
var SEMATTRS_NET_PEER_PORT = "net.peer.port";
|
|
13
15
|
var DEFAULT_TRACER_NAME = "autotel-plugins/drizzle";
|
|
@@ -74,6 +76,9 @@ function sanitizeQueryText(queryText, maxLength) {
|
|
|
74
76
|
}
|
|
75
77
|
return `${queryText.slice(0, Math.max(0, maxLength))}...`;
|
|
76
78
|
}
|
|
79
|
+
function hashQueryText(queryText) {
|
|
80
|
+
return createHash("sha1").update(queryText).digest("hex").slice(0, 16);
|
|
81
|
+
}
|
|
77
82
|
function extractOperation(queryText) {
|
|
78
83
|
const trimmed = queryText.trimStart();
|
|
79
84
|
const match = /^(?<operation>\w+)/u.exec(trimmed);
|
|
@@ -90,6 +95,9 @@ function buildSpan(state, queryText, extraAttributes) {
|
|
|
90
95
|
if (state.config.dbName !== void 0) {
|
|
91
96
|
span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);
|
|
92
97
|
}
|
|
98
|
+
if (queryText !== void 0) {
|
|
99
|
+
span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));
|
|
100
|
+
}
|
|
93
101
|
if (state.config.captureQueryText && queryText !== void 0) {
|
|
94
102
|
span.setAttribute(
|
|
95
103
|
SEMATTRS_DB_STATEMENT,
|
package/dist/drizzle.js.map
CHANGED
|
@@ -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 // 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"]}
|
|
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 * sha1 hex of the (parameterised, sanitized) statement text. Use to group\n * identical queries in observability tools — the raw `db.statement` is\n * usually unique per call due to inline params or comments, so high-\n * cardinality grouping by it is unhelpful. Example use: aggregate the top\n * 20 queries by total duration by `db.statement.hash`.\n */\nexport const SEMATTRS_DB_STATEMENT_HASH = 'db.statement.hash' 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 { createHash } from 'node:crypto';\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_STATEMENT_HASH,\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\n/**\n * Stable sha1 of a parameterised SQL statement, used as `db.statement.hash`.\n * Hashes the full original text (not the truncated form) so the hash is\n * identical for queries that only differ in trailing length. We keep this\n * cheap (sha1, hex, take 16 chars) — the goal is grouping, not crypto.\n */\nfunction hashQueryText(queryText: string): string {\n return createHash('sha1').update(queryText).digest('hex').slice(0, 16);\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 (queryText !== undefined) {\n // The hash always lives on the span — even when captureQueryText is off\n // (e.g. for privacy / size reasons) — so query grouping still works.\n span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));\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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var crypto = require('crypto');
|
|
3
4
|
var api = require('@opentelemetry/api');
|
|
4
5
|
var traceHelpers = require('autotel/trace-helpers');
|
|
5
6
|
|
|
@@ -14,6 +15,7 @@ var SEMATTRS_DB_COLLECTION_NAME = "db.collection.name";
|
|
|
14
15
|
var SEMATTRS_DB_OPERATION_NAME = "db.operation.name";
|
|
15
16
|
var SEMATTRS_DB_QUERY_TEXT = "db.query.text";
|
|
16
17
|
var SEMATTRS_DB_QUERY_SUMMARY = "db.query.summary";
|
|
18
|
+
var SEMATTRS_DB_STATEMENT_HASH = "db.statement.hash";
|
|
17
19
|
var SEMATTRS_NET_PEER_NAME = "net.peer.name";
|
|
18
20
|
var SEMATTRS_NET_PEER_PORT = "net.peer.port";
|
|
19
21
|
var SEMATTRS_GCP_BIGQUERY_JOB_ID = "gcp.bigquery.job.id";
|
|
@@ -90,6 +92,9 @@ function sanitizeQueryText(queryText, maxLength) {
|
|
|
90
92
|
}
|
|
91
93
|
return `${queryText.slice(0, Math.max(0, maxLength))}...`;
|
|
92
94
|
}
|
|
95
|
+
function hashQueryText(queryText) {
|
|
96
|
+
return crypto.createHash("sha1").update(queryText).digest("hex").slice(0, 16);
|
|
97
|
+
}
|
|
93
98
|
function extractOperation(queryText) {
|
|
94
99
|
const trimmed = queryText.trimStart();
|
|
95
100
|
const match = /^(?<operation>\w+)/u.exec(trimmed);
|
|
@@ -106,6 +111,9 @@ function buildSpan(state, queryText, extraAttributes) {
|
|
|
106
111
|
if (state.config.dbName !== void 0) {
|
|
107
112
|
span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);
|
|
108
113
|
}
|
|
114
|
+
if (queryText !== void 0) {
|
|
115
|
+
span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));
|
|
116
|
+
}
|
|
109
117
|
if (state.config.captureQueryText && queryText !== void 0) {
|
|
110
118
|
span.setAttribute(
|
|
111
119
|
SEMATTRS_DB_STATEMENT,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 // 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":["trace","createHash","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 * sha1 hex of the (parameterised, sanitized) statement text. Use to group\n * identical queries in observability tools — the raw `db.statement` is\n * usually unique per call due to inline params or comments, so high-\n * cardinality grouping by it is unhelpful. Example use: aggregate the top\n * 20 queries by total duration by `db.statement.hash`.\n */\nexport const SEMATTRS_DB_STATEMENT_HASH = 'db.statement.hash' 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 { createHash } from 'node:crypto';\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_STATEMENT_HASH,\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\n/**\n * Stable sha1 of a parameterised SQL statement, used as `db.statement.hash`.\n * Hashes the full original text (not the truncated form) so the hash is\n * identical for queries that only differ in trailing length. We keep this\n * cheap (sha1, hex, take 16 chars) — the goal is grouping, not crypto.\n */\nfunction hashQueryText(queryText: string): string {\n return createHash('sha1').update(queryText).digest('hex').slice(0, 16);\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 (queryText !== undefined) {\n // The hash always lives on the span — even when captureQueryText is off\n // (e.g. for privacy / size reasons) — so query grouping still works.\n span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));\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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
1
2
|
import { trace, SpanKind } from '@opentelemetry/api';
|
|
2
3
|
import { runWithSpan, finalizeSpan } from 'autotel/trace-helpers';
|
|
3
4
|
|
|
@@ -12,6 +13,7 @@ var SEMATTRS_DB_COLLECTION_NAME = "db.collection.name";
|
|
|
12
13
|
var SEMATTRS_DB_OPERATION_NAME = "db.operation.name";
|
|
13
14
|
var SEMATTRS_DB_QUERY_TEXT = "db.query.text";
|
|
14
15
|
var SEMATTRS_DB_QUERY_SUMMARY = "db.query.summary";
|
|
16
|
+
var SEMATTRS_DB_STATEMENT_HASH = "db.statement.hash";
|
|
15
17
|
var SEMATTRS_NET_PEER_NAME = "net.peer.name";
|
|
16
18
|
var SEMATTRS_NET_PEER_PORT = "net.peer.port";
|
|
17
19
|
var SEMATTRS_GCP_BIGQUERY_JOB_ID = "gcp.bigquery.job.id";
|
|
@@ -88,6 +90,9 @@ function sanitizeQueryText(queryText, maxLength) {
|
|
|
88
90
|
}
|
|
89
91
|
return `${queryText.slice(0, Math.max(0, maxLength))}...`;
|
|
90
92
|
}
|
|
93
|
+
function hashQueryText(queryText) {
|
|
94
|
+
return createHash("sha1").update(queryText).digest("hex").slice(0, 16);
|
|
95
|
+
}
|
|
91
96
|
function extractOperation(queryText) {
|
|
92
97
|
const trimmed = queryText.trimStart();
|
|
93
98
|
const match = /^(?<operation>\w+)/u.exec(trimmed);
|
|
@@ -104,6 +109,9 @@ function buildSpan(state, queryText, extraAttributes) {
|
|
|
104
109
|
if (state.config.dbName !== void 0) {
|
|
105
110
|
span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);
|
|
106
111
|
}
|
|
112
|
+
if (queryText !== void 0) {
|
|
113
|
+
span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));
|
|
114
|
+
}
|
|
107
115
|
if (state.config.captureQueryText && queryText !== void 0) {
|
|
108
116
|
span.setAttribute(
|
|
109
117
|
SEMATTRS_DB_STATEMENT,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/constants.ts","../src/drizzle/index.ts"],"names":[],"mappings":";;;;AAMO,IAAM,kBAAA,GAAqB;AAC3B,IAAM,uBAAA,GAA0B;AAChC,IAAM,qBAAA,GAAwB;AAC9B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,gBAAA,GAAmB;AACzB,IAAM,qBAAA,GAAwB;AAC9B,IAAM,2BAAA,GAA8B;AACpC,IAAM,0BAAA,GAA6B;AACnC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,yBAAA,GAA4B;AAMlC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,sBAAA,GAAyB;AAwB/B,IAAM,4BAAA,GAA+B;AACrC,IAAM,kCAAA,GACX;AACK,IAAM,gCAAA,GACX;AACK,IAAM,uCAAA,GACX;AACK,IAAM,mCAAA,GACX;AACK,IAAM,oCAAA,GACX;AACK,IAAM,gCAAA,GACX;AACK,IAAM,mCAAA,GACX;AACK,IAAM,mCAAA,GACX;AACK,IAAM,mCAAA,GACX;ACpDF,IAAM,mBAAA,GAAsB,yBAAA;AAC5B,IAAM,iBAAA,GAAoB,YAAA;AAC1B,IAAM,iBAAA,GAAoB,8BAAA;AAC1B,IAAM,sBAAA,GAAyB;AAAA,EAC7B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAiEA,SAAS,cAAc,MAAA,EAAkD;AACvE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,QAAQ,UAAA,IAAc,mBAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,iBAAA;AAAA,IAC9B,QAAQ,MAAA,EAAQ,MAAA;AAAA,IAChB,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,IAAA;AAAA,IAC9C,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,GAAA;AAAA,IAClD,UAAU,MAAA,EAAQ,QAAA;AAAA,IAClB,UAAU,MAAA,EAAQ;AAAA,GACpB;AACF;AAEA,SAAS,SAAS,MAAA,EAAwD;AACxE,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,UAAU;AAAA,GAC7C;AACF;AAEA,SAAS,WAAW,MAAA,EAAwB;AAC1C,EAAA,OAAO,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACvC;AAEA,SAAS,SAAS,KAAA,EAA+C;AAC/D,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA;AAC5C;AAEA,SAAS,cAAiB,KAAA,EAAoD;AAC5E,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,UAAU,IAAA,IACV,OAAQ,MAAyB,IAAA,KAAS,UAAA;AAE9C;AAEA,SAAS,iBAAiB,QAAA,EAAuC;AAC/D,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,QAAA,CAAS,GAAA,KAAQ,QAAA,EAAU;AACpC,IAAA,OAAO,QAAA,CAAS,GAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAO,QAAA,CAAS,WAAA,KAAgB,QAAA,EAAU;AAC5C,IAAA,OAAO,QAAA,CAAS,WAAA;AAAA,EAClB;AAEA,EAAA,IACE,SAAS,QAAA,CAAS,WAAW,KAC7B,OAAQ,QAAA,CAAqC,QAAQ,QAAA,EACrD;AACA,IAAA,OAAO,QAAA,CAAS,GAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,WAAmB,SAAA,EAA2B;AACvE,EAAA,IAAI,SAAA,CAAU,UAAU,SAAA,EAAW;AACjC,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA,GAAA,CAAA;AACtD;AAEA,SAAS,iBAAiB,SAAA,EAAuC;AAC/D,EAAA,MAAM,OAAA,GAAU,UAAU,SAAA,EAAU;AACpC,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAChD,EAAA,OAAO,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAY;AAC/C;AAEA,SAAS,SAAA,CACP,KAAA,EACA,SAAA,EACA,eAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA;AAC5D,EAAA,MAAM,WAAW,SAAA,GACb,CAAA,QAAA,EAAW,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,GAClC,eAAA;AACJ,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,SAAA,CAAU,UAAU,EAAE,IAAA,EAAM,QAAA,CAAS,MAAA,EAAQ,CAAA;AAEvE,EAAA,IAAA,CAAK,YAAA,CAAa,kBAAA,EAAoB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAE3D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,YAAA,CAAa,uBAAuB,SAAS,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW;AACrC,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,EAAkB,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,gBAAA,IAAoB,SAAA,KAAc,MAAA,EAAW;AAC5D,IAAA,IAAA,CAAK,YAAA;AAAA,MACH,qBAAA;AAAA,MACA,iBAAA,CAAkB,SAAA,EAAW,KAAA,CAAM,MAAA,CAAO,kBAAkB;AAAA,KAC9D;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAA,EAAwB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAA,EAAwB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAA,CAAmB,MAAW,EAAA,EAAgB;AACrD,EAAA,OAAO,WAAA,CAAY,MAAM,MAAM;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,EAAA,EAAG;AAElB,MAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,UACZ,CAAC,KAAA,KAAU;AACT,YAAA,YAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,UACA,CAAC,KAAA,KAAU;AACT,YAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,UAAA,EACA,KAAA,EACA,OAAA,EACS;AACT,EAAA,IAAI,OAAO,MAAA,CAAO,UAAU,CAAA,KAAM,UAAA,EAAY;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,UAAU,CAAA;AAExC,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,kBAAA,CAAA,GAEzB,YAAA,EACH;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,YAAY,CAAA;AAC7B,IAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,aAAA,KAAkB,UAAA,IAAc,OAAO,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA,KAAM,UAAA,GAC1D,IAAA,CAAK,GAAA,EAAI,GACV,MAAA;AACN,IAAA,MAAM,IAAA,GAAO,SAAA;AAAA,MACX,KAAA;AAAA,MACA,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,MACtB,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,WAAA,CAAY,MAAM,MAAM;AAC7B,QAAA,MAAM,eAAA,GAAiC,CAAC,KAAA,EAAO,MAAA,KAAW;AACxD,UAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,UAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,QACxB,CAAA;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM;AAAA,YACzC,GAAG,IAAA;AAAA,YACH;AAAA,WACD,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,eAAA;AAAA,MAAgB,IAAA;AAAA,MAAM,MAC3B,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,MAAM,IAAI;AAAA,KAC1C;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,OAAO,CAAA,GAAI,IAAA;AAClB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,uBAAA,CACP,QAAA,EACA,KAAA,EACA,WAAA,EACA,eAAA,EACS;AACT,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,MAAM,SAAA,GAAY,iBAAiB,WAAW,CAAA;AAE9C,EAAA,KAAA,MAAW,cAAc,sBAAA,EAAwB;AAC/C,IAAA,YAAA,GACE,gBAAA,CAAiB,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO;AAAA,MAC5C,UAAA,EAAY,YAAY,UAAU,CAAA,CAAA;AAAA,MAClC,WAAW,MAAM,SAAA;AAAA,MACjB;AAAA,KACD,CAAA,IAAK,YAAA;AAAA,EACV;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,sBAAA,CACP,MAAA,EACA,KAAA,EACA,eAAA,EACS;AACT,EAAA,IAAI,OAAO,MAAA,CAAO,YAAA,KAAiB,UAAA,EAAY;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,cAAc,CAAA;AACzC,EAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,uBAAuB,MAAA,CAAO,YAAA;AAEpC,EAAA,MAAA,CAAO,YAAA,GAAe,SAAS,wBAAA,CAAA,GAE1B,WAAA,EACH;AACA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,oBAAA,EAAsB,MAAM,WAAW,CAAA;AACtE,IAAA,uBAAA,CAAwB,QAAA,EAAU,KAAA,EAAO,WAAA,CAAY,CAAC,GAAG,eAAe,CAAA;AACxE,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAA,CAAO,OAAO,CAAA,GAAI,IAAA;AAClB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,2BAAA,CACP,QACA,KAAA,EACS;AACT,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,qBAAA,GAAwB,EAAE,gBAAA,EAAkB,IAAA,EAAK;AACvD,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,YAAA,GACE,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO;AAAA,IACvC,UAAA,EAAY,mBAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe,UAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GAClB,CAAA,IAAK,YAAA;AAER,EAAA,YAAA,GACE,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO;AAAA,IACzC,UAAA,EAAY,qBAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe,UAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GAClB,CAAA,IAAK,YAAA;AAER,EAAA,YAAA,GACE,sBAAA;AAAA,IACE,MAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,IAAK,YAAA;AAEP,EAAA,IAAI,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AAC5B,IAAA,YAAA,GACE,2BAAA,CAA4B,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,IAAK,YAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,QAAA,CAAS,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,EAAG;AAC/B,IAAA,YAAA,GACE,2BAAA,CAA4B,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,KAAK,CAAA,IAAK,YAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,iBAAA,CACP,SACA,KAAA,EACS;AACT,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,YAAA,GACE,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO;AAAA,IACxC,UAAA,EAAY,eAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GAChB,CAAA,IAAK,YAAA;AAER,EAAA,YAAA,GACE,gBAAA,CAAiB,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO;AAAA,IAC1C,UAAA,EAAY,iBAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GAChB,CAAA,IAAK,YAAA;AAER,EAAA,YAAA,GAAe,sBAAA,CAAuB,OAAA,EAAS,KAAK,CAAA,IAAK,YAAA;AAEzD,EAAA,IAAI,OAAO,OAAA,CAAQ,WAAA,KAAgB,UAAA,EAAY;AAC7C,IAAA,MAAM,OAAA,GAAU,WAAW,qBAAqB,CAAA;AAEhD,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrB,MAAA,MAAM,sBAAsB,OAAA,CAAQ,WAAA;AAEpC,MAAA,OAAA,CAAQ,WAAA,GAAc,SAAS,uBAAA,CAE7B,QAAA,EAAA,GACG,QAAA,EACH;AACA,QAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,UAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,mBAAA,EAAqB,IAAA,EAAM;AAAA,YAC9C,QAAA;AAAA,YACA,GAAG;AAAA,WACJ,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,EAAA,GAAgB,YAAA,KAAwB;AAC/D,UAAA,2BAAA,CAA4B,IAAI,KAAK,CAAA;AACrC,UAAA,OAAO,OAAA,CAAQ,MAAM,QAAA,EAAU,IAAA,EAAM,CAAC,EAAA,EAAI,GAAG,YAAY,CAAC,CAAA;AAAA,QAC5D,CAAA;AAEA,QAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,mBAAA,EAAqB,IAAA,EAAM;AAAA,UAC9C,eAAA;AAAA,UACA,GAAG;AAAA,SACJ,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,IAAA;AACnB,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,IAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,YAAA;AACT;AAEO,SAAS,iBAAA,CACd,QACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAC7B,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,YAAA,GACE,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO;AAAA,IACvC,UAAA,EAAY,cAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GAChB,CAAA,IAAK,YAAA;AAER,EAAA,YAAA,GACE,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO;AAAA,IACzC,UAAA,EAAY,gBAAA;AAAA,IACZ,WAAW,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GAChB,CAAA,IAAK,YAAA;AAER,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAA,CAAO,iBAAiB,CAAA,GAAI,IAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAA,CACd,IACA,MAAA,EACK;AACL,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,QAAA,CAAS,EAAE,CAAA,EAAG;AACxB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAA,CAAG,iBAAiB,CAAA,EAAG;AACzB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAC7B,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,YAAA,GACE,iBAAA,CAAkB,EAAA,EAAqC,KAAK,CAAA,IAC5D,YAAA;AAEF,EAAA,IAAI,QAAA,CAAS,EAAA,CAAG,OAAO,CAAA,EAAG;AACxB,IAAA,YAAA,GAAe,iBAAA,CAAkB,EAAA,CAAG,OAAA,EAAS,KAAK,CAAA,IAAK,YAAA;AAAA,EACzD;AAEA,EAAA,IAAI,QAAA,CAAS,EAAA,CAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AAC3B,IAAA,YAAA,GAAe,iBAAA,CAAkB,EAAA,CAAG,CAAA,CAAE,OAAA,EAAS,KAAK,CAAA,IAAK,YAAA;AAAA,EAC3D;AAQA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,EAAA,CAAG,iBAAiB,CAAA,GAAI,IAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,EAAA;AACT","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"]}
|
|
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 * sha1 hex of the (parameterised, sanitized) statement text. Use to group\n * identical queries in observability tools — the raw `db.statement` is\n * usually unique per call due to inline params or comments, so high-\n * cardinality grouping by it is unhelpful. Example use: aggregate the top\n * 20 queries by total duration by `db.statement.hash`.\n */\nexport const SEMATTRS_DB_STATEMENT_HASH = 'db.statement.hash' 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 { createHash } from 'node:crypto';\nimport { SpanKind, trace } from '@opentelemetry/api';\nimport {\n SEMATTRS_DB_NAME,\n SEMATTRS_DB_OPERATION,\n SEMATTRS_DB_STATEMENT,\n SEMATTRS_DB_STATEMENT_HASH,\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\n/**\n * Stable sha1 of a parameterised SQL statement, used as `db.statement.hash`.\n * Hashes the full original text (not the truncated form) so the hash is\n * identical for queries that only differ in trailing length. We keep this\n * cheap (sha1, hex, take 16 chars) — the goal is grouping, not crypto.\n */\nfunction hashQueryText(queryText: string): string {\n return createHash('sha1').update(queryText).digest('hex').slice(0, 16);\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 (queryText !== undefined) {\n // The hash always lives on the span — even when captureQueryText is off\n // (e.g. for privacy / size reasons) — so query grouping still works.\n span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));\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.
|
|
3
|
+
"version": "0.0.11",
|
|
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.215.0",
|
|
38
38
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
39
|
-
"autotel": "
|
|
39
|
+
"autotel": "3.0.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"drizzle-orm": ">=0.45.2"
|
package/src/common/constants.ts
CHANGED
|
@@ -14,6 +14,14 @@ export const SEMATTRS_DB_COLLECTION_NAME = 'db.collection.name' as const;
|
|
|
14
14
|
export const SEMATTRS_DB_OPERATION_NAME = 'db.operation.name' as const;
|
|
15
15
|
export const SEMATTRS_DB_QUERY_TEXT = 'db.query.text' as const;
|
|
16
16
|
export const SEMATTRS_DB_QUERY_SUMMARY = 'db.query.summary' as const;
|
|
17
|
+
/**
|
|
18
|
+
* sha1 hex of the (parameterised, sanitized) statement text. Use to group
|
|
19
|
+
* identical queries in observability tools — the raw `db.statement` is
|
|
20
|
+
* usually unique per call due to inline params or comments, so high-
|
|
21
|
+
* cardinality grouping by it is unhelpful. Example use: aggregate the top
|
|
22
|
+
* 20 queries by total duration by `db.statement.hash`.
|
|
23
|
+
*/
|
|
24
|
+
export const SEMATTRS_DB_STATEMENT_HASH = 'db.statement.hash' as const;
|
|
17
25
|
|
|
18
26
|
// MongoDB-specific attributes
|
|
19
27
|
export const SEMATTRS_DB_MONGODB_COLLECTION = 'db.mongodb.collection' as const;
|
|
@@ -211,6 +211,47 @@ describe('instrumentDrizzle', () => {
|
|
|
211
211
|
expect(getSpan().attributes['db.operation']).toBe('UPDATE');
|
|
212
212
|
expect(getSpan().attributes['db.statement']).toBeUndefined();
|
|
213
213
|
});
|
|
214
|
+
|
|
215
|
+
it('emits db.statement.hash even when statement text is suppressed', async () => {
|
|
216
|
+
const client = {
|
|
217
|
+
query: vi.fn(async () => ({ rows: [] })),
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
instrumentDrizzle(client, { captureQueryText: false });
|
|
221
|
+
await client.query({ text: 'UPDATE users SET name = $1' });
|
|
222
|
+
|
|
223
|
+
const hash = getSpan().attributes['db.statement.hash'];
|
|
224
|
+
expect(hash).toMatch(/^[0-9a-f]{16}$/);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('produces identical db.statement.hash for identical statements', async () => {
|
|
228
|
+
const client = {
|
|
229
|
+
query: vi.fn(async () => ({ rows: [] })),
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
instrumentDrizzle(client, {});
|
|
233
|
+
await client.query({ text: 'SELECT * FROM users WHERE id = $1' });
|
|
234
|
+
await client.query({ text: 'SELECT * FROM users WHERE id = $1' });
|
|
235
|
+
|
|
236
|
+
expect(getSpan(0).attributes['db.statement.hash']).toBeDefined();
|
|
237
|
+
expect(getSpan(0).attributes['db.statement.hash']).toBe(
|
|
238
|
+
getSpan(1).attributes['db.statement.hash'],
|
|
239
|
+
);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('produces different db.statement.hash for different statements', async () => {
|
|
243
|
+
const client = {
|
|
244
|
+
query: vi.fn(async () => ({ rows: [] })),
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
instrumentDrizzle(client, {});
|
|
248
|
+
await client.query({ text: 'SELECT * FROM users WHERE id = $1' });
|
|
249
|
+
await client.query({ text: 'SELECT * FROM accounts WHERE id = $1' });
|
|
250
|
+
|
|
251
|
+
expect(getSpan(0).attributes['db.statement.hash']).not.toBe(
|
|
252
|
+
getSpan(1).attributes['db.statement.hash'],
|
|
253
|
+
);
|
|
254
|
+
});
|
|
214
255
|
});
|
|
215
256
|
|
|
216
257
|
describe('instrumentDrizzleClient', () => {
|
package/src/drizzle/index.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
2
3
|
import { SpanKind, trace } from '@opentelemetry/api';
|
|
3
4
|
import {
|
|
4
5
|
SEMATTRS_DB_NAME,
|
|
5
6
|
SEMATTRS_DB_OPERATION,
|
|
6
7
|
SEMATTRS_DB_STATEMENT,
|
|
8
|
+
SEMATTRS_DB_STATEMENT_HASH,
|
|
7
9
|
SEMATTRS_DB_SYSTEM,
|
|
8
10
|
SEMATTRS_NET_PEER_NAME,
|
|
9
11
|
SEMATTRS_NET_PEER_PORT,
|
|
@@ -159,6 +161,16 @@ function sanitizeQueryText(queryText: string, maxLength: number): string {
|
|
|
159
161
|
return `${queryText.slice(0, Math.max(0, maxLength))}...`;
|
|
160
162
|
}
|
|
161
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Stable sha1 of a parameterised SQL statement, used as `db.statement.hash`.
|
|
166
|
+
* Hashes the full original text (not the truncated form) so the hash is
|
|
167
|
+
* identical for queries that only differ in trailing length. We keep this
|
|
168
|
+
* cheap (sha1, hex, take 16 chars) — the goal is grouping, not crypto.
|
|
169
|
+
*/
|
|
170
|
+
function hashQueryText(queryText: string): string {
|
|
171
|
+
return createHash('sha1').update(queryText).digest('hex').slice(0, 16);
|
|
172
|
+
}
|
|
173
|
+
|
|
162
174
|
function extractOperation(queryText: string): string | undefined {
|
|
163
175
|
const trimmed = queryText.trimStart();
|
|
164
176
|
const match = /^(?<operation>\w+)/u.exec(trimmed);
|
|
@@ -186,6 +198,12 @@ function buildSpan(
|
|
|
186
198
|
span.setAttribute(SEMATTRS_DB_NAME, state.config.dbName);
|
|
187
199
|
}
|
|
188
200
|
|
|
201
|
+
if (queryText !== undefined) {
|
|
202
|
+
// The hash always lives on the span — even when captureQueryText is off
|
|
203
|
+
// (e.g. for privacy / size reasons) — so query grouping still works.
|
|
204
|
+
span.setAttribute(SEMATTRS_DB_STATEMENT_HASH, hashQueryText(queryText));
|
|
205
|
+
}
|
|
206
|
+
|
|
189
207
|
if (state.config.captureQueryText && queryText !== undefined) {
|
|
190
208
|
span.setAttribute(
|
|
191
209
|
SEMATTRS_DB_STATEMENT,
|