@sentry/node 10.54.0 → 10.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/build/cjs/integrations/node-fetch/vendored/undici.js +2 -3
  2. package/build/cjs/integrations/node-fetch/vendored/undici.js.map +1 -1
  3. package/build/cjs/integrations/tracing/InstrumentationNodeModuleFile.js +15 -0
  4. package/build/cjs/integrations/tracing/InstrumentationNodeModuleFile.js.map +1 -0
  5. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js +9 -9
  6. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js.map +1 -1
  7. package/build/cjs/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  8. package/build/cjs/integrations/tracing/anthropic-ai/index.js.map +1 -1
  9. package/build/cjs/integrations/tracing/connect/vendored/instrumentation.js +3 -5
  10. package/build/cjs/integrations/tracing/connect/vendored/instrumentation.js.map +1 -1
  11. package/build/cjs/integrations/tracing/express.js +3 -5
  12. package/build/cjs/integrations/tracing/express.js.map +1 -1
  13. package/build/cjs/integrations/tracing/fastify/v3/instrumentation.js +10 -11
  14. package/build/cjs/integrations/tracing/fastify/v3/instrumentation.js.map +1 -1
  15. package/build/cjs/integrations/tracing/fastify/vendored/instrumentation.js +3 -4
  16. package/build/cjs/integrations/tracing/fastify/vendored/instrumentation.js.map +1 -1
  17. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js +2 -1
  18. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  19. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js +2 -1
  20. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  21. package/build/cjs/integrations/tracing/google-genai/instrumentation.js +2 -1
  22. package/build/cjs/integrations/tracing/google-genai/instrumentation.js.map +1 -1
  23. package/build/cjs/integrations/tracing/graphql/vendored/instrumentation.js +4 -3
  24. package/build/cjs/integrations/tracing/graphql/vendored/instrumentation.js.map +1 -1
  25. package/build/cjs/integrations/tracing/hapi/vendored/instrumentation.js +2 -5
  26. package/build/cjs/integrations/tracing/hapi/vendored/instrumentation.js.map +1 -1
  27. package/build/cjs/integrations/tracing/hono/index.js.map +1 -1
  28. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js +3 -2
  29. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  30. package/build/cjs/integrations/tracing/koa/vendored/instrumentation.js +3 -4
  31. package/build/cjs/integrations/tracing/koa/vendored/instrumentation.js.map +1 -1
  32. package/build/cjs/integrations/tracing/langchain/instrumentation.js +3 -2
  33. package/build/cjs/integrations/tracing/langchain/instrumentation.js.map +1 -1
  34. package/build/cjs/integrations/tracing/langgraph/index.js.map +1 -1
  35. package/build/cjs/integrations/tracing/langgraph/instrumentation.js +7 -5
  36. package/build/cjs/integrations/tracing/langgraph/instrumentation.js.map +1 -1
  37. package/build/cjs/integrations/tracing/mongo/vendored/instrumentation.js +7 -6
  38. package/build/cjs/integrations/tracing/mongo/vendored/instrumentation.js.map +1 -1
  39. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js +3 -2
  40. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  41. package/build/cjs/integrations/tracing/openai/index.js.map +1 -1
  42. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js +5 -5
  43. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  44. package/build/cjs/integrations/tracing/postgresjs.js +2 -1
  45. package/build/cjs/integrations/tracing/postgresjs.js.map +1 -1
  46. package/build/cjs/integrations/tracing/redis/index.js +3 -2
  47. package/build/cjs/integrations/tracing/redis/index.js.map +1 -1
  48. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +1 -1
  49. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  50. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +4 -3
  51. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  52. package/build/cjs/integrations/tracing/vercelai/instrumentation.js +6 -5
  53. package/build/cjs/integrations/tracing/vercelai/instrumentation.js.map +1 -1
  54. package/build/cjs/utils/setHttpServerSpanRouteAttribute.js +21 -0
  55. package/build/cjs/utils/setHttpServerSpanRouteAttribute.js.map +1 -0
  56. package/build/esm/integrations/node-fetch/vendored/undici.js +3 -4
  57. package/build/esm/integrations/node-fetch/vendored/undici.js.map +1 -1
  58. package/build/esm/integrations/tracing/InstrumentationNodeModuleFile.js +13 -0
  59. package/build/esm/integrations/tracing/InstrumentationNodeModuleFile.js.map +1 -0
  60. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js +7 -7
  61. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js.map +1 -1
  62. package/build/esm/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  63. package/build/esm/integrations/tracing/anthropic-ai/index.js.map +1 -1
  64. package/build/esm/integrations/tracing/connect/vendored/instrumentation.js +3 -5
  65. package/build/esm/integrations/tracing/connect/vendored/instrumentation.js.map +1 -1
  66. package/build/esm/integrations/tracing/express.js +3 -5
  67. package/build/esm/integrations/tracing/express.js.map +1 -1
  68. package/build/esm/integrations/tracing/fastify/v3/instrumentation.js +3 -4
  69. package/build/esm/integrations/tracing/fastify/v3/instrumentation.js.map +1 -1
  70. package/build/esm/integrations/tracing/fastify/vendored/instrumentation.js +3 -4
  71. package/build/esm/integrations/tracing/fastify/vendored/instrumentation.js.map +1 -1
  72. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js +2 -1
  73. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  74. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js +2 -1
  75. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  76. package/build/esm/integrations/tracing/google-genai/instrumentation.js +2 -1
  77. package/build/esm/integrations/tracing/google-genai/instrumentation.js.map +1 -1
  78. package/build/esm/integrations/tracing/graphql/vendored/instrumentation.js +2 -1
  79. package/build/esm/integrations/tracing/graphql/vendored/instrumentation.js.map +1 -1
  80. package/build/esm/integrations/tracing/hapi/vendored/instrumentation.js +2 -5
  81. package/build/esm/integrations/tracing/hapi/vendored/instrumentation.js.map +1 -1
  82. package/build/esm/integrations/tracing/hono/index.js.map +1 -1
  83. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js +2 -1
  84. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  85. package/build/esm/integrations/tracing/koa/vendored/instrumentation.js +3 -4
  86. package/build/esm/integrations/tracing/koa/vendored/instrumentation.js.map +1 -1
  87. package/build/esm/integrations/tracing/langchain/instrumentation.js +2 -1
  88. package/build/esm/integrations/tracing/langchain/instrumentation.js.map +1 -1
  89. package/build/esm/integrations/tracing/langgraph/index.js.map +1 -1
  90. package/build/esm/integrations/tracing/langgraph/instrumentation.js +5 -3
  91. package/build/esm/integrations/tracing/langgraph/instrumentation.js.map +1 -1
  92. package/build/esm/integrations/tracing/mongo/vendored/instrumentation.js +2 -1
  93. package/build/esm/integrations/tracing/mongo/vendored/instrumentation.js.map +1 -1
  94. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js +2 -1
  95. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  96. package/build/esm/integrations/tracing/openai/index.js.map +1 -1
  97. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js +5 -5
  98. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  99. package/build/esm/integrations/tracing/postgresjs.js +2 -1
  100. package/build/esm/integrations/tracing/postgresjs.js.map +1 -1
  101. package/build/esm/integrations/tracing/redis/index.js +3 -2
  102. package/build/esm/integrations/tracing/redis/index.js.map +1 -1
  103. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +1 -1
  104. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  105. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +2 -1
  106. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  107. package/build/esm/integrations/tracing/vercelai/instrumentation.js +6 -5
  108. package/build/esm/integrations/tracing/vercelai/instrumentation.js.map +1 -1
  109. package/build/esm/package.json +1 -1
  110. package/build/esm/utils/setHttpServerSpanRouteAttribute.js +19 -0
  111. package/build/esm/utils/setHttpServerSpanRouteAttribute.js.map +1 -0
  112. package/build/types/integrations/node-fetch/vendored/undici.d.ts.map +1 -1
  113. package/build/types/integrations/tracing/InstrumentationNodeModuleFile.d.ts +9 -0
  114. package/build/types/integrations/tracing/InstrumentationNodeModuleFile.d.ts.map +1 -0
  115. package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts.map +1 -1
  116. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts +2 -2
  117. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts.map +1 -1
  118. package/build/types/integrations/tracing/anthropic-ai/index.d.ts +7 -7
  119. package/build/types/integrations/tracing/connect/vendored/instrumentation.d.ts.map +1 -1
  120. package/build/types/integrations/tracing/express.d.ts.map +1 -1
  121. package/build/types/integrations/tracing/fastify/v3/instrumentation.d.ts.map +1 -1
  122. package/build/types/integrations/tracing/fastify/vendored/instrumentation.d.ts.map +1 -1
  123. package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts.map +1 -1
  124. package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts.map +1 -1
  125. package/build/types/integrations/tracing/google-genai/instrumentation.d.ts.map +1 -1
  126. package/build/types/integrations/tracing/graphql/vendored/instrumentation.d.ts.map +1 -1
  127. package/build/types/integrations/tracing/hapi/vendored/instrumentation.d.ts.map +1 -1
  128. package/build/types/integrations/tracing/hono/index.d.ts +6 -0
  129. package/build/types/integrations/tracing/hono/index.d.ts.map +1 -1
  130. package/build/types/integrations/tracing/knex/vendored/instrumentation.d.ts.map +1 -1
  131. package/build/types/integrations/tracing/koa/vendored/instrumentation.d.ts.map +1 -1
  132. package/build/types/integrations/tracing/langchain/instrumentation.d.ts.map +1 -1
  133. package/build/types/integrations/tracing/langgraph/index.d.ts +7 -7
  134. package/build/types/integrations/tracing/langgraph/instrumentation.d.ts.map +1 -1
  135. package/build/types/integrations/tracing/mongo/vendored/instrumentation.d.ts.map +1 -1
  136. package/build/types/integrations/tracing/mysql2/vendored/instrumentation.d.ts.map +1 -1
  137. package/build/types/integrations/tracing/openai/index.d.ts +7 -7
  138. package/build/types/integrations/tracing/postgres/vendored/instrumentation.d.ts.map +1 -1
  139. package/build/types/integrations/tracing/postgresjs.d.ts.map +1 -1
  140. package/build/types/integrations/tracing/redis/index.d.ts +4 -1
  141. package/build/types/integrations/tracing/redis/index.d.ts.map +1 -1
  142. package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -1
  143. package/build/types/integrations/tracing/vercelai/instrumentation.d.ts +2 -2
  144. package/build/types/integrations/tracing/vercelai/instrumentation.d.ts.map +1 -1
  145. package/build/types/integrations/tracing/vercelai/types.d.ts +6 -4
  146. package/build/types/integrations/tracing/vercelai/types.d.ts.map +1 -1
  147. package/build/types/utils/setHttpServerSpanRouteAttribute.d.ts +9 -0
  148. package/build/types/utils/setHttpServerSpanRouteAttribute.d.ts.map +1 -0
  149. package/build/types-ts3.8/integrations/tracing/InstrumentationNodeModuleFile.d.ts +9 -0
  150. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/utils.d.ts +2 -2
  151. package/build/types-ts3.8/integrations/tracing/anthropic-ai/index.d.ts +7 -7
  152. package/build/types-ts3.8/integrations/tracing/hono/index.d.ts +6 -0
  153. package/build/types-ts3.8/integrations/tracing/langgraph/index.d.ts +7 -7
  154. package/build/types-ts3.8/integrations/tracing/openai/index.d.ts +7 -7
  155. package/build/types-ts3.8/integrations/tracing/redis/index.d.ts +4 -1
  156. package/build/types-ts3.8/integrations/tracing/vercelai/instrumentation.d.ts +2 -2
  157. package/build/types-ts3.8/integrations/tracing/vercelai/types.d.ts +6 -4
  158. package/build/types-ts3.8/utils/setHttpServerSpanRouteAttribute.d.ts +9 -0
  159. package/package.json +5 -4
  160. package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js +0 -151
  161. package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js.map +0 -1
  162. package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js +0 -149
  163. package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js.map +0 -1
  164. package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts +0 -17
  165. package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts.map +0 -1
  166. package/build/types-ts3.8/integrations/tracing/redis/redis-dc-subscriber.d.ts +0 -17
