@sentry/node 10.60.0 → 10.62.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 (182) hide show
  1. package/build/cjs/index.js +2 -0
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/cjs/integrations/fs/index.js +8 -17
  4. package/build/cjs/integrations/fs/index.js.map +1 -1
  5. package/build/cjs/integrations/fs/vendored/instrumentation.js +110 -161
  6. package/build/cjs/integrations/fs/vendored/instrumentation.js.map +1 -1
  7. package/build/cjs/integrations/node-fetch/vendored/undici.js +1 -2
  8. package/build/cjs/integrations/node-fetch/vendored/undici.js.map +1 -1
  9. package/build/cjs/integrations/tracing/amqplib/index.js +2 -10
  10. package/build/cjs/integrations/tracing/amqplib/index.js.map +1 -1
  11. package/build/cjs/integrations/tracing/amqplib/vendored/instrumentation.js +117 -0
  12. package/build/cjs/integrations/tracing/amqplib/vendored/instrumentation.js.map +1 -0
  13. package/build/cjs/integrations/tracing/amqplib/vendored/patches.js +185 -0
  14. package/build/cjs/integrations/tracing/amqplib/vendored/patches.js.map +1 -0
  15. package/build/cjs/integrations/tracing/amqplib/vendored/semconv.js +21 -1
  16. package/build/cjs/integrations/tracing/amqplib/vendored/semconv.js.map +1 -1
  17. package/build/cjs/integrations/tracing/amqplib/vendored/types.js +0 -6
  18. package/build/cjs/integrations/tracing/amqplib/vendored/types.js.map +1 -1
  19. package/build/cjs/integrations/tracing/amqplib/vendored/utils.js +71 -80
  20. package/build/cjs/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  21. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js +5 -6
  22. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  23. package/build/cjs/integrations/tracing/firebase/firebase.js +1 -24
  24. package/build/cjs/integrations/tracing/firebase/firebase.js.map +1 -1
  25. package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js +3 -11
  26. package/build/cjs/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -1
  27. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js +33 -72
  28. package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  29. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js +46 -105
  30. package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  31. package/build/cjs/integrations/tracing/kafka/vendored/utils.js +2 -2
  32. package/build/cjs/integrations/tracing/kafka/vendored/utils.js.map +1 -1
  33. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js +1 -2
  34. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  35. package/build/cjs/integrations/tracing/mongo/vendored/utils.js +1 -2
  36. package/build/cjs/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  37. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js +1 -2
  38. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  39. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js +1 -2
  40. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  41. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js +2 -3
  42. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  43. package/build/cjs/integrations/tracing/postgres/vendored/utils.js +1 -2
  44. package/build/cjs/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  45. package/build/cjs/integrations/tracing/redis/index.js +6 -2
  46. package/build/cjs/integrations/tracing/redis/index.js.map +1 -1
  47. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +2 -3
  48. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  49. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +3 -4
  50. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  51. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js +1 -2
  52. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  53. package/build/cjs/integrations/tracing/vercelai/index.js +3 -0
  54. package/build/cjs/integrations/tracing/vercelai/index.js.map +1 -1
  55. package/build/esm/index.js +1 -1
  56. package/build/esm/integrations/fs/index.js +9 -18
  57. package/build/esm/integrations/fs/index.js.map +1 -1
  58. package/build/esm/integrations/fs/vendored/instrumentation.js +111 -162
  59. package/build/esm/integrations/fs/vendored/instrumentation.js.map +1 -1
  60. package/build/esm/integrations/node-fetch/vendored/undici.js +2 -3
  61. package/build/esm/integrations/node-fetch/vendored/undici.js.map +1 -1
  62. package/build/esm/integrations/tracing/amqplib/index.js +3 -11
  63. package/build/esm/integrations/tracing/amqplib/index.js.map +1 -1
  64. package/build/esm/integrations/tracing/amqplib/vendored/instrumentation.js +115 -0
  65. package/build/esm/integrations/tracing/amqplib/vendored/instrumentation.js.map +1 -0
  66. package/build/esm/integrations/tracing/amqplib/vendored/patches.js +177 -0
  67. package/build/esm/integrations/tracing/amqplib/vendored/patches.js.map +1 -0
  68. package/build/esm/integrations/tracing/amqplib/vendored/semconv.js +12 -2
  69. package/build/esm/integrations/tracing/amqplib/vendored/semconv.js.map +1 -1
  70. package/build/esm/integrations/tracing/amqplib/vendored/types.js +1 -6
  71. package/build/esm/integrations/tracing/amqplib/vendored/types.js.map +1 -1
  72. package/build/esm/integrations/tracing/amqplib/vendored/utils.js +68 -78
  73. package/build/esm/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
  74. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js +6 -7
  75. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  76. package/build/esm/integrations/tracing/firebase/firebase.js +3 -26
  77. package/build/esm/integrations/tracing/firebase/firebase.js.map +1 -1
  78. package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js +3 -11
  79. package/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js.map +1 -1
  80. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js +34 -73
  81. package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
  82. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js +47 -106
  83. package/build/esm/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
  84. package/build/esm/integrations/tracing/kafka/vendored/utils.js +4 -4
  85. package/build/esm/integrations/tracing/kafka/vendored/utils.js.map +1 -1
  86. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js +2 -3
  87. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  88. package/build/esm/integrations/tracing/mongo/vendored/utils.js +2 -3
  89. package/build/esm/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  90. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js +2 -3
  91. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  92. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js +2 -3
  93. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  94. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js +3 -4
  95. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  96. package/build/esm/integrations/tracing/postgres/vendored/utils.js +2 -3
  97. package/build/esm/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  98. package/build/esm/integrations/tracing/redis/index.js +6 -2
  99. package/build/esm/integrations/tracing/redis/index.js.map +1 -1
  100. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +3 -4
  101. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  102. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +4 -5
  103. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  104. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js +2 -3
  105. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  106. package/build/esm/integrations/tracing/vercelai/index.js +3 -0
  107. package/build/esm/integrations/tracing/vercelai/index.js.map +1 -1
  108. package/build/esm/package.json +1 -1
  109. package/build/types/index.d.ts +1 -1
  110. package/build/types/index.d.ts.map +1 -1
  111. package/build/types/integrations/fs/index.d.ts +2 -14
  112. package/build/types/integrations/fs/index.d.ts.map +1 -1
  113. package/build/types/integrations/fs/vendored/instrumentation.d.ts +2 -10
  114. package/build/types/integrations/fs/vendored/instrumentation.d.ts.map +1 -1
  115. package/build/types/integrations/fs/vendored/types.d.ts +1 -2
  116. package/build/types/integrations/fs/vendored/types.d.ts.map +1 -1
  117. package/build/types/integrations/node-fetch/vendored/undici.d.ts.map +1 -1
  118. package/build/types/integrations/tracing/amqplib/index.d.ts +1 -1
  119. package/build/types/integrations/tracing/amqplib/index.d.ts.map +1 -1
  120. package/build/types/integrations/tracing/amqplib/vendored/instrumentation.d.ts +11 -0
  121. package/build/types/integrations/tracing/amqplib/vendored/instrumentation.d.ts.map +1 -0
  122. package/build/types/integrations/tracing/amqplib/vendored/patches.d.ts +11 -0
  123. package/build/types/integrations/tracing/amqplib/vendored/patches.d.ts.map +1 -0
  124. package/build/types/integrations/tracing/amqplib/vendored/semconv.d.ts +25 -37
  125. package/build/types/integrations/tracing/amqplib/vendored/semconv.d.ts.map +1 -1
  126. package/build/types/integrations/tracing/amqplib/vendored/types.d.ts +0 -81
  127. package/build/types/integrations/tracing/amqplib/vendored/types.d.ts.map +1 -1
  128. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts +16 -9
  129. package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts.map +1 -1
  130. package/build/types/integrations/tracing/dataloader/vendored/instrumentation.d.ts.map +1 -1
  131. package/build/types/integrations/tracing/firebase/firebase.d.ts.map +1 -1
  132. package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +4 -9
  133. package/build/types/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts.map +1 -1
  134. package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts +2 -5
  135. package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts.map +1 -1
  136. package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts +3 -8
  137. package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts.map +1 -1
  138. package/build/types/integrations/tracing/firebase/otel/types.d.ts +0 -20
  139. package/build/types/integrations/tracing/firebase/otel/types.d.ts.map +1 -1
  140. package/build/types/integrations/tracing/kafka/vendored/utils.d.ts.map +1 -1
  141. package/build/types/integrations/tracing/knex/vendored/instrumentation.d.ts.map +1 -1
  142. package/build/types/integrations/tracing/mongo/vendored/utils.d.ts.map +1 -1
  143. package/build/types/integrations/tracing/mongoose/vendored/mongoose.d.ts.map +1 -1
  144. package/build/types/integrations/tracing/mysql2/vendored/instrumentation.d.ts.map +1 -1
  145. package/build/types/integrations/tracing/postgres/vendored/instrumentation.d.ts.map +1 -1
  146. package/build/types/integrations/tracing/postgres/vendored/utils.d.ts.map +1 -1
  147. package/build/types/integrations/tracing/redis/index.d.ts.map +1 -1
  148. package/build/types/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts.map +1 -1
  149. package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -1
  150. package/build/types/integrations/tracing/tedious/vendored/instrumentation.d.ts.map +1 -1
  151. package/build/types/integrations/tracing/vercelai/index.d.ts +0 -1
  152. package/build/types/integrations/tracing/vercelai/index.d.ts.map +1 -1
  153. package/build/types-ts3.8/index.d.ts +1 -1
  154. package/build/types-ts3.8/integrations/fs/index.d.ts +2 -14
  155. package/build/types-ts3.8/integrations/fs/vendored/instrumentation.d.ts +2 -10
  156. package/build/types-ts3.8/integrations/fs/vendored/types.d.ts +1 -2
  157. package/build/types-ts3.8/integrations/tracing/amqplib/index.d.ts +1 -1
  158. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/instrumentation.d.ts +11 -0
  159. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/patches.d.ts +11 -0
  160. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/semconv.d.ts +25 -37
  161. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/types.d.ts +0 -81
  162. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/utils.d.ts +16 -9
  163. package/build/types-ts3.8/integrations/tracing/firebase/otel/firebaseInstrumentation.d.ts +4 -9
  164. package/build/types-ts3.8/integrations/tracing/firebase/otel/patches/firestore.d.ts +2 -5
  165. package/build/types-ts3.8/integrations/tracing/firebase/otel/patches/functions.d.ts +3 -8
  166. package/build/types-ts3.8/integrations/tracing/firebase/otel/types.d.ts +0 -20
  167. package/build/types-ts3.8/integrations/tracing/vercelai/index.d.ts +0 -1
  168. package/package.json +5 -5
  169. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js +0 -452
  170. package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js.map +0 -1
  171. package/build/cjs/integrations/tracing/amqplib/vendored/semconv-obsolete.js +0 -24
  172. package/build/cjs/integrations/tracing/amqplib/vendored/semconv-obsolete.js.map +0 -1
  173. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js +0 -450
  174. package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js.map +0 -1
  175. package/build/esm/integrations/tracing/amqplib/vendored/semconv-obsolete.js +0 -13
  176. package/build/esm/integrations/tracing/amqplib/vendored/semconv-obsolete.js.map +0 -1
  177. package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts +0 -26
  178. package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts.map +0 -1
  179. package/build/types/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts +0 -63
  180. package/build/types/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts.map +0 -1
  181. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/amqplib.d.ts +0 -26
  182. package/build/types-ts3.8/integrations/tracing/amqplib/vendored/semconv-obsolete.d.ts +0 -63
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n * - Some types vendored from @types/amqplib with simplifications\n */\n/* eslint-disable */\n\nimport { Context, createContextKey, diag, Span, Attributes, AttributeValue } from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport { ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';\nimport { ATTR_MESSAGING_SYSTEM, ATTR_NET_PEER_NAME, ATTR_NET_PEER_PORT } from './semconv';\nimport { ATTR_MESSAGING_PROTOCOL, ATTR_MESSAGING_PROTOCOL_VERSION, ATTR_MESSAGING_URL } from './semconv-obsolete';\nimport type { Connection, Channel, ConfirmChannel, Options } from './amqplib-types';\nimport type { ConsumeMessage, Message } from './types';\n\nexport const MESSAGE_STORED_SPAN: unique symbol = Symbol('opentelemetry.amqplib.message.stored-span');\nexport const CHANNEL_SPANS_NOT_ENDED: unique symbol = Symbol('opentelemetry.amqplib.channel.spans-not-ended');\nexport const CHANNEL_CONSUME_TIMEOUT_TIMER: unique symbol = Symbol(\n 'opentelemetry.amqplib.channel.consumer-timeout-timer',\n);\nexport const CONNECTION_ATTRIBUTES: unique symbol = Symbol('opentelemetry.amqplib.connection.attributes');\n\nexport type InstrumentationConnection = Connection & {\n [CONNECTION_ATTRIBUTES]?: Attributes;\n};\nexport type InstrumentationPublishChannel = (Channel | ConfirmChannel) & {\n connection: InstrumentationConnection;\n};\nexport type InstrumentationConsumeChannel = Channel & {\n connection: InstrumentationConnection;\n [CHANNEL_SPANS_NOT_ENDED]?: {\n msg: ConsumeMessage;\n timeOfConsume: number;\n }[];\n [CHANNEL_CONSUME_TIMEOUT_TIMER]?: NodeJS.Timeout;\n};\nexport type InstrumentationMessage = Message & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\nexport type InstrumentationConsumeMessage = ConsumeMessage & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\n\nconst IS_CONFIRM_CHANNEL_CONTEXT_KEY: symbol = createContextKey('opentelemetry.amqplib.channel.is-confirm-channel');\n\nexport const normalizeExchange = (exchangeName: string) => (exchangeName !== '' ? exchangeName : '<default>');\n\nconst censorPassword = (url: string): string => {\n return url.replace(/:[^:@/]*@/, ':***@');\n};\n\nconst getPort = (portFromUrl: number | undefined, resolvedProtocol: string): number => {\n // we are using the resolved protocol which is upper case\n // this code mimic the behavior of the amqplib which is used to set connection params\n return portFromUrl || (resolvedProtocol === 'AMQP' ? 5672 : 5671);\n};\n\nconst getProtocol = (protocolFromUrl: string | undefined): string => {\n const resolvedProtocol = protocolFromUrl || 'amqp';\n // the substring removed the ':' part of the protocol ('amqp:' -> 'amqp')\n const noEndingColon = resolvedProtocol.endsWith(':')\n ? resolvedProtocol.substring(0, resolvedProtocol.length - 1)\n : resolvedProtocol;\n // upper cases to match spec\n return noEndingColon.toUpperCase();\n};\n\nconst getHostname = (hostnameFromUrl: string | undefined): string => {\n // if user supplies empty hostname, it gets forwarded to 'net' package which default it to localhost.\n // https://nodejs.org/docs/latest-v12.x/api/net.html#net_socket_connect_options_connectlistener\n return hostnameFromUrl || 'localhost';\n};\n\nconst extractConnectionAttributeOrLog = (\n url: string | Options.Connect,\n attributeKey: string,\n attributeValue: AttributeValue,\n nameForLog: string,\n): Attributes => {\n if (attributeValue) {\n return { [attributeKey]: attributeValue };\n } else {\n diag.error(`amqplib instrumentation: could not extract connection attribute ${nameForLog} from user supplied url`, {\n url,\n });\n return {};\n }\n};\n\nexport const getConnectionAttributesFromServer = (conn: Connection): Attributes => {\n const product = conn.serverProperties.product?.toLowerCase?.();\n if (product) {\n return {\n [ATTR_MESSAGING_SYSTEM]: product,\n };\n } else {\n return {};\n }\n};\n\nexport const getConnectionAttributesFromUrl = (\n url: string | Options.Connect,\n netSemconvStability: SemconvStability,\n): Attributes => {\n const attributes: Attributes = {\n [ATTR_MESSAGING_PROTOCOL_VERSION]: '0.9.1', // this is the only protocol supported by the instrumented library\n };\n\n url = url || 'amqp://localhost';\n if (typeof url === 'object') {\n const connectOptions = url as Options.Connect;\n\n const protocol = getProtocol(connectOptions?.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(connectOptions?.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(connectOptions.port, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_SERVER_PORT, port, 'port'));\n }\n } else {\n const censoredUrl = censorPassword(url);\n attributes[ATTR_MESSAGING_URL] = censoredUrl;\n try {\n const urlParts = new URL(censoredUrl);\n\n const protocol = getProtocol(urlParts.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(urlParts.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(urlParts.port ? parseInt(urlParts.port) : undefined, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_PORT, port, 'port'));\n }\n } catch (err) {\n diag.error('amqplib instrumentation: error while extracting connection details from connection url', {\n censoredUrl,\n err,\n });\n }\n }\n return attributes;\n};\n\nexport const markConfirmChannelTracing = (context: Context) => {\n return context.setValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY, true);\n};\n\nexport const unmarkConfirmChannelTracing = (context: Context) => {\n return context.deleteValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY);\n};\n\nexport const isConfirmChannelTracing = (context: Context) => {\n return context.getValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY) === true;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n * - Some types vendored from @types/amqplib with simplifications\n * - Span creation extracted here and migrated to the @sentry/core API; origin folded into span creation\n * - Cross-service trace propagation uses Sentry's `getTraceData` instead of the OTel propagator\n * - Dropped the env-gated stable-semconv dual emission; only the (default) old semantic conventions are emitted\n * - Replaced the OTel context-key confirm-channel marker with a synchronous flag on the channel instance\n */\n\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Span, SpanAttributes } from '@sentry/core';\nimport { getTraceData, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan } from '@sentry/core';\nimport type { Channel, ConfirmChannel, Connection, Options } from './amqplib-types';\nimport {\n ATTR_MESSAGING_CONVERSATION_ID,\n ATTR_MESSAGING_DESTINATION,\n ATTR_MESSAGING_DESTINATION_KIND,\n ATTR_MESSAGING_OPERATION,\n ATTR_MESSAGING_PROTOCOL,\n ATTR_MESSAGING_PROTOCOL_VERSION,\n ATTR_MESSAGING_RABBITMQ_ROUTING_KEY,\n ATTR_MESSAGING_SYSTEM,\n ATTR_MESSAGING_URL,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n MESSAGING_OPERATION_VALUE_PROCESS,\n OLD_ATTR_MESSAGING_MESSAGE_ID,\n} from './semconv';\nimport type { ConsumeMessage, Message } from './types';\n\nconst PUBLISHER_ORIGIN = 'auto.amqplib.otel.publisher';\nconst CONSUMER_ORIGIN = 'auto.amqplib.otel.consumer';\n\nexport const MESSAGE_STORED_SPAN: unique symbol = Symbol('opentelemetry.amqplib.message.stored-span');\nexport const CHANNEL_SPANS_NOT_ENDED: unique symbol = Symbol('opentelemetry.amqplib.channel.spans-not-ended');\nexport const CHANNEL_CONSUME_TIMEOUT_TIMER: unique symbol = Symbol(\n 'opentelemetry.amqplib.channel.consumer-timeout-timer',\n);\nexport const CONNECTION_ATTRIBUTES: unique symbol = Symbol('opentelemetry.amqplib.connection.attributes');\nexport const CHANNEL_IS_CONFIRM_PUBLISHING: unique symbol = Symbol('sentry.amqplib.channel.is-confirm-publishing');\n\nexport type InstrumentationConnection = Connection & {\n [CONNECTION_ATTRIBUTES]?: SpanAttributes;\n};\nexport type InstrumentationPublishChannel = (Channel | ConfirmChannel) & {\n connection: InstrumentationConnection;\n [CHANNEL_IS_CONFIRM_PUBLISHING]?: boolean;\n};\nexport type InstrumentationConsumeChannel = Channel & {\n connection: InstrumentationConnection;\n [CHANNEL_SPANS_NOT_ENDED]?: {\n msg: ConsumeMessage;\n timeOfConsume: number;\n }[];\n [CHANNEL_CONSUME_TIMEOUT_TIMER]?: NodeJS.Timeout;\n};\nexport type InstrumentationMessage = Message & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\nexport type InstrumentationConsumeMessage = ConsumeMessage & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\n\nexport const normalizeExchange = (exchangeName: string): string => (exchangeName !== '' ? exchangeName : '<default>');\n\nconst censorPassword = (url: string): string => {\n return url.replace(/:[^:@/]*@/, ':***@');\n};\n\nconst getPort = (portFromUrl: number | undefined, resolvedProtocol: string): number => {\n // we are using the resolved protocol which is upper case\n // this code mimics the behavior of amqplib which is used to set connection params\n return portFromUrl || (resolvedProtocol === 'AMQP' ? 5672 : 5671);\n};\n\nconst getProtocol = (protocolFromUrl: string | undefined): string => {\n const resolvedProtocol = protocolFromUrl || 'amqp';\n // the substring removes the ':' part of the protocol ('amqp:' -> 'amqp')\n const noEndingColon = resolvedProtocol.endsWith(':')\n ? resolvedProtocol.substring(0, resolvedProtocol.length - 1)\n : resolvedProtocol;\n // upper case to match spec\n return noEndingColon.toUpperCase();\n};\n\nconst getHostname = (hostnameFromUrl: string | undefined): string => {\n // if user supplies empty hostname, it gets forwarded to 'net' package which defaults it to localhost.\n // https://nodejs.org/docs/latest-v12.x/api/net.html#net_socket_connect_options_connectlistener\n return hostnameFromUrl || 'localhost';\n};\n\nexport const getConnectionAttributesFromServer = (conn: Connection): SpanAttributes => {\n const product = conn.serverProperties.product?.toLowerCase?.();\n if (product) {\n return {\n [ATTR_MESSAGING_SYSTEM]: product,\n };\n } else {\n return {};\n }\n};\n\nexport const getConnectionAttributesFromUrl = (url: string | Options.Connect): SpanAttributes => {\n const attributes: SpanAttributes = {\n [ATTR_MESSAGING_PROTOCOL_VERSION]: '0.9.1', // this is the only protocol supported by the instrumented library\n };\n\n const resolvedUrl = url || 'amqp://localhost';\n if (typeof resolvedUrl === 'object') {\n const connectOptions = resolvedUrl;\n\n const protocol = getProtocol(connectOptions?.protocol);\n attributes[ATTR_MESSAGING_PROTOCOL] = protocol;\n attributes[ATTR_NET_PEER_NAME] = getHostname(connectOptions?.hostname);\n attributes[ATTR_NET_PEER_PORT] = getPort(connectOptions.port, protocol);\n } else {\n const censoredUrl = censorPassword(resolvedUrl);\n attributes[ATTR_MESSAGING_URL] = censoredUrl;\n try {\n const urlParts = new URL(censoredUrl);\n\n const protocol = getProtocol(urlParts.protocol);\n attributes[ATTR_MESSAGING_PROTOCOL] = protocol;\n attributes[ATTR_NET_PEER_NAME] = getHostname(urlParts.hostname);\n attributes[ATTR_NET_PEER_PORT] = getPort(urlParts.port ? parseInt(urlParts.port) : undefined, protocol);\n } catch {\n // best-effort: a malformed url simply yields fewer connection attributes\n }\n }\n return attributes;\n};\n\n/** Reads a propagation header value off an amqplib message as a string. */\nexport function getHeaderAsString(headers: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = headers?.[key];\n if (value == null) {\n return undefined;\n }\n return Array.isArray(value) ? String(value[0]) : String(value);\n}\n\n/** Starts an inactive producer span and propagates its trace into the publish `options.headers`. */\nexport function startPublishSpan(\n exchange: string,\n routingKey: string,\n channel: InstrumentationPublishChannel,\n options?: Options.Publish,\n): { span: Span; modifiedOptions: Options.Publish } {\n const normalizedExchange = normalizeExchange(exchange);\n\n const span = startInactiveSpan({\n name: `publish ${normalizedExchange}`,\n kind: SpanKind.PRODUCER,\n attributes: {\n ...channel.connection[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: routingKey,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: options?.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: options?.correlationId,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: PUBLISHER_ORIGIN,\n },\n });\n\n const modifiedOptions = options ?? {};\n modifiedOptions.headers = modifiedOptions.headers ?? {};\n\n const traceData = getTraceData({ span });\n if (traceData['sentry-trace']) {\n modifiedOptions.headers['sentry-trace'] = traceData['sentry-trace'];\n }\n if (traceData.baggage) {\n modifiedOptions.headers['baggage'] = traceData.baggage;\n }\n\n return { span, modifiedOptions };\n}\n\n/** Starts an inactive consumer (process) span carrying the amqplib messaging attributes. */\nexport function startConsumeSpan(\n queue: string,\n msg: InstrumentationConsumeMessage,\n channel: InstrumentationConsumeChannel,\n): Span {\n return startInactiveSpan({\n name: `${queue} process`,\n kind: SpanKind.CONSUMER,\n attributes: {\n ...channel?.connection?.[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: msg.fields?.exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: msg.fields?.routingKey,\n [ATTR_MESSAGING_OPERATION]: MESSAGING_OPERATION_VALUE_PROCESS,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: msg?.properties.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: msg?.properties.correlationId,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: CONSUMER_ORIGIN,\n },\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';
2
- import { SpanKind } from '@opentelemetry/api';
3
- import { SDK_VERSION, startSpan, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
2
+ import { SDK_VERSION, startSpan, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SPAN_KIND } from '@sentry/core';
4
3
 
5
4
  const MODULE_NAME = "dataloader";
6
5
  const PACKAGE_NAME = "@sentry/instrumentation-dataloader";
@@ -102,7 +101,7 @@ class DataloaderInstrumentation extends InstrumentationBase {
102
101
  return startSpan(
103
102
  {
104
103
  name: getSpanName(this, "load"),
105
- kind: SpanKind.CLIENT,
104
+ kind: SPAN_KIND.CLIENT,
106
105
  attributes: {
107
106
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
108
107
  [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp("load")
@@ -133,7 +132,7 @@ class DataloaderInstrumentation extends InstrumentationBase {
133
132
  return startSpan(
134
133
  {
135
134
  name: getSpanName(this, "loadMany"),
136
- kind: SpanKind.CLIENT,
135
+ kind: SPAN_KIND.CLIENT,
137
136
  attributes: {
138
137
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
139
138
  [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp("loadMany")
@@ -155,7 +154,7 @@ class DataloaderInstrumentation extends InstrumentationBase {
155
154
  return startSpan(
156
155
  {
157
156
  name: getSpanName(this, "prime"),
158
- kind: SpanKind.CLIENT,
157
+ kind: SPAN_KIND.CLIENT,
159
158
  attributes: {
160
159
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
161
160
  [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp("prime")
@@ -177,7 +176,7 @@ class DataloaderInstrumentation extends InstrumentationBase {
177
176
  return startSpan(
178
177
  {
179
178
  name: getSpanName(this, "clear"),
180
- kind: SpanKind.CLIENT,
179
+ kind: SPAN_KIND.CLIENT,
181
180
  attributes: {
182
181
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
183
182
  [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp("clear")
@@ -199,7 +198,7 @@ class DataloaderInstrumentation extends InstrumentationBase {
199
198
  return startSpan(
200
199
  {
201
200
  name: getSpanName(this, "clearAll"),
202
- kind: SpanKind.CLIENT,
201
+ kind: SPAN_KIND.CLIENT,
203
202
  attributes: {
204
203
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,
205
204
  [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp("clearAll")
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sources":["../../../../../../src/integrations/tracing/dataloader/vendored/instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-dataloader\n * - Upstream version: @opentelemetry/instrumentation-dataloader@0.35.0\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n */\n\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { BatchLoadFn, DataLoader, DataLoaderConstructor } from './types';\nimport { SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/core';\n\nconst MODULE_NAME = 'dataloader';\nconst PACKAGE_NAME = '@sentry/instrumentation-dataloader';\nconst ORIGIN = 'auto.db.otel.dataloader';\n\ntype LoadFn = DataLoader['load'];\ntype LoadManyFn = DataLoader['loadMany'];\ntype PrimeFn = DataLoader['prime'];\ntype ClearFn = DataLoader['clear'];\ntype ClearAllFn = DataLoader['clearAll'];\n\nfunction isModule(module: unknown): module is { [Symbol.toStringTag]: 'Module'; default: DataLoaderConstructor } {\n return (module as { [Symbol.toStringTag]: string })[Symbol.toStringTag] === 'Module';\n}\n\nfunction extractModuleExports(module: unknown): DataLoaderConstructor {\n return isModule(module)\n ? module.default // ESM\n : (module as DataLoaderConstructor); // CommonJS\n}\n\nfunction getSpanName(\n dataloader: DataLoader,\n operation: 'load' | 'loadMany' | 'batch' | 'prime' | 'clear' | 'clearAll',\n): string {\n const dataloaderName = dataloader.name;\n if (dataloaderName) {\n return `${MODULE_NAME}.${operation} ${dataloaderName}`;\n }\n\n return `${MODULE_NAME}.${operation}`;\n}\n\n// `load`, `loadMany` and `batch` are all cache reads\nfunction getSpanOp(operation: 'load' | 'loadMany' | 'batch' | 'prime' | 'clear' | 'clearAll'): string | undefined {\n if (operation === 'load' || operation === 'loadMany' || operation === 'batch') {\n return 'cache.get';\n }\n\n return undefined;\n}\n\nexport class DataloaderInstrumentation extends InstrumentationBase {\n constructor(config = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n protected init() {\n return [\n new InstrumentationNodeModuleDefinition(\n MODULE_NAME,\n ['>=2.0.0 <3'],\n module => {\n const dataloader = extractModuleExports(module);\n this._patchLoad(dataloader.prototype);\n this._patchLoadMany(dataloader.prototype);\n this._patchPrime(dataloader.prototype);\n this._patchClear(dataloader.prototype);\n this._patchClearAll(dataloader.prototype);\n\n return this._getPatchedConstructor(dataloader);\n },\n module => {\n const dataloader = extractModuleExports(module);\n ['load', 'loadMany', 'prime', 'clear', 'clearAll'].forEach(method => {\n if (isWrapped(dataloader.prototype[method])) {\n this._unwrap(dataloader.prototype, method);\n }\n });\n },\n ),\n ];\n }\n\n private _wrapBatchLoadFn(batchLoadFn: BatchLoadFn<unknown, unknown>): BatchLoadFn<unknown, unknown> {\n // oxlint-disable-next-line typescript/no-this-alias\n const instrumentation = this;\n\n return function patchedBatchLoadFn(this: DataLoader, ...args: Parameters<BatchLoadFn<unknown, unknown>>) {\n if (!instrumentation.isEnabled()) {\n return batchLoadFn.call(this, ...args);\n }\n\n return startSpan(\n {\n name: getSpanName(this, 'batch'),\n links: this._batch?.spanLinks,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('batch'),\n },\n onlyIfParent: true,\n },\n () => batchLoadFn.apply(this, args),\n );\n };\n }\n\n private _getPatchedConstructor(constructor: DataLoaderConstructor): DataLoaderConstructor {\n // oxlint-disable-next-line typescript/no-this-alias\n const instrumentation = this;\n const prototype = constructor.prototype;\n\n if (!instrumentation.isEnabled()) {\n return constructor;\n }\n\n // oxlint-disable-next-line typescript/no-explicit-any\n function PatchedDataloader(this: DataLoader, ...args: any[]) {\n // BatchLoadFn is the first constructor argument\n // https://github.com/graphql/dataloader/blob/77c2cd7ca97e8795242018ebc212ce2487e729d2/src/index.js#L47\n if (typeof args[0] === 'function') {\n if (isWrapped(args[0])) {\n instrumentation._unwrap(args, 0);\n }\n\n args[0] = instrumentation._wrapBatchLoadFn(args[0]);\n }\n\n return constructor.apply(this, args);\n }\n\n PatchedDataloader.prototype = prototype;\n return PatchedDataloader as unknown as DataLoaderConstructor;\n }\n\n private _patchLoad(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.load)) {\n this._unwrap(proto, 'load');\n }\n\n this._wrap(proto, 'load', this._getPatchedLoad.bind(this));\n }\n\n private _getPatchedLoad(original: LoadFn): LoadFn {\n return function patchedLoad(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'load'),\n kind: SpanKind.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('load'),\n },\n onlyIfParent: true,\n },\n span => {\n const result = original.call(this, ...args);\n\n if (this._batch && span.isRecording()) {\n if (!this._batch.spanLinks) {\n this._batch.spanLinks = [];\n }\n\n this._batch.spanLinks.push({ context: span.spanContext() });\n }\n\n return result;\n },\n );\n };\n }\n\n private _patchLoadMany(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.loadMany)) {\n this._unwrap(proto, 'loadMany');\n }\n\n this._wrap(proto, 'loadMany', this._getPatchedLoadMany.bind(this));\n }\n\n private _getPatchedLoadMany(original: LoadManyFn): LoadManyFn {\n return function patchedLoadMany(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'loadMany'),\n kind: SpanKind.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('loadMany'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchPrime(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.prime)) {\n this._unwrap(proto, 'prime');\n }\n\n this._wrap(proto, 'prime', this._getPatchedPrime.bind(this));\n }\n\n private _getPatchedPrime(original: PrimeFn): PrimeFn {\n return function patchedPrime(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'prime'),\n kind: SpanKind.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('prime'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchClear(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.clear)) {\n this._unwrap(proto, 'clear');\n }\n\n this._wrap(proto, 'clear', this._getPatchedClear.bind(this));\n }\n\n private _getPatchedClear(original: ClearFn): ClearFn {\n return function patchedClear(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'clear'),\n kind: SpanKind.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('clear'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchClearAll(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.clearAll)) {\n this._unwrap(proto, 'clearAll');\n }\n\n this._wrap(proto, 'clearAll', this._getPatchedClearAll.bind(this));\n }\n\n private _getPatchedClearAll(original: ClearAllFn): ClearAllFn {\n return function patchedClearAll(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'clearAll'),\n kind: SpanKind.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('clearAll'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","sources":["../../../../../../src/integrations/tracing/dataloader/vendored/instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-dataloader\n * - Upstream version: @opentelemetry/instrumentation-dataloader@0.35.0\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n */\n\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport type { BatchLoadFn, DataLoader, DataLoaderConstructor } from './types';\nimport {\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_KIND,\n startSpan,\n} from '@sentry/core';\n\nconst MODULE_NAME = 'dataloader';\nconst PACKAGE_NAME = '@sentry/instrumentation-dataloader';\nconst ORIGIN = 'auto.db.otel.dataloader';\n\ntype LoadFn = DataLoader['load'];\ntype LoadManyFn = DataLoader['loadMany'];\ntype PrimeFn = DataLoader['prime'];\ntype ClearFn = DataLoader['clear'];\ntype ClearAllFn = DataLoader['clearAll'];\n\nfunction isModule(module: unknown): module is { [Symbol.toStringTag]: 'Module'; default: DataLoaderConstructor } {\n return (module as { [Symbol.toStringTag]: string })[Symbol.toStringTag] === 'Module';\n}\n\nfunction extractModuleExports(module: unknown): DataLoaderConstructor {\n return isModule(module)\n ? module.default // ESM\n : (module as DataLoaderConstructor); // CommonJS\n}\n\nfunction getSpanName(\n dataloader: DataLoader,\n operation: 'load' | 'loadMany' | 'batch' | 'prime' | 'clear' | 'clearAll',\n): string {\n const dataloaderName = dataloader.name;\n if (dataloaderName) {\n return `${MODULE_NAME}.${operation} ${dataloaderName}`;\n }\n\n return `${MODULE_NAME}.${operation}`;\n}\n\n// `load`, `loadMany` and `batch` are all cache reads\nfunction getSpanOp(operation: 'load' | 'loadMany' | 'batch' | 'prime' | 'clear' | 'clearAll'): string | undefined {\n if (operation === 'load' || operation === 'loadMany' || operation === 'batch') {\n return 'cache.get';\n }\n\n return undefined;\n}\n\nexport class DataloaderInstrumentation extends InstrumentationBase {\n constructor(config = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n protected init() {\n return [\n new InstrumentationNodeModuleDefinition(\n MODULE_NAME,\n ['>=2.0.0 <3'],\n module => {\n const dataloader = extractModuleExports(module);\n this._patchLoad(dataloader.prototype);\n this._patchLoadMany(dataloader.prototype);\n this._patchPrime(dataloader.prototype);\n this._patchClear(dataloader.prototype);\n this._patchClearAll(dataloader.prototype);\n\n return this._getPatchedConstructor(dataloader);\n },\n module => {\n const dataloader = extractModuleExports(module);\n ['load', 'loadMany', 'prime', 'clear', 'clearAll'].forEach(method => {\n if (isWrapped(dataloader.prototype[method])) {\n this._unwrap(dataloader.prototype, method);\n }\n });\n },\n ),\n ];\n }\n\n private _wrapBatchLoadFn(batchLoadFn: BatchLoadFn<unknown, unknown>): BatchLoadFn<unknown, unknown> {\n // oxlint-disable-next-line typescript/no-this-alias\n const instrumentation = this;\n\n return function patchedBatchLoadFn(this: DataLoader, ...args: Parameters<BatchLoadFn<unknown, unknown>>) {\n if (!instrumentation.isEnabled()) {\n return batchLoadFn.call(this, ...args);\n }\n\n return startSpan(\n {\n name: getSpanName(this, 'batch'),\n links: this._batch?.spanLinks,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('batch'),\n },\n onlyIfParent: true,\n },\n () => batchLoadFn.apply(this, args),\n );\n };\n }\n\n private _getPatchedConstructor(constructor: DataLoaderConstructor): DataLoaderConstructor {\n // oxlint-disable-next-line typescript/no-this-alias\n const instrumentation = this;\n const prototype = constructor.prototype;\n\n if (!instrumentation.isEnabled()) {\n return constructor;\n }\n\n // oxlint-disable-next-line typescript/no-explicit-any\n function PatchedDataloader(this: DataLoader, ...args: any[]) {\n // BatchLoadFn is the first constructor argument\n // https://github.com/graphql/dataloader/blob/77c2cd7ca97e8795242018ebc212ce2487e729d2/src/index.js#L47\n if (typeof args[0] === 'function') {\n if (isWrapped(args[0])) {\n instrumentation._unwrap(args, 0);\n }\n\n args[0] = instrumentation._wrapBatchLoadFn(args[0]);\n }\n\n return constructor.apply(this, args);\n }\n\n PatchedDataloader.prototype = prototype;\n return PatchedDataloader as unknown as DataLoaderConstructor;\n }\n\n private _patchLoad(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.load)) {\n this._unwrap(proto, 'load');\n }\n\n this._wrap(proto, 'load', this._getPatchedLoad.bind(this));\n }\n\n private _getPatchedLoad(original: LoadFn): LoadFn {\n return function patchedLoad(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'load'),\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('load'),\n },\n onlyIfParent: true,\n },\n span => {\n const result = original.call(this, ...args);\n\n if (this._batch && span.isRecording()) {\n if (!this._batch.spanLinks) {\n this._batch.spanLinks = [];\n }\n\n this._batch.spanLinks.push({ context: span.spanContext() });\n }\n\n return result;\n },\n );\n };\n }\n\n private _patchLoadMany(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.loadMany)) {\n this._unwrap(proto, 'loadMany');\n }\n\n this._wrap(proto, 'loadMany', this._getPatchedLoadMany.bind(this));\n }\n\n private _getPatchedLoadMany(original: LoadManyFn): LoadManyFn {\n return function patchedLoadMany(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'loadMany'),\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('loadMany'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchPrime(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.prime)) {\n this._unwrap(proto, 'prime');\n }\n\n this._wrap(proto, 'prime', this._getPatchedPrime.bind(this));\n }\n\n private _getPatchedPrime(original: PrimeFn): PrimeFn {\n return function patchedPrime(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'prime'),\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('prime'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchClear(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.clear)) {\n this._unwrap(proto, 'clear');\n }\n\n this._wrap(proto, 'clear', this._getPatchedClear.bind(this));\n }\n\n private _getPatchedClear(original: ClearFn): ClearFn {\n return function patchedClear(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'clear'),\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('clear'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n\n private _patchClearAll(proto: DataLoader) {\n // oxlint-disable-next-line typescript/unbound-method\n if (isWrapped(proto.clearAll)) {\n this._unwrap(proto, 'clearAll');\n }\n\n this._wrap(proto, 'clearAll', this._getPatchedClearAll.bind(this));\n }\n\n private _getPatchedClearAll(original: ClearAllFn): ClearAllFn {\n return function patchedClearAll(this: DataLoader, ...args: Parameters<typeof original>) {\n return startSpan(\n {\n name: getSpanName(this, 'clearAll'),\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: getSpanOp('clearAll'),\n },\n onlyIfParent: true,\n },\n () => original.call(this, ...args),\n );\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,32 +1,9 @@
1
- import { defineIntegration, captureException, flush, SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core';
2
- import { generateInstrumentOnce, addOriginToSpan } from '@sentry/node-core';
1
+ import { defineIntegration } from '@sentry/core';
2
+ import { generateInstrumentOnce } from '@sentry/node-core';
3
3
  import { FirebaseInstrumentation } from './otel/firebaseInstrumentation.js';
4
4
 
5
5
  const INTEGRATION_NAME = "Firebase";
6
- const config = {
7
- firestoreSpanCreationHook: (span) => {
8
- addOriginToSpan(span, "auto.firebase.otel.firestore");
9
- span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, "db.query");
10
- },
11
- functions: {
12
- requestHook: (span) => {
13
- addOriginToSpan(span, "auto.firebase.otel.functions");
14
- span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, "http.request");
15
- },
16
- errorHook: async (_, error) => {
17
- if (error) {
18
- captureException(error, {
19
- mechanism: {
20
- type: "auto.firebase.otel.functions",
21
- handled: false
22
- }
23
- });
24
- await flush(2e3);
25
- }
26
- }
27
- }
28
- };
29
- const instrumentFirebase = generateInstrumentOnce(INTEGRATION_NAME, () => new FirebaseInstrumentation(config));
6
+ const instrumentFirebase = generateInstrumentOnce(INTEGRATION_NAME, () => new FirebaseInstrumentation());
30
7
  const _firebaseIntegration = (() => {
31
8
  return {
32
9
  name: INTEGRATION_NAME,
@@ -1 +1 @@
1
- {"version":3,"file":"firebase.js","sources":["../../../../../src/integrations/tracing/firebase/firebase.ts"],"sourcesContent":["import type { IntegrationFn } from '@sentry/core';\nimport { captureException, defineIntegration, flush, SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core';\nimport { addOriginToSpan, generateInstrumentOnce } from '@sentry/node-core';\nimport { FirebaseInstrumentation, type FirebaseInstrumentationConfig } from './otel';\n\nconst INTEGRATION_NAME = 'Firebase';\n\nconst config: FirebaseInstrumentationConfig = {\n firestoreSpanCreationHook: span => {\n addOriginToSpan(span, 'auto.firebase.otel.firestore');\n\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, 'db.query');\n },\n functions: {\n requestHook: span => {\n addOriginToSpan(span, 'auto.firebase.otel.functions');\n\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, 'http.request');\n },\n errorHook: async (_, error) => {\n if (error) {\n captureException(error, {\n mechanism: {\n type: 'auto.firebase.otel.functions',\n handled: false,\n },\n });\n await flush(2000);\n }\n },\n },\n};\n\nexport const instrumentFirebase = generateInstrumentOnce(INTEGRATION_NAME, () => new FirebaseInstrumentation(config));\n\nconst _firebaseIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentFirebase();\n },\n };\n}) satisfies IntegrationFn;\n\nexport const firebaseIntegration = defineIntegration(_firebaseIntegration);\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAA,GAAmB,UAAA;AAEzB,MAAM,MAAA,GAAwC;AAAA,EAC5C,2BAA2B,CAAA,IAAA,KAAQ;AACjC,IAAA,eAAA,CAAgB,MAAM,8BAA8B,CAAA;AAEpD,IAAA,IAAA,CAAK,YAAA,CAAa,8BAA8B,UAAU,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,SAAA,EAAW;AAAA,IACT,aAAa,CAAA,IAAA,KAAQ;AACnB,MAAA,eAAA,CAAgB,MAAM,8BAA8B,CAAA;AAEpD,MAAA,IAAA,CAAK,YAAA,CAAa,8BAA8B,cAAc,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,CAAA,EAAG,KAAA,KAAU;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,gBAAA,CAAiB,KAAA,EAAO;AAAA,UACtB,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,8BAAA;AAAA,YACN,OAAA,EAAS;AAAA;AACX,SACD,CAAA;AACD,QAAA,MAAM,MAAM,GAAI,CAAA;AAAA,MAClB;AAAA,IACF;AAAA;AAEJ,CAAA;AAEO,MAAM,qBAAqB,sBAAA,CAAuB,gBAAA,EAAkB,MAAM,IAAI,uBAAA,CAAwB,MAAM,CAAC;AAEpH,MAAM,wBAAwB,MAAM;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,mBAAA,GAAsB,kBAAkB,oBAAoB;;;;"}
1
+ {"version":3,"file":"firebase.js","sources":["../../../../../src/integrations/tracing/firebase/firebase.ts"],"sourcesContent":["import type { IntegrationFn } from '@sentry/core';\nimport { defineIntegration } from '@sentry/core';\nimport { generateInstrumentOnce } from '@sentry/node-core';\nimport { FirebaseInstrumentation } from './otel';\n\nconst INTEGRATION_NAME = 'Firebase';\n\nexport const instrumentFirebase = generateInstrumentOnce(INTEGRATION_NAME, () => new FirebaseInstrumentation());\n\nconst _firebaseIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentFirebase();\n },\n };\n}) satisfies IntegrationFn;\n\nexport const firebaseIntegration = defineIntegration(_firebaseIntegration);\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAA,GAAmB,UAAA;AAElB,MAAM,qBAAqB,sBAAA,CAAuB,gBAAA,EAAkB,MAAM,IAAI,yBAAyB;AAE9G,MAAM,wBAAwB,MAAM;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,mBAAA,GAAsB,kBAAkB,oBAAoB;;;;"}
@@ -3,20 +3,12 @@ import { SDK_VERSION } from '@sentry/core';
3
3
  import { patchFirestore } from './patches/firestore.js';
4
4
  import { patchFunctions } from './patches/functions.js';
5
5
 
6
- const DefaultFirebaseInstrumentationConfig = {};
7
6
  const firestoreSupportedVersions = [">=3.0.0 <5"];
8
7
  const functionsSupportedVersions = [">=6.0.0 <7"];
9
8
  class FirebaseInstrumentation extends InstrumentationBase {
10
- constructor(config = DefaultFirebaseInstrumentationConfig) {
9
+ constructor(config = {}) {
11
10
  super("@sentry/instrumentation-firebase", SDK_VERSION, config);
12
11
  }
13
- /**
14
- * sets config
15
- * @param config
16
- */
17
- setConfig(config = {}) {
18
- super.setConfig({ ...DefaultFirebaseInstrumentationConfig, ...config });
19
- }
20
12
  /**
21
13
  *
22
14
  * @protected
@@ -24,8 +16,8 @@ class FirebaseInstrumentation extends InstrumentationBase {
24
16
  // eslint-disable-next-line @typescript-eslint/naming-convention
25
17
  init() {
26
18
  const modules = [];
27
- modules.push(patchFirestore(this.tracer, firestoreSupportedVersions, this._wrap, this._unwrap, this.getConfig()));
28
- modules.push(patchFunctions(this.tracer, functionsSupportedVersions, this._wrap, this._unwrap, this.getConfig()));
19
+ modules.push(patchFirestore(firestoreSupportedVersions, this._wrap, this._unwrap));
20
+ modules.push(patchFunctions(functionsSupportedVersions, this._wrap, this._unwrap));
29
21
  return modules;
30
22
  }
31
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"firebaseInstrumentation.js","sources":["../../../../../../src/integrations/tracing/firebase/otel/firebaseInstrumentation.ts"],"sourcesContent":["import { InstrumentationBase, type InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport { SDK_VERSION } from '@sentry/core';\nimport { patchFirestore } from './patches/firestore';\nimport { patchFunctions } from './patches/functions';\nimport type { FirebaseInstrumentationConfig } from './types';\n\nconst DefaultFirebaseInstrumentationConfig: FirebaseInstrumentationConfig = {};\nconst firestoreSupportedVersions = ['>=3.0.0 <5']; // firebase 9+\nconst functionsSupportedVersions = ['>=6.0.0 <7']; // firebase-functions v2\n\n/**\n * Instrumentation for Firebase services, specifically Firestore.\n */\nexport class FirebaseInstrumentation extends InstrumentationBase<FirebaseInstrumentationConfig> {\n public constructor(config: FirebaseInstrumentationConfig = DefaultFirebaseInstrumentationConfig) {\n super('@sentry/instrumentation-firebase', SDK_VERSION, config);\n }\n\n /**\n * sets config\n * @param config\n */\n public override setConfig(config: FirebaseInstrumentationConfig = {}): void {\n super.setConfig({ ...DefaultFirebaseInstrumentationConfig, ...config });\n }\n\n /**\n *\n * @protected\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): InstrumentationNodeModuleDefinition | InstrumentationNodeModuleDefinition[] | void {\n const modules: InstrumentationNodeModuleDefinition[] = [];\n\n modules.push(patchFirestore(this.tracer, firestoreSupportedVersions, this._wrap, this._unwrap, this.getConfig()));\n modules.push(patchFunctions(this.tracer, functionsSupportedVersions, this._wrap, this._unwrap, this.getConfig()));\n\n return modules;\n }\n}\n"],"names":[],"mappings":";;;;;AAMA,MAAM,uCAAsE,EAAC;AAC7E,MAAM,0BAAA,GAA6B,CAAC,YAAY,CAAA;AAChD,MAAM,0BAAA,GAA6B,CAAC,YAAY,CAAA;AAKzC,MAAM,gCAAgC,mBAAA,CAAmD;AAAA,EACvF,WAAA,CAAY,SAAwC,oCAAA,EAAsC;AAC/F,IAAA,KAAA,CAAM,kCAAA,EAAoC,aAAa,MAAM,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMgB,SAAA,CAAU,MAAA,GAAwC,EAAC,EAAS;AAC1E,IAAA,KAAA,CAAM,UAAU,EAAE,GAAG,oCAAA,EAAsC,GAAG,QAAQ,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,IAAA,GAA2F;AACnG,IAAA,MAAM,UAAiD,EAAC;AAExD,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,0BAAA,EAA4B,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAChH,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,0BAAA,EAA4B,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAEhH,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;;"}
1
+ {"version":3,"file":"firebaseInstrumentation.js","sources":["../../../../../../src/integrations/tracing/firebase/otel/firebaseInstrumentation.ts"],"sourcesContent":["import type { InstrumentationConfig, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase } from '@opentelemetry/instrumentation';\nimport { SDK_VERSION } from '@sentry/core';\nimport { patchFirestore } from './patches/firestore';\nimport { patchFunctions } from './patches/functions';\n\nconst firestoreSupportedVersions = ['>=3.0.0 <5']; // firebase 9+\nconst functionsSupportedVersions = ['>=6.0.0 <7']; // firebase-functions v2\n\n/**\n * Instrumentation for Firebase services, specifically Firestore.\n */\nexport class FirebaseInstrumentation extends InstrumentationBase<InstrumentationConfig> {\n public constructor(config: InstrumentationConfig = {}) {\n super('@sentry/instrumentation-firebase', SDK_VERSION, config);\n }\n\n /**\n *\n * @protected\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): InstrumentationNodeModuleDefinition | InstrumentationNodeModuleDefinition[] | void {\n const modules: InstrumentationNodeModuleDefinition[] = [];\n\n modules.push(patchFirestore(firestoreSupportedVersions, this._wrap, this._unwrap));\n modules.push(patchFunctions(functionsSupportedVersions, this._wrap, this._unwrap));\n\n return modules;\n }\n}\n"],"names":[],"mappings":";;;;;AAMA,MAAM,0BAAA,GAA6B,CAAC,YAAY,CAAA;AAChD,MAAM,0BAAA,GAA6B,CAAC,YAAY,CAAA;AAKzC,MAAM,gCAAgC,mBAAA,CAA2C;AAAA,EAC/E,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AACrD,IAAA,KAAA,CAAM,kCAAA,EAAoC,aAAa,MAAM,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,IAAA,GAA2F;AACnG,IAAA,MAAM,UAAiD,EAAC;AAExD,IAAA,OAAA,CAAQ,KAAK,cAAA,CAAe,0BAAA,EAA4B,KAAK,KAAA,EAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjF,IAAA,OAAA,CAAQ,KAAK,cAAA,CAAe,0BAAA,EAA4B,KAAK,KAAA,EAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAEjF,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;;"}
@@ -1,33 +1,15 @@
1
1
  import * as net from 'node:net';
2
- import { SpanKind, context, trace, diag } from '@opentelemetry/api';
3
- import { InstrumentationNodeModuleDefinition, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
2
+ import { InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';
4
3
  import { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile.js';
5
4
  import { ATTR_DB_OPERATION_NAME, ATTR_DB_NAMESPACE, ATTR_DB_COLLECTION_NAME, ATTR_DB_SYSTEM_NAME, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';
5
+ import { startSpan, SPAN_KIND, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
6
6
 
7
- function patchFirestore(tracer, firestoreSupportedVersions, wrap, unwrap, config) {
8
- const defaultFirestoreSpanCreationHook = () => {
9
- };
10
- let firestoreSpanCreationHook = defaultFirestoreSpanCreationHook;
11
- const configFirestoreSpanCreationHook = config.firestoreSpanCreationHook;
12
- if (typeof configFirestoreSpanCreationHook === "function") {
13
- firestoreSpanCreationHook = (span) => {
14
- safeExecuteInTheMiddle(
15
- () => configFirestoreSpanCreationHook(span),
16
- (error) => {
17
- if (!error) {
18
- return;
19
- }
20
- diag.error(error?.message);
21
- },
22
- true
23
- );
24
- };
25
- }
7
+ function patchFirestore(firestoreSupportedVersions, wrap, unwrap) {
26
8
  const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(
27
9
  "@firebase/firestore",
28
10
  firestoreSupportedVersions,
29
11
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
- (moduleExports) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook)
12
+ (moduleExports) => wrapMethods(moduleExports, wrap, unwrap)
31
13
  );
32
14
  const files = [
33
15
  "@firebase/firestore/dist/lite/index.node.cjs.js",
@@ -40,19 +22,19 @@ function patchFirestore(tracer, firestoreSupportedVersions, wrap, unwrap, config
40
22
  new InstrumentationNodeModuleFile(
41
23
  file,
42
24
  firestoreSupportedVersions,
43
- (moduleExports) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),
25
+ (moduleExports) => wrapMethods(moduleExports, wrap, unwrap),
44
26
  (moduleExports) => unwrapMethods(moduleExports, unwrap)
45
27
  )
46
28
  );
47
29
  }
48
30
  return moduleFirestoreCJS;
49
31
  }
50
- function wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook) {
32
+ function wrapMethods(moduleExports, wrap, unwrap) {
51
33
  unwrapMethods(moduleExports, unwrap);
52
- wrap(moduleExports, "addDoc", patchAddDoc(tracer, firestoreSpanCreationHook));
53
- wrap(moduleExports, "getDocs", patchGetDocs(tracer, firestoreSpanCreationHook));
54
- wrap(moduleExports, "setDoc", patchSetDoc(tracer, firestoreSpanCreationHook));
55
- wrap(moduleExports, "deleteDoc", patchDeleteDoc(tracer, firestoreSpanCreationHook));
34
+ wrap(moduleExports, "addDoc", patchAddDoc());
35
+ wrap(moduleExports, "getDocs", patchGetDocs());
36
+ wrap(moduleExports, "setDoc", patchSetDoc());
37
+ wrap(moduleExports, "deleteDoc", patchDeleteDoc());
56
38
  return moduleExports;
57
39
  }
58
40
  function unwrapMethods(moduleExports, unwrap) {
@@ -63,71 +45,50 @@ function unwrapMethods(moduleExports, unwrap) {
63
45
  }
64
46
  return moduleExports;
65
47
  }
66
- function patchAddDoc(tracer, firestoreSpanCreationHook) {
48
+ function patchAddDoc() {
67
49
  return function addDoc(original) {
68
50
  return function(reference, data) {
69
- const span = startDBSpan(tracer, "addDoc", reference);
70
- firestoreSpanCreationHook(span);
71
- return executeContextWithSpan(span, () => {
72
- return original(reference, data);
73
- });
51
+ return startFirestoreSpan("addDoc", reference, () => original(reference, data));
74
52
  };
75
53
  };
76
54
  }
77
- function patchDeleteDoc(tracer, firestoreSpanCreationHook) {
55
+ function patchDeleteDoc() {
78
56
  return function deleteDoc(original) {
79
57
  return function(reference) {
80
- const span = startDBSpan(tracer, "deleteDoc", reference.parent || reference);
81
- firestoreSpanCreationHook(span);
82
- return executeContextWithSpan(span, () => {
83
- return original(reference);
84
- });
58
+ return startFirestoreSpan("deleteDoc", reference.parent || reference, () => original(reference));
85
59
  };
86
60
  };
87
61
  }
88
- function patchGetDocs(tracer, firestoreSpanCreationHook) {
62
+ function patchGetDocs() {
89
63
  return function getDocs(original) {
90
64
  return function(reference) {
91
- const span = startDBSpan(tracer, "getDocs", reference);
92
- firestoreSpanCreationHook(span);
93
- return executeContextWithSpan(span, () => {
94
- return original(reference);
95
- });
65
+ return startFirestoreSpan("getDocs", reference, () => original(reference));
96
66
  };
97
67
  };
98
68
  }
99
- function patchSetDoc(tracer, firestoreSpanCreationHook) {
69
+ function patchSetDoc() {
100
70
  return function setDoc(original) {
101
71
  return function(reference, data, options) {
102
- const span = startDBSpan(tracer, "setDoc", reference.parent || reference);
103
- firestoreSpanCreationHook(span);
104
- return executeContextWithSpan(span, () => {
72
+ return startFirestoreSpan("setDoc", reference.parent || reference, () => {
105
73
  return typeof options !== "undefined" ? original(reference, data, options) : original(reference, data);
106
74
  });
107
75
  };
108
76
  };
109
77
  }
110
- function executeContextWithSpan(span, callback) {
111
- return context.with(trace.setSpan(context.active(), span), () => {
112
- return safeExecuteInTheMiddle(
113
- () => {
114
- return callback();
115
- },
116
- (err) => {
117
- if (err) {
118
- span.recordException(err);
119
- }
120
- span.end();
121
- },
122
- true
123
- );
124
- });
125
- }
126
- function startDBSpan(tracer, spanName, reference) {
127
- const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: SpanKind.CLIENT });
128
- addAttributes(span, reference);
129
- span.setAttribute(ATTR_DB_OPERATION_NAME, spanName);
130
- return span;
78
+ function startFirestoreSpan(spanName, reference, callback) {
79
+ return startSpan(
80
+ {
81
+ name: `${spanName} ${reference.path}`,
82
+ op: "db.query",
83
+ kind: SPAN_KIND.CLIENT,
84
+ attributes: {
85
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.firebase.otel.firestore",
86
+ [ATTR_DB_OPERATION_NAME]: spanName,
87
+ ...buildAttributes(reference)
88
+ }
89
+ },
90
+ callback
91
+ );
131
92
  }
132
93
  function getPortAndAddress(settings) {
133
94
  let address;
@@ -162,7 +123,7 @@ function getPortAndAddress(settings) {
162
123
  port: port ? parseInt(port, 10) : void 0
163
124
  };
164
125
  }
165
- function addAttributes(span, reference) {
126
+ function buildAttributes(reference) {
166
127
  const firestoreApp = reference.firestore.app;
167
128
  const firestoreOptions = firestoreApp.options;
168
129
  const json = reference.firestore.toJSON() || {};
@@ -184,7 +145,7 @@ function addAttributes(span, reference) {
184
145
  if (port) {
185
146
  attributes[ATTR_SERVER_PORT] = port;
186
147
  }
187
- span.setAttributes(attributes);
148
+ return attributes;
188
149
  }
189
150
 
190
151
  export { getPortAndAddress, patchFirestore };
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/firestore.ts"],"sourcesContent":["import * as net from 'node:net';\nimport type { Span, Tracer } from '@opentelemetry/api';\nimport { context, diag, SpanKind, trace } from '@opentelemetry/api';\nimport { InstrumentationNodeModuleDefinition, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile';\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\nimport type { SpanAttributes } from '@sentry/core';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type {\n AddDocType,\n CollectionReference,\n DeleteDocType,\n DocumentData,\n DocumentReference,\n FirebaseApp,\n FirebaseInstrumentationConfig,\n FirebaseOptions,\n FirestoreSettings,\n FirestoreSpanCreationHook,\n GetDocsType,\n PartialWithFieldValue,\n QuerySnapshot,\n SetDocType,\n SetOptions,\n WithFieldValue,\n} from '../types';\n\n// Inline minimal types used from `shimmer` to avoid importing shimmer's types directly.\n// We only need the shape for `wrap` and `unwrap` used in this file.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerWrap = (target: any, name: string, wrapper: (...args: any[]) => any) => void;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerUnwrap = (target: any, name: string) => void;\n\n/**\n *\n * @param tracer - Opentelemetry Tracer\n * @param firestoreSupportedVersions - supported version of firebase/firestore\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation wrap function\n */\nexport function patchFirestore(\n tracer: Tracer,\n firestoreSupportedVersions: string[],\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n config: FirebaseInstrumentationConfig,\n): InstrumentationNodeModuleDefinition {\n const defaultFirestoreSpanCreationHook: FirestoreSpanCreationHook = () => {};\n\n let firestoreSpanCreationHook: FirestoreSpanCreationHook = defaultFirestoreSpanCreationHook;\n const configFirestoreSpanCreationHook = config.firestoreSpanCreationHook;\n\n if (typeof configFirestoreSpanCreationHook === 'function') {\n firestoreSpanCreationHook = (span: Span) => {\n safeExecuteInTheMiddle(\n () => configFirestoreSpanCreationHook(span),\n error => {\n if (!error) {\n return;\n }\n diag.error(error?.message);\n },\n true,\n );\n };\n }\n\n const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(\n '@firebase/firestore',\n firestoreSupportedVersions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports: any) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n );\n const files: string[] = [\n '@firebase/firestore/dist/lite/index.node.cjs.js',\n '@firebase/firestore/dist/lite/index.node.mjs.js',\n '@firebase/firestore/dist/lite/index.rn.esm2017.js',\n '@firebase/firestore/dist/lite/index.cjs.js',\n ];\n\n for (const file of files) {\n moduleFirestoreCJS.files.push(\n new InstrumentationNodeModuleFile(\n file,\n firestoreSupportedVersions,\n moduleExports => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n moduleExports => unwrapMethods(moduleExports, unwrap),\n ),\n );\n }\n\n return moduleFirestoreCJS;\n}\n\nfunction wrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n unwrapMethods(moduleExports, unwrap);\n\n wrap(moduleExports, 'addDoc', patchAddDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'getDocs', patchGetDocs(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'setDoc', patchSetDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'deleteDoc', patchDeleteDoc(tracer, firestoreSpanCreationHook));\n\n return moduleExports;\n}\n\nfunction unwrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n unwrap: ShimmerUnwrap,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n for (const method of ['addDoc', 'getDocs', 'setDoc', 'deleteDoc']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isWrapped(moduleExports[method])) {\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n\nfunction patchAddDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: AddDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n) => Promise<DocumentReference<AppModelType, DbModelType>> {\n return function addDoc(original: AddDocType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n ): Promise<DocumentReference<AppModelType, DbModelType>> {\n const span = startDBSpan(tracer, 'addDoc', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<DocumentReference<AppModelType, DbModelType>>>(span, () => {\n return original(reference, data);\n });\n };\n };\n}\n\nfunction patchDeleteDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: DeleteDocType<AppModelType, DbModelType>,\n) => (this: FirebaseInstrumentation, reference: DocumentReference<AppModelType, DbModelType>) => Promise<void> {\n return function deleteDoc(original: DeleteDocType<AppModelType, DbModelType>) {\n return function (reference: DocumentReference<AppModelType, DbModelType>): Promise<void> {\n const span = startDBSpan(tracer, 'deleteDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<void>>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchGetDocs<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: GetDocsType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n) => Promise<QuerySnapshot<AppModelType, DbModelType>> {\n return function getDocs(original: GetDocsType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n ): Promise<QuerySnapshot<AppModelType, DbModelType>> {\n const span = startDBSpan(tracer, 'getDocs', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan<Promise<QuerySnapshot<AppModelType, DbModelType>>>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchSetDoc<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: SetDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n) => Promise<void> {\n return function setDoc(original: SetDocType<AppModelType, DbModelType>) {\n return function (\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n ): Promise<void> {\n const span = startDBSpan(tracer, 'setDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n\n return executeContextWithSpan<Promise<void>>(span, () => {\n return typeof options !== 'undefined' ? original(reference, data, options) : original(reference, data);\n });\n };\n };\n}\n\nfunction executeContextWithSpan<T>(span: Span, callback: () => T): T {\n return context.with(trace.setSpan(context.active(), span), () => {\n return safeExecuteInTheMiddle(\n (): T => {\n return callback();\n },\n err => {\n if (err) {\n span.recordException(err);\n }\n span.end();\n },\n true,\n );\n });\n}\n\nfunction startDBSpan<AppModelType, DbModelType extends DocumentData>(\n tracer: Tracer,\n spanName: string,\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n): Span {\n const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: SpanKind.CLIENT });\n addAttributes(span, reference);\n span.setAttribute(ATTR_DB_OPERATION_NAME, spanName);\n return span;\n}\n\n/**\n * Gets the server address and port attributes from the Firestore settings.\n * It's best effort to extract the address and port from the settings, especially for IPv6.\n * @param span - The span to set attributes on.\n * @param settings - The Firestore settings containing host information.\n */\nexport function getPortAndAddress(settings: FirestoreSettings): {\n address?: string;\n port?: number;\n} {\n let address: string | undefined;\n let port: string | undefined;\n\n if (typeof settings.host === 'string') {\n if (settings.host.startsWith('[')) {\n // IPv6 addresses can be enclosed in square brackets, e.g., [2001:db8::1]:8080\n if (settings.host.endsWith(']')) {\n // IPv6 with square brackets without port\n address = settings.host.replace(/^\\[|\\]$/g, '');\n } else if (settings.host.includes(']:')) {\n // IPv6 with square brackets with port\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(1, lastColonIndex).replace(/^\\[|\\]$/g, '');\n port = settings.host.slice(lastColonIndex + 1);\n }\n }\n } else {\n // IPv4 or IPv6 without square brackets\n // If it's an IPv6 address without square brackets, we assume it does not have a port.\n if (net.isIPv6(settings.host)) {\n address = settings.host;\n }\n // If it's an IPv4 address, we can extract the port if it exists.\n else {\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(0, lastColonIndex);\n port = settings.host.slice(lastColonIndex + 1);\n } else {\n address = settings.host;\n }\n }\n }\n }\n return {\n address: address,\n port: port ? parseInt(port, 10) : undefined,\n };\n}\n\nfunction addAttributes<AppModelType, DbModelType extends DocumentData>(\n span: Span,\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n): void {\n const firestoreApp: FirebaseApp = reference.firestore.app;\n const firestoreOptions: FirebaseOptions = firestoreApp.options;\n const json: { settings?: FirestoreSettings } = reference.firestore.toJSON() || {};\n const settings: FirestoreSettings = json.settings || {};\n\n const attributes: SpanAttributes = {\n [ATTR_DB_COLLECTION_NAME]: reference.path,\n [ATTR_DB_NAMESPACE]: firestoreApp.name,\n [ATTR_DB_SYSTEM_NAME]: 'firebase.firestore',\n 'firebase.firestore.type': reference.type,\n 'firebase.firestore.options.projectId': firestoreOptions.projectId,\n 'firebase.firestore.options.appId': firestoreOptions.appId,\n 'firebase.firestore.options.messagingSenderId': firestoreOptions.messagingSenderId,\n 'firebase.firestore.options.storageBucket': firestoreOptions.storageBucket,\n };\n\n const { address, port } = getPortAndAddress(settings);\n\n if (address) {\n attributes[ATTR_SERVER_ADDRESS] = address;\n }\n if (port) {\n attributes[ATTR_SERVER_PORT] = port;\n }\n\n span.setAttributes(attributes);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firestore.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/firestore.ts"],"sourcesContent":["import * as net from 'node:net';\nimport { InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../../InstrumentationNodeModuleFile';\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\nimport type { SpanAttributes } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SPAN_KIND, startSpan } from '@sentry/core';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type {\n AddDocType,\n CollectionReference,\n DeleteDocType,\n DocumentData,\n DocumentReference,\n FirebaseApp,\n FirebaseOptions,\n FirestoreSettings,\n GetDocsType,\n PartialWithFieldValue,\n QuerySnapshot,\n SetDocType,\n SetOptions,\n WithFieldValue,\n} from '../types';\n\n// Inline minimal types used from `shimmer` to avoid importing shimmer's types directly.\n// We only need the shape for `wrap` and `unwrap` used in this file.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerWrap = (target: any, name: string, wrapper: (...args: any[]) => any) => void;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerUnwrap = (target: any, name: string) => void;\n\n/**\n *\n * @param firestoreSupportedVersions - supported version of firebase/firestore\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation wrap function\n */\nexport function patchFirestore(\n firestoreSupportedVersions: string[],\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n): InstrumentationNodeModuleDefinition {\n const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(\n '@firebase/firestore',\n firestoreSupportedVersions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports: any) => wrapMethods(moduleExports, wrap, unwrap),\n );\n const files: string[] = [\n '@firebase/firestore/dist/lite/index.node.cjs.js',\n '@firebase/firestore/dist/lite/index.node.mjs.js',\n '@firebase/firestore/dist/lite/index.rn.esm2017.js',\n '@firebase/firestore/dist/lite/index.cjs.js',\n ];\n\n for (const file of files) {\n moduleFirestoreCJS.files.push(\n new InstrumentationNodeModuleFile(\n file,\n firestoreSupportedVersions,\n moduleExports => wrapMethods(moduleExports, wrap, unwrap),\n moduleExports => unwrapMethods(moduleExports, unwrap),\n ),\n );\n }\n\n return moduleFirestoreCJS;\n}\n\nfunction wrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n unwrapMethods(moduleExports, unwrap);\n\n wrap(moduleExports, 'addDoc', patchAddDoc());\n wrap(moduleExports, 'getDocs', patchGetDocs());\n wrap(moduleExports, 'setDoc', patchSetDoc());\n wrap(moduleExports, 'deleteDoc', patchDeleteDoc());\n\n return moduleExports;\n}\n\nfunction unwrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n unwrap: ShimmerUnwrap,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n for (const method of ['addDoc', 'getDocs', 'setDoc', 'deleteDoc']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isWrapped(moduleExports[method])) {\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n\nfunction patchAddDoc<AppModelType, DbModelType extends DocumentData>(): (\n original: AddDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n) => Promise<DocumentReference<AppModelType, DbModelType>> {\n return function addDoc(original: AddDocType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType>,\n ): Promise<DocumentReference<AppModelType, DbModelType>> {\n return startFirestoreSpan('addDoc', reference, () => original(reference, data));\n };\n };\n}\n\nfunction patchDeleteDoc<AppModelType, DbModelType extends DocumentData>(): (\n original: DeleteDocType<AppModelType, DbModelType>,\n) => (this: FirebaseInstrumentation, reference: DocumentReference<AppModelType, DbModelType>) => Promise<void> {\n return function deleteDoc(original: DeleteDocType<AppModelType, DbModelType>) {\n return function (reference: DocumentReference<AppModelType, DbModelType>): Promise<void> {\n return startFirestoreSpan('deleteDoc', reference.parent || reference, () => original(reference));\n };\n };\n}\n\nfunction patchGetDocs<AppModelType, DbModelType extends DocumentData>(): (\n original: GetDocsType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference<AppModelType, DbModelType>,\n) => Promise<QuerySnapshot<AppModelType, DbModelType>> {\n return function getDocs(original: GetDocsType<AppModelType, DbModelType>) {\n return function (\n reference: CollectionReference<AppModelType, DbModelType>,\n ): Promise<QuerySnapshot<AppModelType, DbModelType>> {\n return startFirestoreSpan('getDocs', reference, () => original(reference));\n };\n };\n}\n\nfunction patchSetDoc<AppModelType, DbModelType extends DocumentData>(): (\n original: SetDocType<AppModelType, DbModelType>,\n) => (\n this: FirebaseInstrumentation,\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n) => Promise<void> {\n return function setDoc(original: SetDocType<AppModelType, DbModelType>) {\n return function (\n reference: DocumentReference<AppModelType, DbModelType>,\n data: WithFieldValue<AppModelType> & PartialWithFieldValue<AppModelType>,\n options?: SetOptions,\n ): Promise<void> {\n return startFirestoreSpan('setDoc', reference.parent || reference, () => {\n return typeof options !== 'undefined' ? original(reference, data, options) : original(reference, data);\n });\n };\n };\n}\n\nfunction startFirestoreSpan<AppModelType, DbModelType extends DocumentData, T>(\n spanName: string,\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n callback: () => T,\n): T {\n return startSpan(\n {\n name: `${spanName} ${reference.path}`,\n op: 'db.query',\n kind: SPAN_KIND.CLIENT,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.firebase.otel.firestore',\n [ATTR_DB_OPERATION_NAME]: spanName,\n ...buildAttributes(reference),\n },\n },\n callback,\n );\n}\n\n/**\n * Gets the server address and port attributes from the Firestore settings.\n * It's best effort to extract the address and port from the settings, especially for IPv6.\n * @param settings - The Firestore settings containing host information.\n */\nexport function getPortAndAddress(settings: FirestoreSettings): {\n address?: string;\n port?: number;\n} {\n let address: string | undefined;\n let port: string | undefined;\n\n if (typeof settings.host === 'string') {\n if (settings.host.startsWith('[')) {\n // IPv6 addresses can be enclosed in square brackets, e.g., [2001:db8::1]:8080\n if (settings.host.endsWith(']')) {\n // IPv6 with square brackets without port\n address = settings.host.replace(/^\\[|\\]$/g, '');\n } else if (settings.host.includes(']:')) {\n // IPv6 with square brackets with port\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(1, lastColonIndex).replace(/^\\[|\\]$/g, '');\n port = settings.host.slice(lastColonIndex + 1);\n }\n }\n } else {\n // IPv4 or IPv6 without square brackets\n // If it's an IPv6 address without square brackets, we assume it does not have a port.\n if (net.isIPv6(settings.host)) {\n address = settings.host;\n }\n // If it's an IPv4 address, we can extract the port if it exists.\n else {\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(0, lastColonIndex);\n port = settings.host.slice(lastColonIndex + 1);\n } else {\n address = settings.host;\n }\n }\n }\n }\n return {\n address: address,\n port: port ? parseInt(port, 10) : undefined,\n };\n}\n\nfunction buildAttributes<AppModelType, DbModelType extends DocumentData>(\n reference: CollectionReference<AppModelType, DbModelType> | DocumentReference<AppModelType, DbModelType>,\n): SpanAttributes {\n const firestoreApp: FirebaseApp = reference.firestore.app;\n const firestoreOptions: FirebaseOptions = firestoreApp.options;\n const json: { settings?: FirestoreSettings } = reference.firestore.toJSON() || {};\n const settings: FirestoreSettings = json.settings || {};\n\n const attributes: SpanAttributes = {\n [ATTR_DB_COLLECTION_NAME]: reference.path,\n [ATTR_DB_NAMESPACE]: firestoreApp.name,\n [ATTR_DB_SYSTEM_NAME]: 'firebase.firestore',\n 'firebase.firestore.type': reference.type,\n 'firebase.firestore.options.projectId': firestoreOptions.projectId,\n 'firebase.firestore.options.appId': firestoreOptions.appId,\n 'firebase.firestore.options.messagingSenderId': firestoreOptions.messagingSenderId,\n 'firebase.firestore.options.storageBucket': firestoreOptions.storageBucket,\n };\n\n const { address, port } = getPortAndAddress(settings);\n\n if (address) {\n attributes[ATTR_SERVER_ADDRESS] = address;\n }\n if (port) {\n attributes[ATTR_SERVER_PORT] = port;\n }\n\n return attributes;\n}\n"],"names":[],"mappings":";;;;;;AA4CO,SAAS,cAAA,CACd,0BAAA,EACA,IAAA,EACA,MAAA,EACqC;AACrC,EAAA,MAAM,qBAAqB,IAAI,mCAAA;AAAA,IAC7B,qBAAA;AAAA,IACA,0BAAA;AAAA;AAAA,IAEA,CAAC,aAAA,KAAuB,WAAA,CAAY,aAAA,EAAe,MAAM,MAAM;AAAA,GACjE;AACA,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,iDAAA;AAAA,IACA,iDAAA;AAAA,IACA,mDAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,kBAAA,CAAmB,KAAA,CAAM,IAAA;AAAA,MACvB,IAAI,6BAAA;AAAA,QACF,IAAA;AAAA,QACA,0BAAA;AAAA,QACA,CAAA,aAAA,KAAiB,WAAA,CAAY,aAAA,EAAe,IAAA,EAAM,MAAM,CAAA;AAAA,QACxD,CAAA,aAAA,KAAiB,aAAA,CAAc,aAAA,EAAe,MAAM;AAAA;AACtD,KACF;AAAA,EACF;AAEA,EAAA,OAAO,kBAAA;AACT;AAEA,SAAS,WAAA,CAEP,aAAA,EACA,IAAA,EACA,MAAA,EAEK;AACL,EAAA,aAAA,CAAc,eAAe,MAAM,CAAA;AAEnC,EAAA,IAAA,CAAK,aAAA,EAAe,QAAA,EAAU,WAAA,EAAa,CAAA;AAC3C,EAAA,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,YAAA,EAAc,CAAA;AAC7C,EAAA,IAAA,CAAK,aAAA,EAAe,QAAA,EAAU,WAAA,EAAa,CAAA;AAC3C,EAAA,IAAA,CAAK,aAAA,EAAe,WAAA,EAAa,cAAA,EAAgB,CAAA;AAEjD,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,aAAA,CAEP,eACA,MAAA,EAEK;AACL,EAAA,KAAA,MAAW,UAAU,CAAC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,WAAW,CAAA,EAAG;AAEjE,IAAA,IAAI,SAAA,CAAU,aAAA,CAAc,MAAM,CAAC,CAAA,EAAG;AACpC,MAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,WAAA,GAMkD;AACzD,EAAA,OAAO,SAAS,OAAO,QAAA,EAAiD;AACtE,IAAA,OAAO,SACL,WACA,IAAA,EACuD;AACvD,MAAA,OAAO,mBAAmB,QAAA,EAAU,SAAA,EAAW,MAAM,QAAA,CAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChF,CAAA;AAAA,EACF,CAAA;AACF;AAEA,SAAS,cAAA,GAEsG;AAC7G,EAAA,OAAO,SAAS,UAAU,QAAA,EAAoD;AAC5E,IAAA,OAAO,SAAU,SAAA,EAAwE;AACvF,MAAA,OAAO,kBAAA,CAAmB,aAAa,SAAA,CAAU,MAAA,IAAU,WAAW,MAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IACjG,CAAA;AAAA,EACF,CAAA;AACF;AAEA,SAAS,YAAA,GAK8C;AACrD,EAAA,OAAO,SAAS,QAAQ,QAAA,EAAkD;AACxE,IAAA,OAAO,SACL,SAAA,EACmD;AACnD,MAAA,OAAO,mBAAmB,SAAA,EAAW,SAAA,EAAW,MAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IAC3E,CAAA;AAAA,EACF,CAAA;AACF;AAEA,SAAS,WAAA,GAOU;AACjB,EAAA,OAAO,SAAS,OAAO,QAAA,EAAiD;AACtE,IAAA,OAAO,SACL,SAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,MAAA,OAAO,kBAAA,CAAmB,QAAA,EAAU,SAAA,CAAU,MAAA,IAAU,WAAW,MAAM;AACvE,QAAA,OAAO,OAAO,OAAA,KAAY,WAAA,GAAc,QAAA,CAAS,SAAA,EAAW,MAAM,OAAO,CAAA,GAAI,QAAA,CAAS,SAAA,EAAW,IAAI,CAAA;AAAA,MACvG,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA;AACF;AAEA,SAAS,kBAAA,CACP,QAAA,EACA,SAAA,EACA,QAAA,EACG;AACH,EAAA,OAAO,SAAA;AAAA,IACL;AAAA,MACE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,IAAI,CAAA,CAAA;AAAA,MACnC,EAAA,EAAI,UAAA;AAAA,MACJ,MAAM,SAAA,CAAU,MAAA;AAAA,MAChB,UAAA,EAAY;AAAA,QACV,CAAC,gCAAgC,GAAG,8BAAA;AAAA,QACpC,CAAC,sBAAsB,GAAG,QAAA;AAAA,QAC1B,GAAG,gBAAgB,SAAS;AAAA;AAC9B,KACF;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,kBAAkB,QAAA,EAGhC;AACA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEjC,MAAA,IAAI,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAE/B,QAAA,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAAA,MAChD,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAEvC,QAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACpD,QAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,UAAA,OAAA,GAAU,QAAA,CAAS,KAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AACvE,UAAA,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAGL,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7B,QAAA,OAAA,GAAU,QAAA,CAAS,IAAA;AAAA,MACrB,CAAA,MAEK;AACH,QAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACpD,QAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,UAAA,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AAC/C,UAAA,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA;AAAA,QAC/C,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,QAAA,CAAS,IAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,GAAI;AAAA,GACpC;AACF;AAEA,SAAS,gBACP,SAAA,EACgB;AAChB,EAAA,MAAM,YAAA,GAA4B,UAAU,SAAA,CAAU,GAAA;AACtD,EAAA,MAAM,mBAAoC,YAAA,CAAa,OAAA;AACvD,EAAA,MAAM,IAAA,GAAyC,SAAA,CAAU,SAAA,CAAU,MAAA,MAAY,EAAC;AAChF,EAAA,MAAM,QAAA,GAA8B,IAAA,CAAK,QAAA,IAAY,EAAC;AAEtD,EAAA,MAAM,UAAA,GAA6B;AAAA,IACjC,CAAC,uBAAuB,GAAG,SAAA,CAAU,IAAA;AAAA,IACrC,CAAC,iBAAiB,GAAG,YAAA,CAAa,IAAA;AAAA,IAClC,CAAC,mBAAmB,GAAG,oBAAA;AAAA,IACvB,2BAA2B,SAAA,CAAU,IAAA;AAAA,IACrC,wCAAwC,gBAAA,CAAiB,SAAA;AAAA,IACzD,oCAAoC,gBAAA,CAAiB,KAAA;AAAA,IACrD,gDAAgD,gBAAA,CAAiB,iBAAA;AAAA,IACjE,4CAA4C,gBAAA,CAAiB;AAAA,GAC/D;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,kBAAkB,QAAQ,CAAA;AAEpD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,UAAA,CAAW,mBAAmB,CAAA,GAAI,OAAA;AAAA,EACpC;AACA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,UAAA,CAAW,gBAAgB,CAAA,GAAI,IAAA;AAAA,EACjC;AAEA,EAAA,OAAO,UAAA;AACT;;;;"}