@@ -1 +1 @@
1
- {"version":3,"file":"ioredis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/ioredis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-ioredis-v0.62.0/packages/instrumentation-ioredis\n * - Upstream version: @opentelemetry/instrumentation-ioredis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-ioredis */\n\nimport { context, diag, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_REDIS,\n DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { IORedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-ioredis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- utils ----\n\nfunction endSpan(span: Span, err: Error | null | undefined): void {\n if (err) {\n span.recordException(err);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n }\n span.end();\n}\n\n// ---- IORedisInstrumentation ----\n\nconst DEFAULT_CONFIG: IORedisInstrumentationConfig = {\n requireParentSpan: true,\n};\n\nexport class IORedisInstrumentation extends InstrumentationBase<IORedisInstrumentationConfig> {\n _netSemconvStability!: SemconvStability;\n _dbSemconvStability!: SemconvStability;\n\n constructor(config: IORedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, { ...DEFAULT_CONFIG, ...config });\n this._setSemconvStabilityFromEnv();\n }\n\n _setSemconvStabilityFromEnv(): void {\n this._netSemconvStability = semconvStabilityFromStr('http', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n this._dbSemconvStability = semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: IORedisInstrumentationConfig = {}): void {\n super.setConfig({ ...DEFAULT_CONFIG, ...config });\n }\n\n init() {\n return [\n new InstrumentationNodeModuleDefinition(\n 'ioredis',\n ['>=2.0.0 <6'],\n (module: any, moduleVersion?: string) => {\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n if (isWrapped(moduleExports.prototype.sendCommand)) {\n this._unwrap(moduleExports.prototype, 'sendCommand');\n }\n this._wrap(moduleExports.prototype, 'sendCommand', this._patchSendCommand(moduleVersion));\n if (isWrapped(moduleExports.prototype.connect)) {\n this._unwrap(moduleExports.prototype, 'connect');\n }\n this._wrap(moduleExports.prototype, 'connect', this._patchConnection());\n return module;\n },\n (module: any) => {\n if (module === undefined) return;\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n this._unwrap(moduleExports.prototype, 'sendCommand');\n this._unwrap(moduleExports.prototype, 'connect');\n },\n ),\n ];\n }\n\n private _patchSendCommand(moduleVersion?: string) {\n return (original: Function) => {\n return this._traceSendCommand(original, moduleVersion);\n };\n }\n\n private _patchConnection() {\n return (original: Function) => {\n return this._traceConnection(original);\n };\n }\n\n private _traceSendCommand(original: Function, moduleVersion?: string) {\n const instrumentation = this;\n return function (this: any, cmd: any) {\n if (arguments.length < 1 || typeof cmd !== 'object') {\n return original.apply(this, arguments);\n }\n const config = instrumentation.getConfig();\n const dbStatementSerializer = config.dbStatementSerializer || defaultDbStatementSerializer;\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (config.requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n const dbQueryText = dbStatementSerializer(cmd.name, cmd.args);\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = dbQueryText;\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = dbQueryText;\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan(cmd.name, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const { requestHook } = config;\n if (requestHook) {\n safeExecuteInTheMiddle(\n () =>\n requestHook(span, {\n moduleVersion,\n cmdName: cmd.name,\n cmdArgs: cmd.args,\n }),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: request hook failed', e);\n }\n },\n true,\n );\n }\n try {\n const result = original.apply(this, arguments);\n const origResolve = cmd.resolve;\n cmd.resolve = function (result: unknown) {\n safeExecuteInTheMiddle(\n () => config.responseHook?.(span, cmd.name, cmd.args, result),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: response hook failed', e);\n }\n },\n true,\n );\n endSpan(span, null);\n origResolve(result);\n };\n const origReject = cmd.reject;\n cmd.reject = function (err: Error) {\n endSpan(span, err);\n origReject(err);\n };\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n\n private _traceConnection(original: Function) {\n const instrumentation = this;\n return function (this: any) {\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (instrumentation.getConfig().requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = 'connect';\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = 'connect';\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan('connect', {\n kind: SpanKind.CLIENT,\n attributes,\n });\n try {\n const result = original.apply(this, arguments);\n if (typeof result?.then === 'function') {\n return result.then(\n (value: unknown) => {\n endSpan(span, null);\n return value;\n },\n (error: Error) => {\n endSpan(span, error);\n return Promise.reject(error);\n },\n );\n }\n endSpan(span, null);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n}\n"],"names":["SpanStatusCode","InstrumentationBase","semconvStabilityFromStr","InstrumentationNodeModuleDefinition","isWrapped","instrumentation","defaultDbStatementSerializer","trace","context","SemconvStability","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_DB_STATEMENT","ATTR_DB_CONNECTION_STRING","ATTR_DB_SYSTEM_NAME","DB_SYSTEM_NAME_VALUE_REDIS","ATTR_DB_QUERY_TEXT","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SpanKind","safeExecuteInTheMiddle","diag","result"],"mappings":"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"}
1
+ {"version":3,"file":"ioredis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/ioredis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-ioredis-v0.62.0/packages/instrumentation-ioredis\n * - Upstream version: @opentelemetry/instrumentation-ioredis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-ioredis */\n\nimport { context, diag, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_REDIS,\n DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { IORedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-ioredis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- utils ----\n\nfunction endSpan(span: Span, err: Error | null | undefined): void {\n if (err) {\n span.recordException(err);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n }\n span.end();\n}\n\n// ---- IORedisInstrumentation ----\n\nconst DEFAULT_CONFIG: IORedisInstrumentationConfig = {\n requireParentSpan: true,\n};\n\nexport class IORedisInstrumentation extends InstrumentationBase<IORedisInstrumentationConfig> {\n _netSemconvStability!: SemconvStability;\n _dbSemconvStability!: SemconvStability;\n\n constructor(config: IORedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, { ...DEFAULT_CONFIG, ...config });\n this._setSemconvStabilityFromEnv();\n }\n\n _setSemconvStabilityFromEnv(): void {\n this._netSemconvStability = semconvStabilityFromStr('http', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n this._dbSemconvStability = semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: IORedisInstrumentationConfig = {}): void {\n super.setConfig({ ...DEFAULT_CONFIG, ...config });\n }\n\n init() {\n return [\n new InstrumentationNodeModuleDefinition(\n 'ioredis',\n ['>=2.0.0 <5.11.0'],\n (module: any, moduleVersion?: string) => {\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n if (isWrapped(moduleExports.prototype.sendCommand)) {\n this._unwrap(moduleExports.prototype, 'sendCommand');\n }\n this._wrap(moduleExports.prototype, 'sendCommand', this._patchSendCommand(moduleVersion));\n if (isWrapped(moduleExports.prototype.connect)) {\n this._unwrap(moduleExports.prototype, 'connect');\n }\n this._wrap(moduleExports.prototype, 'connect', this._patchConnection());\n return module;\n },\n (module: any) => {\n if (module === undefined) return;\n const moduleExports =\n module[Symbol.toStringTag] === 'Module'\n ? module.default // ESM\n : module; // CommonJS\n this._unwrap(moduleExports.prototype, 'sendCommand');\n this._unwrap(moduleExports.prototype, 'connect');\n },\n ),\n ];\n }\n\n private _patchSendCommand(moduleVersion?: string) {\n return (original: Function) => {\n return this._traceSendCommand(original, moduleVersion);\n };\n }\n\n private _patchConnection() {\n return (original: Function) => {\n return this._traceConnection(original);\n };\n }\n\n private _traceSendCommand(original: Function, moduleVersion?: string) {\n const instrumentation = this;\n return function (this: any, cmd: any) {\n if (arguments.length < 1 || typeof cmd !== 'object') {\n return original.apply(this, arguments);\n }\n const config = instrumentation.getConfig();\n const dbStatementSerializer = config.dbStatementSerializer || defaultDbStatementSerializer;\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (config.requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n const dbQueryText = dbStatementSerializer(cmd.name, cmd.args);\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = dbQueryText;\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = dbQueryText;\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan(cmd.name, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const { requestHook } = config;\n if (requestHook) {\n safeExecuteInTheMiddle(\n () =>\n requestHook(span, {\n moduleVersion,\n cmdName: cmd.name,\n cmdArgs: cmd.args,\n }),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: request hook failed', e);\n }\n },\n true,\n );\n }\n try {\n const result = original.apply(this, arguments);\n const origResolve = cmd.resolve;\n cmd.resolve = function (result: unknown) {\n safeExecuteInTheMiddle(\n () => config.responseHook?.(span, cmd.name, cmd.args, result),\n (e: Error | undefined) => {\n if (e) {\n diag.error('ioredis instrumentation: response hook failed', e);\n }\n },\n true,\n );\n endSpan(span, null);\n origResolve(result);\n };\n const origReject = cmd.reject;\n cmd.reject = function (err: Error) {\n endSpan(span, err);\n origReject(err);\n };\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n\n private _traceConnection(original: Function) {\n const instrumentation = this;\n return function (this: any) {\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (instrumentation.getConfig().requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const attributes: Record<string, any> = {};\n const { host, port } = this.options;\n if (instrumentation._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_REDIS;\n attributes[ATTR_DB_STATEMENT] = 'connect';\n attributes[ATTR_DB_CONNECTION_STRING] = `redis://${host}:${port}`;\n }\n if (instrumentation._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_REDIS;\n attributes[ATTR_DB_QUERY_TEXT] = 'connect';\n }\n if (instrumentation._netSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_NET_PEER_NAME] = host;\n attributes[ATTR_NET_PEER_PORT] = port;\n }\n if (instrumentation._netSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_SERVER_ADDRESS] = host;\n attributes[ATTR_SERVER_PORT] = port;\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan('connect', {\n kind: SpanKind.CLIENT,\n attributes,\n });\n try {\n const result = original.apply(this, arguments);\n if (typeof result?.then === 'function') {\n return result.then(\n (value: unknown) => {\n endSpan(span, null);\n return value;\n },\n (error: Error) => {\n endSpan(span, error);\n return Promise.reject(error);\n },\n );\n }\n endSpan(span, null);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n };\n }\n}\n"],"names":["SpanStatusCode","InstrumentationBase","semconvStabilityFromStr","InstrumentationNodeModuleDefinition","isWrapped","instrumentation","defaultDbStatementSerializer","trace","context","SemconvStability","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_DB_STATEMENT","ATTR_DB_CONNECTION_STRING","ATTR_DB_SYSTEM_NAME","DB_SYSTEM_NAME_VALUE_REDIS","ATTR_DB_QUERY_TEXT","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SpanKind","safeExecuteInTheMiddle","diag","result"],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  const api = require('@opentelemetry/api');
4
4
  const core = require('@sentry/core');
5
5
  const instrumentation = require('@opentelemetry/instrumentation');
6
+ const InstrumentationNodeModuleFile = require('../../InstrumentationNodeModuleFile.js');
6
7
  const semanticConventions = require('@opentelemetry/semantic-conventions');
7
8
  const redisCommon = require('./redis-common.js');
8
9
  const semconv = require('./semconv.js');
@@ -225,7 +226,7 @@ const _RedisInstrumentationV4_V5 = class _RedisInstrumentationV4_V5 extends inst
225
226
  ];
226
227
  }
227
228
  _getInstrumentationNodeModuleDefinition(basePackageName) {
228
- const commanderModuleFile = new instrumentation.InstrumentationNodeModuleFile(
229
+ const commanderModuleFile = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
229
230
  `${basePackageName}/dist/lib/commander.js`,
230
231
  ["^1.0.0"],
231
232
  (moduleExports, moduleVersion) => {
@@ -250,7 +251,7 @@ const _RedisInstrumentationV4_V5 = class _RedisInstrumentationV4_V5 extends inst
250
251
  }
251
252
  }
252
253
  );
253
- const multiCommanderModule = new instrumentation.InstrumentationNodeModuleFile(
254
+ const multiCommanderModule = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
254
255
  `${basePackageName}/dist/lib/client/multi-command.js`,
255
256
  ["^1.0.0", ">=5.0.0 <5.12.0"],
256
257
  (moduleExports) => {
@@ -282,7 +283,7 @@ const _RedisInstrumentationV4_V5 = class _RedisInstrumentationV4_V5 extends inst
282
283
  }
283
284
  }
284
285
  );
285
- const clientIndexModule = new instrumentation.InstrumentationNodeModuleFile(
286
+ const clientIndexModule = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
286
287
  `${basePackageName}/dist/lib/client/index.js`,
287
288
  ["^1.0.0", ">=5.0.0 <5.12.0"],
288
289
  (moduleExports) => {
@@ -1 +1 @@
1
- {"version":3,"file":"redis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/redis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-redis-v0.62.0/packages/instrumentation-redis\n * - Upstream version: @opentelemetry/instrumentation-redis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-redis */\n\nimport { context, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { DiagLogger, Span, TracerProvider } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_REDIS,\n DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { RedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-redis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- Internal types ----\n\ninterface RedisPluginClientTypes {\n connection_options?: {\n port?: string | number;\n host?: string;\n };\n address?: string;\n}\n\ninterface RedisCommand {\n command: string;\n args: string[];\n buffer_args: boolean;\n callback: (err: Error | null, reply: unknown) => void;\n call_on_write: boolean;\n}\n\ninterface MultiErrorReply extends Error {\n replies: unknown[];\n errorIndexes: Array<number>;\n}\n\ninterface OpenSpanInfo {\n span: Span;\n commandName: string;\n commandArgs: Array<string | Buffer>;\n}\n\nconst OTEL_OPEN_SPANS = Symbol('opentelemetry.instrumentation.redis.open_spans');\nconst MULTI_COMMAND_OPTIONS = Symbol('opentelemetry.instrumentation.redis.multi_command_options');\n\n// ---- v4-v5 utils ----\n\nfunction removeCredentialsFromDBConnectionStringAttribute(\n diagLogger: DiagLogger,\n url: string | undefined,\n): string | undefined {\n if (typeof url !== 'string' || !url) {\n return undefined;\n }\n try {\n const u = new URL(url);\n u.searchParams.delete('user_pwd');\n u.username = '';\n u.password = '';\n return u.href;\n } catch (err) {\n diagLogger.error('failed to sanitize redis connection url', err);\n }\n return undefined;\n}\n\nfunction getClientAttributes(\n diagLogger: DiagLogger,\n options: any,\n semconvStability: SemconvStability,\n): Record<string, any> {\n const attributes: Record<string, any> = {};\n if (semconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n [ATTR_NET_PEER_NAME]: options?.socket?.host,\n [ATTR_NET_PEER_PORT]: options?.socket?.port,\n [ATTR_DB_CONNECTION_STRING]: removeCredentialsFromDBConnectionStringAttribute(diagLogger, options?.url),\n });\n }\n if (semconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n [ATTR_SERVER_ADDRESS]: options?.socket?.host,\n [ATTR_SERVER_PORT]: options?.socket?.port,\n });\n }\n return attributes;\n}\n\n// ---- v2-v3 utils ----\n\nfunction endSpanV2(span: Span, err: Error | null | undefined): void {\n if (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n }\n span.end();\n}\n\nfunction getTracedCreateClient(original: Function): Function {\n return function createClientTrace(this: any) {\n const client = original.apply(this, arguments);\n return context.bind(context.active(), client);\n };\n}\n\nfunction getTracedCreateStreamTrace(original: Function): Function {\n return function create_stream_trace(this: any) {\n if (!Object.prototype.hasOwnProperty.call(this, 'stream')) {\n Object.defineProperty(this, 'stream', {\n get() {\n return this._patched_redis_stream;\n },\n set(val: any) {\n context.bind(context.active(), val);\n this._patched_redis_stream = val;\n },\n });\n }\n return original.apply(this, arguments);\n };\n}\n\n// ---- RedisInstrumentationV2_V3 ----\n\nclass RedisInstrumentationV2_V3 extends InstrumentationBase<RedisInstrumentationConfig> {\n static COMPONENT = 'redis';\n _semconvStability: SemconvStability;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n init() {\n return [\n new InstrumentationNodeModuleDefinition(\n 'redis',\n ['>=2.6.0 <4'],\n (moduleExports: any) => {\n if (isWrapped(moduleExports.RedisClient.prototype['internal_send_command'])) {\n this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n }\n this._wrap(moduleExports.RedisClient.prototype, 'internal_send_command', this._getPatchInternalSendCommand());\n if (isWrapped(moduleExports.RedisClient.prototype['create_stream'])) {\n this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n }\n this._wrap(moduleExports.RedisClient.prototype, 'create_stream', this._getPatchCreateStream());\n if (isWrapped(moduleExports.createClient)) {\n this._unwrap(moduleExports, 'createClient');\n }\n this._wrap(moduleExports, 'createClient', this._getPatchCreateClient());\n return moduleExports;\n },\n (moduleExports: any) => {\n if (moduleExports === undefined) return;\n this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n this._unwrap(moduleExports, 'createClient');\n },\n ),\n ];\n }\n\n private _getPatchInternalSendCommand() {\n const instrumentation = this;\n return function internal_send_command(original: Function) {\n return function internal_send_command_trace(this: RedisPluginClientTypes, cmd: RedisCommand) {\n if (arguments.length !== 1 || typeof cmd !== 'object') {\n return original.apply(this, arguments);\n }\n const config = instrumentation.getConfig();\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (config.requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const dbStatementSerializer = config?.dbStatementSerializer || defaultDbStatementSerializer;\n const attributes: Record<string, any> = {};\n if (instrumentation._semconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n [ATTR_DB_STATEMENT]: dbStatementSerializer(cmd.command, cmd.args),\n });\n }\n if (instrumentation._semconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n [ATTR_DB_OPERATION_NAME]: cmd.command,\n [ATTR_DB_QUERY_TEXT]: dbStatementSerializer(cmd.command, cmd.args),\n });\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n if (this.connection_options) {\n const connectionAttributes: Record<string, any> = {};\n if (instrumentation._semconvStability & SemconvStability.OLD) {\n Object.assign(connectionAttributes, {\n [ATTR_NET_PEER_NAME]: this.connection_options.host,\n [ATTR_NET_PEER_PORT]: this.connection_options.port,\n });\n }\n if (instrumentation._semconvStability & SemconvStability.STABLE) {\n Object.assign(connectionAttributes, {\n [ATTR_SERVER_ADDRESS]: this.connection_options.host,\n [ATTR_SERVER_PORT]: this.connection_options.port,\n });\n }\n span.setAttributes(connectionAttributes);\n }\n if (this.address && instrumentation._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_DB_CONNECTION_STRING, `redis://${this.address}`);\n }\n const originalCallback = arguments[0].callback;\n if (originalCallback) {\n const originalContext = context.active();\n arguments[0].callback = function callback(this: any, err: Error | null, reply: unknown) {\n if (config?.responseHook) {\n const responseHook = config.responseHook;\n safeExecuteInTheMiddle(\n () => {\n responseHook(span, cmd.command, cmd.args, reply);\n },\n (e: Error | undefined) => {\n if (e) {\n instrumentation._diag.error('Error executing responseHook', e);\n }\n },\n true,\n );\n }\n endSpanV2(span, err);\n return context.with(originalContext, originalCallback, this, ...arguments);\n };\n }\n try {\n return original.apply(this, arguments);\n } catch (rethrow) {\n endSpanV2(span, rethrow as Error);\n throw rethrow;\n }\n };\n };\n }\n\n private _getPatchCreateClient() {\n return function createClient(original: Function) {\n return getTracedCreateClient(original);\n };\n }\n\n private _getPatchCreateStream() {\n return function createReadStream(original: Function) {\n return getTracedCreateStreamTrace(original);\n };\n }\n}\n\n// ---- RedisInstrumentationV4_V5 ----\n\nclass RedisInstrumentationV4_V5 extends InstrumentationBase<RedisInstrumentationConfig> {\n static COMPONENT = 'redis';\n _semconvStability: SemconvStability;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n init() {\n return [\n this._getInstrumentationNodeModuleDefinition('@redis/client'),\n this._getInstrumentationNodeModuleDefinition('@node-redis/client'),\n ];\n }\n\n private _getInstrumentationNodeModuleDefinition(basePackageName: string) {\n const commanderModuleFile = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/commander.js`,\n ['^1.0.0'],\n (moduleExports: any, moduleVersion?: string) => {\n const transformCommandArguments = moduleExports.transformCommandArguments;\n if (!transformCommandArguments) {\n this._diag.error('internal instrumentation error, missing transformCommandArguments function');\n return moduleExports;\n }\n const functionToPatch = moduleVersion?.startsWith('1.0.') ? 'extendWithCommands' : 'attachCommands';\n if (isWrapped(moduleExports?.[functionToPatch])) {\n this._unwrap(moduleExports, functionToPatch);\n }\n this._wrap(moduleExports, functionToPatch, this._getPatchExtendWithCommands(transformCommandArguments));\n return moduleExports;\n },\n (moduleExports: any) => {\n if (isWrapped(moduleExports?.extendWithCommands)) {\n this._unwrap(moduleExports, 'extendWithCommands');\n }\n if (isWrapped(moduleExports?.attachCommands)) {\n this._unwrap(moduleExports, 'attachCommands');\n }\n },\n );\n\n const multiCommanderModule = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/client/multi-command.js`,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => {\n const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n this._unwrap(redisClientMultiCommandPrototype, 'exec');\n }\n this._wrap(redisClientMultiCommandPrototype, 'exec', this._getPatchMultiCommandsExec(false));\n if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n }\n this._wrap(redisClientMultiCommandPrototype, 'execAsPipeline', this._getPatchMultiCommandsExec(true));\n if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n }\n this._wrap(redisClientMultiCommandPrototype, 'addCommand', this._getPatchMultiCommandsAddCommand());\n return moduleExports;\n },\n (moduleExports: any) => {\n const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n this._unwrap(redisClientMultiCommandPrototype, 'exec');\n }\n if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n }\n if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n }\n },\n );\n\n const clientIndexModule = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/client/index.js`,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => {\n const redisClientPrototype = moduleExports?.default?.prototype;\n if (redisClientPrototype?.multi) {\n if (isWrapped(redisClientPrototype?.multi)) {\n this._unwrap(redisClientPrototype, 'multi');\n }\n this._wrap(redisClientPrototype, 'multi', this._getPatchRedisClientMulti());\n }\n if (redisClientPrototype?.MULTI) {\n if (isWrapped(redisClientPrototype?.MULTI)) {\n this._unwrap(redisClientPrototype, 'MULTI');\n }\n this._wrap(redisClientPrototype, 'MULTI', this._getPatchRedisClientMulti());\n }\n if (isWrapped(redisClientPrototype?.sendCommand)) {\n this._unwrap(redisClientPrototype, 'sendCommand');\n }\n this._wrap(redisClientPrototype, 'sendCommand', this._getPatchRedisClientSendCommand());\n if (isWrapped(redisClientPrototype?.connect)) {\n this._unwrap(redisClientPrototype, 'connect');\n }\n this._wrap(redisClientPrototype, 'connect', this._getPatchedClientConnect());\n return moduleExports;\n },\n (moduleExports: any) => {\n const redisClientPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientPrototype?.multi)) {\n this._unwrap(redisClientPrototype, 'multi');\n }\n if (isWrapped(redisClientPrototype?.MULTI)) {\n this._unwrap(redisClientPrototype, 'MULTI');\n }\n if (isWrapped(redisClientPrototype?.sendCommand)) {\n this._unwrap(redisClientPrototype, 'sendCommand');\n }\n if (isWrapped(redisClientPrototype?.connect)) {\n this._unwrap(redisClientPrototype, 'connect');\n }\n },\n );\n\n return new InstrumentationNodeModuleDefinition(\n basePackageName,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => moduleExports,\n () => {},\n [commanderModuleFile, multiCommanderModule, clientIndexModule],\n );\n }\n\n private _getPatchExtendWithCommands(transformCommandArguments: Function) {\n const plugin = this;\n return function extendWithCommandsPatchWrapper(original: Function) {\n return function extendWithCommandsPatch(this: any, config: any) {\n if (config?.BaseClass?.name !== 'RedisClient') {\n return original.apply(this, arguments);\n }\n const origExecutor = config.executor;\n config.executor = function (this: any, command: any, args: any) {\n const redisCommandArguments = transformCommandArguments(command, args).args;\n return plugin._traceClientCommand(origExecutor, this, arguments, redisCommandArguments);\n };\n return original.apply(this, arguments);\n };\n };\n }\n\n private _getPatchMultiCommandsExec(isPipeline: boolean) {\n const plugin = this;\n return function execPatchWrapper(original: Function) {\n return function execPatch(this: any) {\n const execRes = original.apply(this, arguments);\n if (typeof execRes?.then !== 'function') {\n plugin._diag.error('non-promise result when patching exec/execAsPipeline');\n return execRes;\n }\n return execRes\n .then((redisRes: unknown[]) => {\n const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n plugin._endSpansWithRedisReplies(openSpans, redisRes, isPipeline);\n return redisRes;\n })\n .catch((err: any) => {\n const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n if (!openSpans) {\n plugin._diag.error('cannot find open spans to end for multi/pipeline');\n } else {\n const replies =\n err.constructor.name === 'MultiErrorReply'\n ? (err as MultiErrorReply).replies\n : new Array(openSpans.length).fill(err);\n plugin._endSpansWithRedisReplies(openSpans, replies, isPipeline);\n }\n return Promise.reject(err);\n });\n };\n };\n }\n\n private _getPatchMultiCommandsAddCommand() {\n const plugin = this;\n return function addCommandWrapper(original: Function) {\n return function addCommandPatch(this: any, args: any) {\n return plugin._traceClientCommand(original, this, arguments, args);\n };\n };\n }\n\n private _getPatchRedisClientMulti() {\n return function multiPatchWrapper(original: Function) {\n return function multiPatch(this: any) {\n const multiRes: any = original.apply(this, arguments);\n multiRes[MULTI_COMMAND_OPTIONS] = this.options;\n return multiRes;\n };\n };\n }\n\n private _getPatchRedisClientSendCommand() {\n const plugin = this;\n return function sendCommandWrapper(original: Function) {\n return function sendCommandPatch(this: any, args: any) {\n return plugin._traceClientCommand(original, this, arguments, args);\n };\n };\n }\n\n private _getPatchedClientConnect() {\n const plugin = this;\n return function connectWrapper(original: Function) {\n return function patchedConnect(this: any) {\n const options = this.options;\n const attributes = getClientAttributes(plugin._diag, options, plugin._semconvStability);\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = plugin.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-connect`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const res = context.with(trace.setSpan(context.active(), span), () => {\n return original.apply(this);\n });\n return res\n .then((result: any) => {\n span.end();\n return result;\n })\n .catch((error: Error) => {\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.end();\n return Promise.reject(error);\n });\n };\n };\n }\n\n _traceClientCommand(\n origFunction: Function,\n origThis: any,\n origArguments: IArguments,\n redisCommandArguments: Array<string | Buffer>,\n ): any {\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (hasNoParentSpan && this.getConfig().requireParentSpan) {\n return origFunction.apply(origThis, origArguments);\n }\n const clientOptions = origThis.options || origThis[MULTI_COMMAND_OPTIONS];\n const commandName = redisCommandArguments[0] as string;\n const commandArgs = redisCommandArguments.slice(1);\n const dbStatementSerializer = this.getConfig().dbStatementSerializer || defaultDbStatementSerializer;\n const attributes = getClientAttributes(this._diag, clientOptions, this._semconvStability);\n if (this._semconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_OPERATION_NAME] = commandName;\n }\n try {\n const dbStatement = dbStatementSerializer(commandName, commandArgs);\n if (dbStatement != null) {\n if (this._semconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_STATEMENT] = dbStatement;\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_QUERY_TEXT] = dbStatement;\n }\n }\n } catch (e) {\n this._diag.error('dbStatementSerializer throw an exception', e, { commandName });\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = this.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-${commandName}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const res = context.with(trace.setSpan(context.active(), span), () => {\n return origFunction.apply(origThis, origArguments);\n });\n if (typeof res?.then === 'function') {\n res.then(\n (redisRes: unknown) => {\n this._endSpanWithResponse(span, commandName, commandArgs, redisRes, undefined);\n },\n (err: Error) => {\n this._endSpanWithResponse(span, commandName, commandArgs, null, err);\n },\n );\n } else {\n const redisClientMultiCommand: any = res;\n redisClientMultiCommand[OTEL_OPEN_SPANS] = redisClientMultiCommand[OTEL_OPEN_SPANS] || [];\n redisClientMultiCommand[OTEL_OPEN_SPANS].push({\n span,\n commandName,\n commandArgs,\n });\n }\n return res;\n }\n\n _endSpansWithRedisReplies(openSpans: OpenSpanInfo[] | undefined, replies: unknown[], isPipeline = false): void {\n if (!openSpans) {\n return this._diag.error('cannot find open spans to end for redis multi/pipeline');\n }\n if (replies.length !== openSpans.length) {\n return this._diag.error('number of multi command spans does not match response from redis');\n }\n const allCommands = openSpans.map(s => s.commandName);\n const allSameCommand = allCommands.every(cmd => cmd === allCommands[0]);\n const operationName = allSameCommand\n ? (isPipeline ? 'PIPELINE ' : 'MULTI ') + allCommands[0]\n : isPipeline\n ? 'PIPELINE'\n : 'MULTI';\n for (let i = 0; i < openSpans.length; i++) {\n const { span, commandArgs } = openSpans[i]!;\n const currCommandRes = replies[i];\n const [res, err] = currCommandRes instanceof Error ? [null, currCommandRes] : [currCommandRes, undefined];\n if (this._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_DB_OPERATION_NAME, operationName);\n }\n this._endSpanWithResponse(span, allCommands[i]!, commandArgs, res, err);\n }\n }\n\n _endSpanWithResponse(\n span: Span,\n commandName: string,\n commandArgs: Array<string | Buffer>,\n response: unknown,\n error: Error | null | undefined,\n ): void {\n const { responseHook } = this.getConfig();\n if (!error && responseHook) {\n try {\n responseHook(span, commandName, commandArgs, response);\n } catch (err) {\n this._diag.error('responseHook throw an exception', err);\n }\n }\n if (error) {\n span.recordException(error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message });\n }\n span.end();\n }\n}\n\n// ---- RedisInstrumentation (wrapper) ----\n\nconst DEFAULT_CONFIG: RedisInstrumentationConfig = {\n requireParentSpan: false,\n};\n\nexport class RedisInstrumentation extends InstrumentationBase<RedisInstrumentationConfig> {\n private instrumentationV2_V3: RedisInstrumentationV2_V3;\n private instrumentationV4_V5: RedisInstrumentationV4_V5;\n private initialized = false;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n const resolvedConfig = { ...DEFAULT_CONFIG, ...config };\n super(PACKAGE_NAME, PACKAGE_VERSION, resolvedConfig);\n this.instrumentationV2_V3 = new RedisInstrumentationV2_V3(this.getConfig());\n this.instrumentationV4_V5 = new RedisInstrumentationV4_V5(this.getConfig());\n this.initialized = true;\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n const newConfig = { ...DEFAULT_CONFIG, ...config };\n super.setConfig(newConfig);\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.setConfig(newConfig);\n this.instrumentationV4_V5.setConfig(newConfig);\n }\n\n init() {}\n\n override getModuleDefinitions() {\n return [...this.instrumentationV2_V3.getModuleDefinitions(), ...this.instrumentationV4_V5.getModuleDefinitions()];\n }\n\n override setTracerProvider(tracerProvider: TracerProvider): void {\n super.setTracerProvider(tracerProvider);\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.setTracerProvider(tracerProvider);\n this.instrumentationV4_V5.setTracerProvider(tracerProvider);\n }\n\n override enable(): void {\n super.enable();\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.enable();\n this.instrumentationV4_V5.enable();\n }\n\n override disable(): void {\n super.disable();\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.disable();\n this.instrumentationV4_V5.disable();\n }\n}\n"],"names":["SemconvStability","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","ATTR_DB_CONNECTION_STRING","ATTR_DB_SYSTEM_NAME","DB_SYSTEM_NAME_VALUE_REDIS","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","SpanStatusCode","context","InstrumentationBase","semconvStabilityFromStr","InstrumentationNodeModuleDefinition","isWrapped","instrumentation","trace","defaultDbStatementSerializer","ATTR_DB_STATEMENT","ATTR_DB_OPERATION_NAME","ATTR_DB_QUERY_TEXT","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SpanKind","safeExecuteInTheMiddle","InstrumentationNodeModuleFile"],"mappings":"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"}
1
+ {"version":3,"file":"redis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/redis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-redis-v0.62.0/packages/instrumentation-redis\n * - Upstream version: @opentelemetry/instrumentation-redis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-redis */\n\nimport { context, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { DiagLogger, Span, TracerProvider } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../InstrumentationNodeModuleFile';\nimport {\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n ATTR_DB_CONNECTION_STRING,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_REDIS,\n DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { RedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-redis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- Internal types ----\n\ninterface RedisPluginClientTypes {\n connection_options?: {\n port?: string | number;\n host?: string;\n };\n address?: string;\n}\n\ninterface RedisCommand {\n command: string;\n args: string[];\n buffer_args: boolean;\n callback: (err: Error | null, reply: unknown) => void;\n call_on_write: boolean;\n}\n\ninterface MultiErrorReply extends Error {\n replies: unknown[];\n errorIndexes: Array<number>;\n}\n\ninterface OpenSpanInfo {\n span: Span;\n commandName: string;\n commandArgs: Array<string | Buffer>;\n}\n\nconst OTEL_OPEN_SPANS = Symbol('opentelemetry.instrumentation.redis.open_spans');\nconst MULTI_COMMAND_OPTIONS = Symbol('opentelemetry.instrumentation.redis.multi_command_options');\n\n// ---- v4-v5 utils ----\n\nfunction removeCredentialsFromDBConnectionStringAttribute(\n diagLogger: DiagLogger,\n url: string | undefined,\n): string | undefined {\n if (typeof url !== 'string' || !url) {\n return undefined;\n }\n try {\n const u = new URL(url);\n u.searchParams.delete('user_pwd');\n u.username = '';\n u.password = '';\n return u.href;\n } catch (err) {\n diagLogger.error('failed to sanitize redis connection url', err);\n }\n return undefined;\n}\n\nfunction getClientAttributes(\n diagLogger: DiagLogger,\n options: any,\n semconvStability: SemconvStability,\n): Record<string, any> {\n const attributes: Record<string, any> = {};\n if (semconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n [ATTR_NET_PEER_NAME]: options?.socket?.host,\n [ATTR_NET_PEER_PORT]: options?.socket?.port,\n [ATTR_DB_CONNECTION_STRING]: removeCredentialsFromDBConnectionStringAttribute(diagLogger, options?.url),\n });\n }\n if (semconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n [ATTR_SERVER_ADDRESS]: options?.socket?.host,\n [ATTR_SERVER_PORT]: options?.socket?.port,\n });\n }\n return attributes;\n}\n\n// ---- v2-v3 utils ----\n\nfunction endSpanV2(span: Span, err: Error | null | undefined): void {\n if (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n }\n span.end();\n}\n\nfunction getTracedCreateClient(original: Function): Function {\n return function createClientTrace(this: any) {\n const client = original.apply(this, arguments);\n return context.bind(context.active(), client);\n };\n}\n\nfunction getTracedCreateStreamTrace(original: Function): Function {\n return function create_stream_trace(this: any) {\n if (!Object.prototype.hasOwnProperty.call(this, 'stream')) {\n Object.defineProperty(this, 'stream', {\n get() {\n return this._patched_redis_stream;\n },\n set(val: any) {\n context.bind(context.active(), val);\n this._patched_redis_stream = val;\n },\n });\n }\n return original.apply(this, arguments);\n };\n}\n\n// ---- RedisInstrumentationV2_V3 ----\n\nclass RedisInstrumentationV2_V3 extends InstrumentationBase<RedisInstrumentationConfig> {\n static COMPONENT = 'redis';\n _semconvStability: SemconvStability;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n init() {\n return [\n new InstrumentationNodeModuleDefinition(\n 'redis',\n ['>=2.6.0 <4'],\n (moduleExports: any) => {\n if (isWrapped(moduleExports.RedisClient.prototype['internal_send_command'])) {\n this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n }\n this._wrap(moduleExports.RedisClient.prototype, 'internal_send_command', this._getPatchInternalSendCommand());\n if (isWrapped(moduleExports.RedisClient.prototype['create_stream'])) {\n this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n }\n this._wrap(moduleExports.RedisClient.prototype, 'create_stream', this._getPatchCreateStream());\n if (isWrapped(moduleExports.createClient)) {\n this._unwrap(moduleExports, 'createClient');\n }\n this._wrap(moduleExports, 'createClient', this._getPatchCreateClient());\n return moduleExports;\n },\n (moduleExports: any) => {\n if (moduleExports === undefined) return;\n this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n this._unwrap(moduleExports, 'createClient');\n },\n ),\n ];\n }\n\n private _getPatchInternalSendCommand() {\n const instrumentation = this;\n return function internal_send_command(original: Function) {\n return function internal_send_command_trace(this: RedisPluginClientTypes, cmd: RedisCommand) {\n if (arguments.length !== 1 || typeof cmd !== 'object') {\n return original.apply(this, arguments);\n }\n const config = instrumentation.getConfig();\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (config.requireParentSpan === true && hasNoParentSpan) {\n return original.apply(this, arguments);\n }\n const dbStatementSerializer = config?.dbStatementSerializer || defaultDbStatementSerializer;\n const attributes: Record<string, any> = {};\n if (instrumentation._semconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n [ATTR_DB_STATEMENT]: dbStatementSerializer(cmd.command, cmd.args),\n });\n }\n if (instrumentation._semconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n [ATTR_DB_OPERATION_NAME]: cmd.command,\n [ATTR_DB_QUERY_TEXT]: dbStatementSerializer(cmd.command, cmd.args),\n });\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n if (this.connection_options) {\n const connectionAttributes: Record<string, any> = {};\n if (instrumentation._semconvStability & SemconvStability.OLD) {\n Object.assign(connectionAttributes, {\n [ATTR_NET_PEER_NAME]: this.connection_options.host,\n [ATTR_NET_PEER_PORT]: this.connection_options.port,\n });\n }\n if (instrumentation._semconvStability & SemconvStability.STABLE) {\n Object.assign(connectionAttributes, {\n [ATTR_SERVER_ADDRESS]: this.connection_options.host,\n [ATTR_SERVER_PORT]: this.connection_options.port,\n });\n }\n span.setAttributes(connectionAttributes);\n }\n if (this.address && instrumentation._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_DB_CONNECTION_STRING, `redis://${this.address}`);\n }\n const originalCallback = arguments[0].callback;\n if (originalCallback) {\n const originalContext = context.active();\n arguments[0].callback = function callback(this: any, err: Error | null, reply: unknown) {\n if (config?.responseHook) {\n const responseHook = config.responseHook;\n safeExecuteInTheMiddle(\n () => {\n responseHook(span, cmd.command, cmd.args, reply);\n },\n (e: Error | undefined) => {\n if (e) {\n instrumentation._diag.error('Error executing responseHook', e);\n }\n },\n true,\n );\n }\n endSpanV2(span, err);\n return context.with(originalContext, originalCallback, this, ...arguments);\n };\n }\n try {\n return original.apply(this, arguments);\n } catch (rethrow) {\n endSpanV2(span, rethrow as Error);\n throw rethrow;\n }\n };\n };\n }\n\n private _getPatchCreateClient() {\n return function createClient(original: Function) {\n return getTracedCreateClient(original);\n };\n }\n\n private _getPatchCreateStream() {\n return function createReadStream(original: Function) {\n return getTracedCreateStreamTrace(original);\n };\n }\n}\n\n// ---- RedisInstrumentationV4_V5 ----\n\nclass RedisInstrumentationV4_V5 extends InstrumentationBase<RedisInstrumentationConfig> {\n static COMPONENT = 'redis';\n _semconvStability: SemconvStability;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n super.setConfig(config);\n this._semconvStability = config.semconvStability\n ? config.semconvStability\n : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n }\n\n init() {\n return [\n this._getInstrumentationNodeModuleDefinition('@redis/client'),\n this._getInstrumentationNodeModuleDefinition('@node-redis/client'),\n ];\n }\n\n private _getInstrumentationNodeModuleDefinition(basePackageName: string) {\n const commanderModuleFile = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/commander.js`,\n ['^1.0.0'],\n (moduleExports: any, moduleVersion?: string) => {\n const transformCommandArguments = moduleExports.transformCommandArguments;\n if (!transformCommandArguments) {\n this._diag.error('internal instrumentation error, missing transformCommandArguments function');\n return moduleExports;\n }\n const functionToPatch = moduleVersion?.startsWith('1.0.') ? 'extendWithCommands' : 'attachCommands';\n if (isWrapped(moduleExports?.[functionToPatch])) {\n this._unwrap(moduleExports, functionToPatch);\n }\n this._wrap(moduleExports, functionToPatch, this._getPatchExtendWithCommands(transformCommandArguments));\n return moduleExports;\n },\n (moduleExports: any) => {\n if (isWrapped(moduleExports?.extendWithCommands)) {\n this._unwrap(moduleExports, 'extendWithCommands');\n }\n if (isWrapped(moduleExports?.attachCommands)) {\n this._unwrap(moduleExports, 'attachCommands');\n }\n },\n );\n\n const multiCommanderModule = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/client/multi-command.js`,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => {\n const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n this._unwrap(redisClientMultiCommandPrototype, 'exec');\n }\n this._wrap(redisClientMultiCommandPrototype, 'exec', this._getPatchMultiCommandsExec(false));\n if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n }\n this._wrap(redisClientMultiCommandPrototype, 'execAsPipeline', this._getPatchMultiCommandsExec(true));\n if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n }\n this._wrap(redisClientMultiCommandPrototype, 'addCommand', this._getPatchMultiCommandsAddCommand());\n return moduleExports;\n },\n (moduleExports: any) => {\n const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n this._unwrap(redisClientMultiCommandPrototype, 'exec');\n }\n if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n }\n if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n }\n },\n );\n\n const clientIndexModule = new InstrumentationNodeModuleFile(\n `${basePackageName}/dist/lib/client/index.js`,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => {\n const redisClientPrototype = moduleExports?.default?.prototype;\n if (redisClientPrototype?.multi) {\n if (isWrapped(redisClientPrototype?.multi)) {\n this._unwrap(redisClientPrototype, 'multi');\n }\n this._wrap(redisClientPrototype, 'multi', this._getPatchRedisClientMulti());\n }\n if (redisClientPrototype?.MULTI) {\n if (isWrapped(redisClientPrototype?.MULTI)) {\n this._unwrap(redisClientPrototype, 'MULTI');\n }\n this._wrap(redisClientPrototype, 'MULTI', this._getPatchRedisClientMulti());\n }\n if (isWrapped(redisClientPrototype?.sendCommand)) {\n this._unwrap(redisClientPrototype, 'sendCommand');\n }\n this._wrap(redisClientPrototype, 'sendCommand', this._getPatchRedisClientSendCommand());\n if (isWrapped(redisClientPrototype?.connect)) {\n this._unwrap(redisClientPrototype, 'connect');\n }\n this._wrap(redisClientPrototype, 'connect', this._getPatchedClientConnect());\n return moduleExports;\n },\n (moduleExports: any) => {\n const redisClientPrototype = moduleExports?.default?.prototype;\n if (isWrapped(redisClientPrototype?.multi)) {\n this._unwrap(redisClientPrototype, 'multi');\n }\n if (isWrapped(redisClientPrototype?.MULTI)) {\n this._unwrap(redisClientPrototype, 'MULTI');\n }\n if (isWrapped(redisClientPrototype?.sendCommand)) {\n this._unwrap(redisClientPrototype, 'sendCommand');\n }\n if (isWrapped(redisClientPrototype?.connect)) {\n this._unwrap(redisClientPrototype, 'connect');\n }\n },\n );\n\n return new InstrumentationNodeModuleDefinition(\n basePackageName,\n ['^1.0.0', '>=5.0.0 <5.12.0'],\n (moduleExports: any) => moduleExports,\n () => {},\n [commanderModuleFile, multiCommanderModule, clientIndexModule],\n );\n }\n\n private _getPatchExtendWithCommands(transformCommandArguments: Function) {\n const plugin = this;\n return function extendWithCommandsPatchWrapper(original: Function) {\n return function extendWithCommandsPatch(this: any, config: any) {\n if (config?.BaseClass?.name !== 'RedisClient') {\n return original.apply(this, arguments);\n }\n const origExecutor = config.executor;\n config.executor = function (this: any, command: any, args: any) {\n const redisCommandArguments = transformCommandArguments(command, args).args;\n return plugin._traceClientCommand(origExecutor, this, arguments, redisCommandArguments);\n };\n return original.apply(this, arguments);\n };\n };\n }\n\n private _getPatchMultiCommandsExec(isPipeline: boolean) {\n const plugin = this;\n return function execPatchWrapper(original: Function) {\n return function execPatch(this: any) {\n const execRes = original.apply(this, arguments);\n if (typeof execRes?.then !== 'function') {\n plugin._diag.error('non-promise result when patching exec/execAsPipeline');\n return execRes;\n }\n return execRes\n .then((redisRes: unknown[]) => {\n const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n plugin._endSpansWithRedisReplies(openSpans, redisRes, isPipeline);\n return redisRes;\n })\n .catch((err: any) => {\n const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n if (!openSpans) {\n plugin._diag.error('cannot find open spans to end for multi/pipeline');\n } else {\n const replies =\n err.constructor.name === 'MultiErrorReply'\n ? (err as MultiErrorReply).replies\n : new Array(openSpans.length).fill(err);\n plugin._endSpansWithRedisReplies(openSpans, replies, isPipeline);\n }\n return Promise.reject(err);\n });\n };\n };\n }\n\n private _getPatchMultiCommandsAddCommand() {\n const plugin = this;\n return function addCommandWrapper(original: Function) {\n return function addCommandPatch(this: any, args: any) {\n return plugin._traceClientCommand(original, this, arguments, args);\n };\n };\n }\n\n private _getPatchRedisClientMulti() {\n return function multiPatchWrapper(original: Function) {\n return function multiPatch(this: any) {\n const multiRes: any = original.apply(this, arguments);\n multiRes[MULTI_COMMAND_OPTIONS] = this.options;\n return multiRes;\n };\n };\n }\n\n private _getPatchRedisClientSendCommand() {\n const plugin = this;\n return function sendCommandWrapper(original: Function) {\n return function sendCommandPatch(this: any, args: any) {\n return plugin._traceClientCommand(original, this, arguments, args);\n };\n };\n }\n\n private _getPatchedClientConnect() {\n const plugin = this;\n return function connectWrapper(original: Function) {\n return function patchedConnect(this: any) {\n const options = this.options;\n const attributes = getClientAttributes(plugin._diag, options, plugin._semconvStability);\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = plugin.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-connect`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const res = context.with(trace.setSpan(context.active(), span), () => {\n return original.apply(this);\n });\n return res\n .then((result: any) => {\n span.end();\n return result;\n })\n .catch((error: Error) => {\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.end();\n return Promise.reject(error);\n });\n };\n };\n }\n\n _traceClientCommand(\n origFunction: Function,\n origThis: any,\n origArguments: IArguments,\n redisCommandArguments: Array<string | Buffer>,\n ): any {\n const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n if (hasNoParentSpan && this.getConfig().requireParentSpan) {\n return origFunction.apply(origThis, origArguments);\n }\n const clientOptions = origThis.options || origThis[MULTI_COMMAND_OPTIONS];\n const commandName = redisCommandArguments[0] as string;\n const commandArgs = redisCommandArguments.slice(1);\n const dbStatementSerializer = this.getConfig().dbStatementSerializer || defaultDbStatementSerializer;\n const attributes = getClientAttributes(this._diag, clientOptions, this._semconvStability);\n if (this._semconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_OPERATION_NAME] = commandName;\n }\n try {\n const dbStatement = dbStatementSerializer(commandName, commandArgs);\n if (dbStatement != null) {\n if (this._semconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_STATEMENT] = dbStatement;\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_QUERY_TEXT] = dbStatement;\n }\n }\n } catch (e) {\n this._diag.error('dbStatementSerializer throw an exception', e, { commandName });\n }\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n const span = this.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-${commandName}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n const res = context.with(trace.setSpan(context.active(), span), () => {\n return origFunction.apply(origThis, origArguments);\n });\n if (typeof res?.then === 'function') {\n res.then(\n (redisRes: unknown) => {\n this._endSpanWithResponse(span, commandName, commandArgs, redisRes, undefined);\n },\n (err: Error) => {\n this._endSpanWithResponse(span, commandName, commandArgs, null, err);\n },\n );\n } else {\n const redisClientMultiCommand: any = res;\n redisClientMultiCommand[OTEL_OPEN_SPANS] = redisClientMultiCommand[OTEL_OPEN_SPANS] || [];\n redisClientMultiCommand[OTEL_OPEN_SPANS].push({\n span,\n commandName,\n commandArgs,\n });\n }\n return res;\n }\n\n _endSpansWithRedisReplies(openSpans: OpenSpanInfo[] | undefined, replies: unknown[], isPipeline = false): void {\n if (!openSpans) {\n return this._diag.error('cannot find open spans to end for redis multi/pipeline');\n }\n if (replies.length !== openSpans.length) {\n return this._diag.error('number of multi command spans does not match response from redis');\n }\n const allCommands = openSpans.map(s => s.commandName);\n const allSameCommand = allCommands.every(cmd => cmd === allCommands[0]);\n const operationName = allSameCommand\n ? (isPipeline ? 'PIPELINE ' : 'MULTI ') + allCommands[0]\n : isPipeline\n ? 'PIPELINE'\n : 'MULTI';\n for (let i = 0; i < openSpans.length; i++) {\n const { span, commandArgs } = openSpans[i]!;\n const currCommandRes = replies[i];\n const [res, err] = currCommandRes instanceof Error ? [null, currCommandRes] : [currCommandRes, undefined];\n if (this._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_DB_OPERATION_NAME, operationName);\n }\n this._endSpanWithResponse(span, allCommands[i]!, commandArgs, res, err);\n }\n }\n\n _endSpanWithResponse(\n span: Span,\n commandName: string,\n commandArgs: Array<string | Buffer>,\n response: unknown,\n error: Error | null | undefined,\n ): void {\n const { responseHook } = this.getConfig();\n if (!error && responseHook) {\n try {\n responseHook(span, commandName, commandArgs, response);\n } catch (err) {\n this._diag.error('responseHook throw an exception', err);\n }\n }\n if (error) {\n span.recordException(error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message });\n }\n span.end();\n }\n}\n\n// ---- RedisInstrumentation (wrapper) ----\n\nconst DEFAULT_CONFIG: RedisInstrumentationConfig = {\n requireParentSpan: false,\n};\n\nexport class RedisInstrumentation extends InstrumentationBase<RedisInstrumentationConfig> {\n private instrumentationV2_V3: RedisInstrumentationV2_V3;\n private instrumentationV4_V5: RedisInstrumentationV4_V5;\n private initialized = false;\n\n constructor(config: RedisInstrumentationConfig = {}) {\n const resolvedConfig = { ...DEFAULT_CONFIG, ...config };\n super(PACKAGE_NAME, PACKAGE_VERSION, resolvedConfig);\n this.instrumentationV2_V3 = new RedisInstrumentationV2_V3(this.getConfig());\n this.instrumentationV4_V5 = new RedisInstrumentationV4_V5(this.getConfig());\n this.initialized = true;\n }\n\n override setConfig(config: RedisInstrumentationConfig = {}): void {\n const newConfig = { ...DEFAULT_CONFIG, ...config };\n super.setConfig(newConfig);\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.setConfig(newConfig);\n this.instrumentationV4_V5.setConfig(newConfig);\n }\n\n init() {}\n\n override getModuleDefinitions() {\n return [...this.instrumentationV2_V3.getModuleDefinitions(), ...this.instrumentationV4_V5.getModuleDefinitions()];\n }\n\n override setTracerProvider(tracerProvider: TracerProvider): void {\n super.setTracerProvider(tracerProvider);\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.setTracerProvider(tracerProvider);\n this.instrumentationV4_V5.setTracerProvider(tracerProvider);\n }\n\n override enable(): void {\n super.enable();\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.enable();\n this.instrumentationV4_V5.enable();\n }\n\n override disable(): void {\n super.disable();\n if (!this.initialized) {\n return;\n }\n this.instrumentationV2_V3.disable();\n this.instrumentationV4_V5.disable();\n }\n}\n"],"names":["SemconvStability","ATTR_DB_SYSTEM","DB_SYSTEM_VALUE_REDIS","ATTR_NET_PEER_NAME","ATTR_NET_PEER_PORT","ATTR_DB_CONNECTION_STRING","ATTR_DB_SYSTEM_NAME","DB_SYSTEM_NAME_VALUE_REDIS","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","SpanStatusCode","context","InstrumentationBase","semconvStabilityFromStr","InstrumentationNodeModuleDefinition","isWrapped","instrumentation","trace","defaultDbStatementSerializer","ATTR_DB_STATEMENT","ATTR_DB_OPERATION_NAME","ATTR_DB_QUERY_TEXT","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SpanKind","safeExecuteInTheMiddle","InstrumentationNodeModuleFile"],"mappings":"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"}
@@ -76,9 +76,9 @@ function cleanupToolCallSpanContexts(content) {
76
76
  }
77
77
  }
78
78
  }
79
- function determineRecordingSettings(integrationRecordingOptions, methodTelemetryOptions, telemetryExplicitlyEnabled, defaultRecordingEnabled) {
80
- const recordInputs = integrationRecordingOptions?.recordInputs !== void 0 ? integrationRecordingOptions.recordInputs : methodTelemetryOptions.recordInputs !== void 0 ? methodTelemetryOptions.recordInputs : telemetryExplicitlyEnabled === true ? true : defaultRecordingEnabled;
81
- const recordOutputs = integrationRecordingOptions?.recordOutputs !== void 0 ? integrationRecordingOptions.recordOutputs : methodTelemetryOptions.recordOutputs !== void 0 ? methodTelemetryOptions.recordOutputs : telemetryExplicitlyEnabled === true ? true : defaultRecordingEnabled;
79
+ function determineRecordingSettings(integrationRecordingOptions, methodTelemetryOptions, telemetryExplicitlyEnabled, defaultInputsEnabled, defaultOutputsEnabled) {
80
+ const recordInputs = integrationRecordingOptions?.recordInputs !== void 0 ? integrationRecordingOptions.recordInputs : methodTelemetryOptions.recordInputs !== void 0 ? methodTelemetryOptions.recordInputs : telemetryExplicitlyEnabled === true ? true : defaultInputsEnabled;
81
+ const recordOutputs = integrationRecordingOptions?.recordOutputs !== void 0 ? integrationRecordingOptions.recordOutputs : methodTelemetryOptions.recordOutputs !== void 0 ? methodTelemetryOptions.recordOutputs : telemetryExplicitlyEnabled === true ? true : defaultOutputsEnabled;
82
82
  return { recordInputs, recordOutputs };
83
83
  }
84
84
  class SentryVercelAiInstrumentation extends instrumentation.InstrumentationBase {
@@ -120,12 +120,13 @@ class SentryVercelAiInstrumentation extends instrumentation.InstrumentationBase
120
120
  const client = core.getClient();
121
121
  const integration = client?.getIntegrationByName(constants.INTEGRATION_NAME);
122
122
  const integrationOptions = integration?.options;
123
- const shouldRecordInputsAndOutputs = integration ? Boolean(client?.getOptions().sendDefaultPii) : false;
123
+ const genAI = integration ? client?.getDataCollectionOptions().genAI : void 0;
124
124
  const { recordInputs, recordOutputs } = determineRecordingSettings(
125
125
  integrationOptions,
126
126
  existingExperimentalTelemetry,
127
127
  isEnabled,
128
- shouldRecordInputsAndOutputs
128
+ Boolean(genAI?.inputs),
129
+ Boolean(genAI?.outputs)
129
130
  );
130
131
  args[0].experimental_telemetry = {
131
132
  ...existingExperimentalTelemetry,
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sources":["../../../../../src/integrations/tracing/vercelai/instrumentation.ts"],"sourcesContent":["import type { InstrumentationConfig, InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n _INTERNAL_cleanupToolCallSpanContext,\n _INTERNAL_getSpanContextForToolCallId,\n addNonEnumerableProperty,\n captureException,\n getActiveSpan,\n getClient,\n handleCallbackErrors,\n SDK_VERSION,\n withScope,\n} from '@sentry/core';\nimport { INTEGRATION_NAME } from './constants';\nimport type { TelemetrySettings, VercelAiIntegration } from './types';\n\nconst SUPPORTED_VERSIONS = ['>=3.0.0 <7'];\n\n// List of patched methods\n// From: https://sdk.vercel.ai/docs/ai-sdk-core/telemetry#collected-data\nconst INSTRUMENTED_METHODS = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n 'rerank',\n] as const;\n\ninterface MethodFirstArg extends Record<string, unknown> {\n experimental_telemetry?: TelemetrySettings;\n}\n\ntype MethodArgs = [MethodFirstArg, ...unknown[]];\n\ntype PatchedModuleExports = Record<(typeof INSTRUMENTED_METHODS)[number], (...args: MethodArgs) => unknown> &\n Record<string, unknown>;\n\ninterface RecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\ninterface ToolError {\n type: 'tool-error' | 'tool-result' | 'tool-call';\n toolCallId: string;\n toolName: string;\n input?: {\n [key: string]: unknown;\n };\n error: Error;\n dynamic?: boolean;\n}\n\nfunction isToolError(obj: unknown): obj is ToolError {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const candidate = obj as Record<string, unknown>;\n return (\n 'type' in candidate &&\n 'error' in candidate &&\n 'toolName' in candidate &&\n 'toolCallId' in candidate &&\n candidate.type === 'tool-error' &&\n candidate.error instanceof Error\n );\n}\n\n/**\n * Process tool call results: capture tool errors and clean up span context mappings.\n *\n * Error checking runs first (needs span context for linking), then cleanup removes all entries.\n * Tool errors are not rejected in Vercel AI V5 — they appear as metadata in the result content.\n */\nexport function processToolCallResults(result: unknown): void {\n if (typeof result !== 'object' || result === null || !('content' in result)) {\n return;\n }\n\n const resultObj = result as { content: Array<object> };\n if (!Array.isArray(resultObj.content)) {\n return;\n }\n\n captureToolErrors(resultObj.content);\n cleanupToolCallSpanContexts(resultObj.content);\n}\n\nfunction captureToolErrors(content: Array<object>): void {\n for (const item of content) {\n if (!isToolError(item)) {\n continue;\n }\n\n // Try to get the span context associated with this tool call ID\n const spanContext = _INTERNAL_getSpanContextForToolCallId(item.toolCallId);\n\n if (spanContext) {\n // We have the span context, so link the error using span and trace IDs\n withScope(scope => {\n scope.setContext('trace', {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n });\n\n scope.setTag('vercel.ai.tool.name', item.toolName);\n scope.setTag('vercel.ai.tool.callId', item.toolCallId);\n scope.setLevel('error');\n\n captureException(item.error, {\n mechanism: {\n type: 'auto.vercelai.otel',\n handled: false,\n },\n });\n });\n } else {\n // Fallback: capture without span linking\n withScope(scope => {\n scope.setTag('vercel.ai.tool.name', item.toolName);\n scope.setTag('vercel.ai.tool.callId', item.toolCallId);\n scope.setLevel('error');\n\n captureException(item.error, {\n mechanism: {\n type: 'auto.vercelai.otel',\n handled: false,\n },\n });\n });\n }\n }\n}\n\n/**\n * Remove span context entries for all completed tool calls in the content array.\n */\nexport function cleanupToolCallSpanContexts(content: Array<object>): void {\n for (const item of content) {\n if (\n typeof item === 'object' &&\n item !== null &&\n 'toolCallId' in item &&\n typeof (item as Record<string, unknown>).toolCallId === 'string'\n ) {\n _INTERNAL_cleanupToolCallSpanContext((item as Record<string, unknown>).toolCallId as string);\n }\n }\n}\n\n/**\n * Determines whether to record inputs and outputs for Vercel AI telemetry based on the configuration hierarchy.\n *\n * The order of precedence is:\n * 1. The vercel ai integration options\n * 2. The experimental_telemetry options in the vercel ai method calls\n * 3. When telemetry is explicitly enabled (isEnabled: true), default to recording\n * 4. Otherwise, use the sendDefaultPii option from client options\n */\nexport function determineRecordingSettings(\n integrationRecordingOptions: RecordingOptions | undefined,\n methodTelemetryOptions: RecordingOptions,\n telemetryExplicitlyEnabled: boolean | undefined,\n defaultRecordingEnabled: boolean,\n): { recordInputs: boolean; recordOutputs: boolean } {\n const recordInputs =\n integrationRecordingOptions?.recordInputs !== undefined\n ? integrationRecordingOptions.recordInputs\n : methodTelemetryOptions.recordInputs !== undefined\n ? methodTelemetryOptions.recordInputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n const recordOutputs =\n integrationRecordingOptions?.recordOutputs !== undefined\n ? integrationRecordingOptions.recordOutputs\n : methodTelemetryOptions.recordOutputs !== undefined\n ? methodTelemetryOptions.recordOutputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultRecordingEnabled;\n\n return { recordInputs, recordOutputs };\n}\n\n/**\n * This detects is added by the Sentry Vercel AI Integration to detect if the integration should\n * be enabled.\n *\n * It also patches the `ai` module to enable Vercel AI telemetry automatically for all methods.\n */\nexport class SentryVercelAiInstrumentation extends InstrumentationBase {\n private _isPatched = false;\n private _callbacks: (() => void)[] = [];\n\n public constructor(config: InstrumentationConfig = {}) {\n super('@sentry/instrumentation-vercel-ai', SDK_VERSION, config);\n }\n\n /**\n * Initializes the instrumentation by defining the modules to be patched.\n */\n public init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition('ai', SUPPORTED_VERSIONS, this._patch.bind(this));\n return module;\n }\n\n /**\n * Call the provided callback when the module is patched.\n * If it has already been patched, the callback will be called immediately.\n */\n public callWhenPatched(callback: () => void): void {\n if (this._isPatched) {\n callback();\n } else {\n this._callbacks.push(callback);\n }\n }\n\n /**\n * Patches module exports to enable Vercel AI telemetry.\n */\n private _patch(moduleExports: PatchedModuleExports): unknown {\n this._isPatched = true;\n\n this._callbacks.forEach(callback => callback());\n this._callbacks = [];\n\n const generatePatch = <T extends (...args: MethodArgs) => unknown>(originalMethod: T): T => {\n return new Proxy(originalMethod, {\n apply: (target, thisArg, args: MethodArgs) => {\n const existingExperimentalTelemetry = args[0].experimental_telemetry || {};\n const isEnabled = existingExperimentalTelemetry.isEnabled;\n\n const client = getClient();\n const integration = client?.getIntegrationByName<VercelAiIntegration>(INTEGRATION_NAME);\n const integrationOptions = integration?.options;\n const shouldRecordInputsAndOutputs = integration ? Boolean(client?.getOptions().sendDefaultPii) : false;\n\n const { recordInputs, recordOutputs } = determineRecordingSettings(\n integrationOptions,\n existingExperimentalTelemetry,\n isEnabled,\n shouldRecordInputsAndOutputs,\n );\n\n args[0].experimental_telemetry = {\n ...existingExperimentalTelemetry,\n isEnabled: isEnabled !== undefined ? isEnabled : true,\n recordInputs,\n recordOutputs,\n };\n\n return handleCallbackErrors(\n () => Reflect.apply(target, thisArg, args),\n error => {\n // This error bubbles up to unhandledrejection handler (if not handled before),\n // where we do not know the active span anymore\n // So to circumvent this, we set the active span on the error object\n // which is picked up by the unhandledrejection handler\n if (error && typeof error === 'object') {\n addNonEnumerableProperty(error, '_sentry_active_span', getActiveSpan());\n }\n },\n () => {},\n result => {\n processToolCallResults(result);\n },\n );\n },\n });\n };\n\n // Is this an ESM module?\n // https://tc39.es/ecma262/#sec-module-namespace-objects\n if (Object.prototype.toString.call(moduleExports) === '[object Module]') {\n // In ESM we take the usual route and just replace the exports we want to instrument\n for (const method of INSTRUMENTED_METHODS) {\n // Skip methods that don't exist in this version of the AI SDK (e.g., rerank was added in v6)\n if (moduleExports[method] != null) {\n moduleExports[method] = generatePatch(moduleExports[method]);\n }\n }\n\n return moduleExports;\n } else {\n // In CJS we can't replace the exports in the original module because they\n // don't have setters, so we create a new object with the same properties\n const patchedModuleExports = INSTRUMENTED_METHODS.reduce((acc, curr) => {\n // Skip methods that don't exist in this version of the AI SDK (e.g., rerank was added in v6)\n if (moduleExports[curr] != null) {\n acc[curr] = generatePatch(moduleExports[curr]);\n }\n return acc;\n }, {} as PatchedModuleExports);\n\n return { ...moduleExports, ...patchedModuleExports };\n }\n }\n}\n"],"names":["_INTERNAL_getSpanContextForToolCallId","withScope","captureException","_INTERNAL_cleanupToolCallSpanContext","InstrumentationBase","SDK_VERSION","InstrumentationNodeModuleDefinition","getClient","INTEGRATION_NAME","handleCallbackErrors","addNonEnumerableProperty","getActiveSpan"],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","sources":["../../../../../src/integrations/tracing/vercelai/instrumentation.ts"],"sourcesContent":["import type { InstrumentationConfig, InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n _INTERNAL_cleanupToolCallSpanContext,\n _INTERNAL_getSpanContextForToolCallId,\n addNonEnumerableProperty,\n captureException,\n getActiveSpan,\n getClient,\n handleCallbackErrors,\n SDK_VERSION,\n withScope,\n} from '@sentry/core';\nimport { INTEGRATION_NAME } from './constants';\nimport type { TelemetrySettings, VercelAiIntegration } from './types';\n\nconst SUPPORTED_VERSIONS = ['>=3.0.0 <7'];\n\n// List of patched methods\n// From: https://sdk.vercel.ai/docs/ai-sdk-core/telemetry#collected-data\nconst INSTRUMENTED_METHODS = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n 'rerank',\n] as const;\n\ninterface MethodFirstArg extends Record<string, unknown> {\n experimental_telemetry?: TelemetrySettings;\n}\n\ntype MethodArgs = [MethodFirstArg, ...unknown[]];\n\ntype PatchedModuleExports = Record<(typeof INSTRUMENTED_METHODS)[number], (...args: MethodArgs) => unknown> &\n Record<string, unknown>;\n\ninterface RecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\ninterface ToolError {\n type: 'tool-error' | 'tool-result' | 'tool-call';\n toolCallId: string;\n toolName: string;\n input?: {\n [key: string]: unknown;\n };\n error: Error;\n dynamic?: boolean;\n}\n\nfunction isToolError(obj: unknown): obj is ToolError {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const candidate = obj as Record<string, unknown>;\n return (\n 'type' in candidate &&\n 'error' in candidate &&\n 'toolName' in candidate &&\n 'toolCallId' in candidate &&\n candidate.type === 'tool-error' &&\n candidate.error instanceof Error\n );\n}\n\n/**\n * Process tool call results: capture tool errors and clean up span context mappings.\n *\n * Error checking runs first (needs span context for linking), then cleanup removes all entries.\n * Tool errors are not rejected in Vercel AI V5 — they appear as metadata in the result content.\n */\nexport function processToolCallResults(result: unknown): void {\n if (typeof result !== 'object' || result === null || !('content' in result)) {\n return;\n }\n\n const resultObj = result as { content: Array<object> };\n if (!Array.isArray(resultObj.content)) {\n return;\n }\n\n captureToolErrors(resultObj.content);\n cleanupToolCallSpanContexts(resultObj.content);\n}\n\nfunction captureToolErrors(content: Array<object>): void {\n for (const item of content) {\n if (!isToolError(item)) {\n continue;\n }\n\n // Try to get the span context associated with this tool call ID\n const spanContext = _INTERNAL_getSpanContextForToolCallId(item.toolCallId);\n\n if (spanContext) {\n // We have the span context, so link the error using span and trace IDs\n withScope(scope => {\n scope.setContext('trace', {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n });\n\n scope.setTag('vercel.ai.tool.name', item.toolName);\n scope.setTag('vercel.ai.tool.callId', item.toolCallId);\n scope.setLevel('error');\n\n captureException(item.error, {\n mechanism: {\n type: 'auto.vercelai.otel',\n handled: false,\n },\n });\n });\n } else {\n // Fallback: capture without span linking\n withScope(scope => {\n scope.setTag('vercel.ai.tool.name', item.toolName);\n scope.setTag('vercel.ai.tool.callId', item.toolCallId);\n scope.setLevel('error');\n\n captureException(item.error, {\n mechanism: {\n type: 'auto.vercelai.otel',\n handled: false,\n },\n });\n });\n }\n }\n}\n\n/**\n * Remove span context entries for all completed tool calls in the content array.\n */\nexport function cleanupToolCallSpanContexts(content: Array<object>): void {\n for (const item of content) {\n if (\n typeof item === 'object' &&\n item !== null &&\n 'toolCallId' in item &&\n typeof (item as Record<string, unknown>).toolCallId === 'string'\n ) {\n _INTERNAL_cleanupToolCallSpanContext((item as Record<string, unknown>).toolCallId as string);\n }\n }\n}\n\n/**\n * Determines whether to record inputs and outputs for Vercel AI telemetry based on the configuration hierarchy.\n *\n * The order of precedence is:\n * 1. The vercel ai integration options\n * 2. The experimental_telemetry options in the vercel ai method calls\n * 3. When telemetry is explicitly enabled (isEnabled: true), default to recording\n * 4. Otherwise, use the dataCollection.genAI settings from client options\n */\nexport function determineRecordingSettings(\n integrationRecordingOptions: RecordingOptions | undefined,\n methodTelemetryOptions: RecordingOptions,\n telemetryExplicitlyEnabled: boolean | undefined,\n defaultInputsEnabled: boolean,\n defaultOutputsEnabled: boolean,\n): { recordInputs: boolean; recordOutputs: boolean } {\n const recordInputs =\n integrationRecordingOptions?.recordInputs !== undefined\n ? integrationRecordingOptions.recordInputs\n : methodTelemetryOptions.recordInputs !== undefined\n ? methodTelemetryOptions.recordInputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording inputs\n : defaultInputsEnabled;\n\n const recordOutputs =\n integrationRecordingOptions?.recordOutputs !== undefined\n ? integrationRecordingOptions.recordOutputs\n : methodTelemetryOptions.recordOutputs !== undefined\n ? methodTelemetryOptions.recordOutputs\n : telemetryExplicitlyEnabled === true\n ? true // When telemetry is explicitly enabled, default to recording outputs\n : defaultOutputsEnabled;\n\n return { recordInputs, recordOutputs };\n}\n\n/**\n * This detects is added by the Sentry Vercel AI Integration to detect if the integration should\n * be enabled.\n *\n * It also patches the `ai` module to enable Vercel AI telemetry automatically for all methods.\n */\nexport class SentryVercelAiInstrumentation extends InstrumentationBase {\n private _isPatched = false;\n private _callbacks: (() => void)[] = [];\n\n public constructor(config: InstrumentationConfig = {}) {\n super('@sentry/instrumentation-vercel-ai', SDK_VERSION, config);\n }\n\n /**\n * Initializes the instrumentation by defining the modules to be patched.\n */\n public init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition('ai', SUPPORTED_VERSIONS, this._patch.bind(this));\n return module;\n }\n\n /**\n * Call the provided callback when the module is patched.\n * If it has already been patched, the callback will be called immediately.\n */\n public callWhenPatched(callback: () => void): void {\n if (this._isPatched) {\n callback();\n } else {\n this._callbacks.push(callback);\n }\n }\n\n /**\n * Patches module exports to enable Vercel AI telemetry.\n */\n private _patch(moduleExports: PatchedModuleExports): unknown {\n this._isPatched = true;\n\n this._callbacks.forEach(callback => callback());\n this._callbacks = [];\n\n const generatePatch = <T extends (...args: MethodArgs) => unknown>(originalMethod: T): T => {\n return new Proxy(originalMethod, {\n apply: (target, thisArg, args: MethodArgs) => {\n const existingExperimentalTelemetry = args[0].experimental_telemetry || {};\n const isEnabled = existingExperimentalTelemetry.isEnabled;\n\n const client = getClient();\n const integration = client?.getIntegrationByName<VercelAiIntegration>(INTEGRATION_NAME);\n const integrationOptions = integration?.options;\n const genAI = integration ? client?.getDataCollectionOptions().genAI : undefined;\n\n const { recordInputs, recordOutputs } = determineRecordingSettings(\n integrationOptions,\n existingExperimentalTelemetry,\n isEnabled,\n Boolean(genAI?.inputs),\n Boolean(genAI?.outputs),\n );\n\n args[0].experimental_telemetry = {\n ...existingExperimentalTelemetry,\n isEnabled: isEnabled !== undefined ? isEnabled : true,\n recordInputs,\n recordOutputs,\n };\n\n return handleCallbackErrors(\n () => Reflect.apply(target, thisArg, args),\n error => {\n // This error bubbles up to unhandledrejection handler (if not handled before),\n // where we do not know the active span anymore\n // So to circumvent this, we set the active span on the error object\n // which is picked up by the unhandledrejection handler\n if (error && typeof error === 'object') {\n addNonEnumerableProperty(error, '_sentry_active_span', getActiveSpan());\n }\n },\n () => {},\n result => {\n processToolCallResults(result);\n },\n );\n },\n });\n };\n\n // Is this an ESM module?\n // https://tc39.es/ecma262/#sec-module-namespace-objects\n if (Object.prototype.toString.call(moduleExports) === '[object Module]') {\n // In ESM we take the usual route and just replace the exports we want to instrument\n for (const method of INSTRUMENTED_METHODS) {\n // Skip methods that don't exist in this version of the AI SDK (e.g., rerank was added in v6)\n if (moduleExports[method] != null) {\n moduleExports[method] = generatePatch(moduleExports[method]);\n }\n }\n\n return moduleExports;\n } else {\n // In CJS we can't replace the exports in the original module because they\n // don't have setters, so we create a new object with the same properties\n const patchedModuleExports = INSTRUMENTED_METHODS.reduce((acc, curr) => {\n // Skip methods that don't exist in this version of the AI SDK (e.g., rerank was added in v6)\n if (moduleExports[curr] != null) {\n acc[curr] = generatePatch(moduleExports[curr]);\n }\n return acc;\n }, {} as PatchedModuleExports);\n\n return { ...moduleExports, ...patchedModuleExports };\n }\n }\n}\n"],"names":["_INTERNAL_getSpanContextForToolCallId","withScope","captureException","_INTERNAL_cleanupToolCallSpanContext","InstrumentationBase","SDK_VERSION","InstrumentationNodeModuleDefinition","getClient","INTEGRATION_NAME","handleCallbackErrors","addNonEnumerableProperty","getActiveSpan"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const core = require('@sentry/core');
4
+
5
+ function setHttpServerSpanRouteAttribute(route) {
6
+ const activeSpan = core.getActiveSpan();
7
+ if (!activeSpan) {
8
+ return;
9
+ }
10
+ const rootSpan = core.getRootSpan(activeSpan);
11
+ if (!rootSpan) {
12
+ return;
13
+ }
14
+ if (core.spanToJSON(rootSpan).data[core.SEMANTIC_ATTRIBUTE_SENTRY_OP] !== "http.server") {
15
+ return;
16
+ }
17
+ rootSpan.setAttribute("http.route", route);
18
+ }
19
+
20
+ exports.setHttpServerSpanRouteAttribute = setHttpServerSpanRouteAttribute;
21
+ //# sourceMappingURL=setHttpServerSpanRouteAttribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setHttpServerSpanRouteAttribute.js","sources":["../../../src/utils/setHttpServerSpanRouteAttribute.ts"],"sourcesContent":["import { getActiveSpan, getRootSpan, SEMANTIC_ATTRIBUTE_SENTRY_OP, spanToJSON } from '@sentry/core';\n\n/**\n * Set the `http.route` attribute on the root HTTP server span for the current trace.\n *\n * No-op when there is no active span, no root span, or the root span is not an\n * `http.server` span — so framework instrumentations can call this unconditionally\n * without risking attribute pollution on non-HTTP root spans.\n */\nexport function setHttpServerSpanRouteAttribute(route: string): void {\n const activeSpan = getActiveSpan();\n if (!activeSpan) {\n return;\n }\n const rootSpan = getRootSpan(activeSpan);\n if (!rootSpan) {\n return;\n }\n if (spanToJSON(rootSpan).data[SEMANTIC_ATTRIBUTE_SENTRY_OP] !== 'http.server') {\n return;\n }\n rootSpan.setAttribute('http.route', route);\n}\n"],"names":["getActiveSpan","getRootSpan","spanToJSON","SEMANTIC_ATTRIBUTE_SENTRY_OP"],"mappings":";;;;AASO,SAAS,gCAAgC,KAAA,EAAqB;AACnE,EAAA,MAAM,aAAaA,kBAAA,EAAc;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAWC,iBAAY,UAAU,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA;AAAA,EACF;AACA,EAAA,IAAIC,gBAAW,QAAQ,CAAA,CAAE,IAAA,CAAKC,iCAA4B,MAAM,aAAA,EAAe;AAC7E,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,KAAK,CAAA;AAC3C;;;;"}
@@ -2,9 +2,8 @@ import * as diagch from 'diagnostics_channel';
2
2
  import { URL } from 'url';
3
3
  import { InstrumentationBase, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
4
4
  import { ValueType, context, trace, INVALID_SPAN_CONTEXT, SpanKind, propagation, SpanStatusCode } from '@opentelemetry/api';
5
- import { hrTime, hrTimeToMilliseconds, hrTimeDuration } from '@opentelemetry/core';
6
5
  import { METRIC_HTTP_CLIENT_REQUEST_DURATION, ATTR_URL_QUERY, ATTR_URL_PATH, ATTR_URL_FULL, ATTR_HTTP_REQUEST_METHOD_ORIGINAL, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_ERROR_TYPE, ATTR_HTTP_REQUEST_METHOD, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_SCHEME, ATTR_USER_AGENT_ORIGINAL, ATTR_NETWORK_PEER_PORT, ATTR_NETWORK_PEER_ADDRESS } from '@opentelemetry/semantic-conventions';
7
- import { SDK_VERSION } from '@sentry/core';
6
+ import { SDK_VERSION, timestampInSeconds } from '@sentry/core';
8
7
 
9
8
  const PACKAGE_NAME = "@sentry/instrumentation-undici";
10
9
  class UndiciInstrumentation extends InstrumentationBase {
@@ -108,7 +107,7 @@ class UndiciInstrumentation extends InstrumentationBase {
108
107
  if (shouldIgnoreReq) {
109
108
  return;
110
109
  }
111
- const startTime = hrTime();
110
+ const startTime = timestampInSeconds();
112
111
  let requestUrl;
113
112
  try {
114
113
  requestUrl = new URL(request.path, request.origin);
@@ -310,7 +309,7 @@ class UndiciInstrumentation extends InstrumentationBase {
310
309
  metricsAttributes[key] = attributes[key];
311
310
  }
312
311
  });
313
- const durationSeconds = hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1e3;
312
+ const durationSeconds = timestampInSeconds() - startTime;
314
313
  this._httpClientDurationHistogram.record(durationSeconds, metricsAttributes);
315
314
  }
316
315
  getRequestMethod(original) {