@sentry/node 10.59.0 → 10.61.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 (157) hide show
  1. package/build/cjs/index.js +3 -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/index.js +7 -8
  8. package/build/cjs/integrations/node-fetch/index.js.map +1 -1
  9. package/build/cjs/integrations/node-fetch/vendored/semconv.js +28 -0
  10. package/build/cjs/integrations/node-fetch/vendored/semconv.js.map +1 -0
  11. package/build/cjs/integrations/node-fetch/vendored/undici.js +90 -127
  12. package/build/cjs/integrations/node-fetch/vendored/undici.js.map +1 -1
  13. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js +5 -6
  14. package/build/cjs/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  15. package/build/cjs/integrations/tracing/kafka/index.js +1 -11
  16. package/build/cjs/integrations/tracing/kafka/index.js.map +1 -1
  17. package/build/cjs/integrations/tracing/kafka/vendored/instrumentation.js +45 -247
  18. package/build/cjs/integrations/tracing/kafka/vendored/instrumentation.js.map +1 -1
  19. package/build/cjs/integrations/tracing/kafka/vendored/semconv.js +4 -8
  20. package/build/cjs/integrations/tracing/kafka/vendored/semconv.js.map +1 -1
  21. package/build/cjs/integrations/tracing/kafka/vendored/utils.js +113 -0
  22. package/build/cjs/integrations/tracing/kafka/vendored/utils.js.map +1 -0
  23. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js +1 -2
  24. package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  25. package/build/cjs/integrations/tracing/mongo/vendored/utils.js +1 -2
  26. package/build/cjs/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  27. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js +1 -2
  28. package/build/cjs/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  29. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js +1 -2
  30. package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  31. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js +2 -3
  32. package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  33. package/build/cjs/integrations/tracing/postgres/vendored/utils.js +1 -2
  34. package/build/cjs/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  35. package/build/cjs/integrations/tracing/redis/index.js +4 -2
  36. package/build/cjs/integrations/tracing/redis/index.js.map +1 -1
  37. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +2 -3
  38. package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  39. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +3 -4
  40. package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  41. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js +1 -2
  42. package/build/cjs/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  43. package/build/cjs/sdk/initOtel.js +2 -1
  44. package/build/cjs/sdk/initOtel.js.map +1 -1
  45. package/build/esm/index.js +1 -1
  46. package/build/esm/integrations/fs/index.js +9 -18
  47. package/build/esm/integrations/fs/index.js.map +1 -1
  48. package/build/esm/integrations/fs/vendored/instrumentation.js +111 -162
  49. package/build/esm/integrations/fs/vendored/instrumentation.js.map +1 -1
  50. package/build/esm/integrations/node-fetch/index.js +8 -9
  51. package/build/esm/integrations/node-fetch/index.js.map +1 -1
  52. package/build/esm/integrations/node-fetch/vendored/semconv.js +15 -0
  53. package/build/esm/integrations/node-fetch/vendored/semconv.js.map +1 -0
  54. package/build/esm/integrations/node-fetch/vendored/undici.js +79 -116
  55. package/build/esm/integrations/node-fetch/vendored/undici.js.map +1 -1
  56. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js +6 -7
  57. package/build/esm/integrations/tracing/dataloader/vendored/instrumentation.js.map +1 -1
  58. package/build/esm/integrations/tracing/kafka/index.js +2 -12
  59. package/build/esm/integrations/tracing/kafka/index.js.map +1 -1
  60. package/build/esm/integrations/tracing/kafka/vendored/instrumentation.js +47 -249
  61. package/build/esm/integrations/tracing/kafka/vendored/instrumentation.js.map +1 -1
  62. package/build/esm/integrations/tracing/kafka/vendored/semconv.js +3 -5
  63. package/build/esm/integrations/tracing/kafka/vendored/semconv.js.map +1 -1
  64. package/build/esm/integrations/tracing/kafka/vendored/utils.js +107 -0
  65. package/build/esm/integrations/tracing/kafka/vendored/utils.js.map +1 -0
  66. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js +2 -3
  67. package/build/esm/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
  68. package/build/esm/integrations/tracing/mongo/vendored/utils.js +2 -3
  69. package/build/esm/integrations/tracing/mongo/vendored/utils.js.map +1 -1
  70. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js +2 -3
  71. package/build/esm/integrations/tracing/mongoose/vendored/mongoose.js.map +1 -1
  72. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js +2 -3
  73. package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
  74. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js +3 -4
  75. package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
  76. package/build/esm/integrations/tracing/postgres/vendored/utils.js +2 -3
  77. package/build/esm/integrations/tracing/postgres/vendored/utils.js.map +1 -1
  78. package/build/esm/integrations/tracing/redis/index.js +4 -2
  79. package/build/esm/integrations/tracing/redis/index.js.map +1 -1
  80. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +3 -4
  81. package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
  82. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +4 -5
  83. package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
  84. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js +2 -3
  85. package/build/esm/integrations/tracing/tedious/vendored/instrumentation.js.map +1 -1
  86. package/build/esm/package.json +1 -1
  87. package/build/esm/sdk/initOtel.js +2 -1
  88. package/build/esm/sdk/initOtel.js.map +1 -1
  89. package/build/types/index.d.ts +1 -1
  90. package/build/types/index.d.ts.map +1 -1
  91. package/build/types/integrations/fs/index.d.ts +2 -14
  92. package/build/types/integrations/fs/index.d.ts.map +1 -1
  93. package/build/types/integrations/fs/vendored/instrumentation.d.ts +2 -10
  94. package/build/types/integrations/fs/vendored/instrumentation.d.ts.map +1 -1
  95. package/build/types/integrations/fs/vendored/types.d.ts +1 -2
  96. package/build/types/integrations/fs/vendored/types.d.ts.map +1 -1
  97. package/build/types/integrations/node-fetch/index.d.ts.map +1 -1
  98. package/build/types/integrations/node-fetch/vendored/internal-types.d.ts.map +1 -1
  99. package/build/types/integrations/node-fetch/vendored/semconv.d.ts +13 -0
  100. package/build/types/integrations/node-fetch/vendored/semconv.d.ts.map +1 -0
  101. package/build/types/integrations/node-fetch/vendored/types.d.ts +2 -4
  102. package/build/types/integrations/node-fetch/vendored/types.d.ts.map +1 -1
  103. package/build/types/integrations/node-fetch/vendored/undici.d.ts +6 -7
  104. package/build/types/integrations/node-fetch/vendored/undici.d.ts.map +1 -1
  105. package/build/types/integrations/tracing/dataloader/vendored/instrumentation.d.ts.map +1 -1
  106. package/build/types/integrations/tracing/kafka/index.d.ts.map +1 -1
  107. package/build/types/integrations/tracing/kafka/vendored/instrumentation.d.ts +3 -13
  108. package/build/types/integrations/tracing/kafka/vendored/instrumentation.d.ts.map +1 -1
  109. package/build/types/integrations/tracing/kafka/vendored/kafkajs-types.d.ts +0 -32
  110. package/build/types/integrations/tracing/kafka/vendored/kafkajs-types.d.ts.map +1 -1
  111. package/build/types/integrations/tracing/kafka/vendored/semconv.d.ts +9 -28
  112. package/build/types/integrations/tracing/kafka/vendored/semconv.d.ts.map +1 -1
  113. package/build/types/integrations/tracing/kafka/vendored/utils.d.ts +29 -0
  114. package/build/types/integrations/tracing/kafka/vendored/utils.d.ts.map +1 -0
  115. package/build/types/integrations/tracing/knex/vendored/instrumentation.d.ts.map +1 -1
  116. package/build/types/integrations/tracing/mongo/vendored/utils.d.ts.map +1 -1
  117. package/build/types/integrations/tracing/mongoose/vendored/mongoose.d.ts.map +1 -1
  118. package/build/types/integrations/tracing/mysql2/vendored/instrumentation.d.ts.map +1 -1
  119. package/build/types/integrations/tracing/postgres/vendored/instrumentation.d.ts.map +1 -1
  120. package/build/types/integrations/tracing/postgres/vendored/utils.d.ts.map +1 -1
  121. package/build/types/integrations/tracing/redis/index.d.ts.map +1 -1
  122. package/build/types/integrations/tracing/redis/vendored/ioredis-instrumentation.d.ts.map +1 -1
  123. package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -1
  124. package/build/types/integrations/tracing/tedious/vendored/instrumentation.d.ts.map +1 -1
  125. package/build/types/sdk/initOtel.d.ts.map +1 -1
  126. package/build/types-ts3.8/index.d.ts +1 -1
  127. package/build/types-ts3.8/integrations/fs/index.d.ts +2 -14
  128. package/build/types-ts3.8/integrations/fs/vendored/instrumentation.d.ts +2 -10
  129. package/build/types-ts3.8/integrations/fs/vendored/types.d.ts +1 -2
  130. package/build/types-ts3.8/integrations/node-fetch/vendored/semconv.d.ts +13 -0
  131. package/build/types-ts3.8/integrations/node-fetch/vendored/types.d.ts +2 -4
  132. package/build/types-ts3.8/integrations/node-fetch/vendored/undici.d.ts +6 -7
  133. package/build/types-ts3.8/integrations/tracing/kafka/vendored/instrumentation.d.ts +3 -13
  134. package/build/types-ts3.8/integrations/tracing/kafka/vendored/kafkajs-types.d.ts +0 -32
  135. package/build/types-ts3.8/integrations/tracing/kafka/vendored/semconv.d.ts +9 -28
  136. package/build/types-ts3.8/integrations/tracing/kafka/vendored/utils.d.ts +29 -0
  137. package/package.json +5 -6
  138. package/build/cjs/integrations/tracing/kafka/vendored/internal-types.js +0 -6
  139. package/build/cjs/integrations/tracing/kafka/vendored/internal-types.js.map +0 -1
  140. package/build/cjs/integrations/tracing/kafka/vendored/propagator.js +0 -22
  141. package/build/cjs/integrations/tracing/kafka/vendored/propagator.js.map +0 -1
  142. package/build/esm/integrations/tracing/kafka/vendored/internal-types.js +0 -4
  143. package/build/esm/integrations/tracing/kafka/vendored/internal-types.js.map +0 -1
  144. package/build/esm/integrations/tracing/kafka/vendored/propagator.js +0 -20
  145. package/build/esm/integrations/tracing/kafka/vendored/propagator.js.map +0 -1
  146. package/build/types/integrations/tracing/kafka/vendored/internal-types.d.ts +0 -9
  147. package/build/types/integrations/tracing/kafka/vendored/internal-types.d.ts.map +0 -1
  148. package/build/types/integrations/tracing/kafka/vendored/propagator.d.ts +0 -3
  149. package/build/types/integrations/tracing/kafka/vendored/propagator.d.ts.map +0 -1
  150. package/build/types/integrations/tracing/kafka/vendored/types.d.ts +0 -26
  151. package/build/types/integrations/tracing/kafka/vendored/types.d.ts.map +0 -1
  152. package/build/types/integrations/tracing/utils/sql-common.d.ts +0 -3
  153. package/build/types/integrations/tracing/utils/sql-common.d.ts.map +0 -1
  154. package/build/types-ts3.8/integrations/tracing/kafka/vendored/internal-types.d.ts +0 -9
  155. package/build/types-ts3.8/integrations/tracing/kafka/vendored/propagator.d.ts +0 -3
  156. package/build/types-ts3.8/integrations/tracing/kafka/vendored/types.d.ts +0 -26
  157. package/build/types-ts3.8/integrations/tracing/utils/sql-common.d.ts +0 -3
@@ -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,19 +1,9 @@
1
1
  import { KafkaJsInstrumentation } from './vendored/instrumentation.js';
2
2
  import { defineIntegration } from '@sentry/core';
3
- import { generateInstrumentOnce, addOriginToSpan } from '@sentry/node-core';
3
+ import { generateInstrumentOnce } from '@sentry/node-core';
4
4
 
5
5
  const INTEGRATION_NAME = "Kafka";
6
- const instrumentKafka = generateInstrumentOnce(
7
- INTEGRATION_NAME,
8
- () => new KafkaJsInstrumentation({
9
- consumerHook(span) {
10
- addOriginToSpan(span, "auto.kafkajs.otel.consumer");
11
- },
12
- producerHook(span) {
13
- addOriginToSpan(span, "auto.kafkajs.otel.producer");
14
- }
15
- })
16
- );
6
+ const instrumentKafka = generateInstrumentOnce(INTEGRATION_NAME, () => new KafkaJsInstrumentation());
17
7
  const _kafkaIntegration = (() => {
18
8
  return {
19
9
  name: INTEGRATION_NAME,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/kafka/index.ts"],"sourcesContent":["import { KafkaJsInstrumentation } from './vendored/instrumentation';\nimport type { IntegrationFn } from '@sentry/core';\nimport { defineIntegration } from '@sentry/core';\nimport { addOriginToSpan, generateInstrumentOnce } from '@sentry/node-core';\n\nconst INTEGRATION_NAME = 'Kafka';\n\nexport const instrumentKafka = generateInstrumentOnce(\n INTEGRATION_NAME,\n () =>\n new KafkaJsInstrumentation({\n consumerHook(span) {\n addOriginToSpan(span, 'auto.kafkajs.otel.consumer');\n },\n producerHook(span) {\n addOriginToSpan(span, 'auto.kafkajs.otel.producer');\n },\n }),\n);\n\nconst _kafkaIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentKafka();\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for the [kafkajs](https://www.npmjs.com/package/kafkajs) library.\n *\n * For more information, see the [`kafkaIntegration` documentation](https://docs.sentry.io/platforms/javascript/guides/node/configuration/integrations/kafka/).\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n *\n * Sentry.init({\n * integrations: [Sentry.kafkaIntegration()],\n * });\n */\nexport const kafkaIntegration = defineIntegration(_kafkaIntegration);\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAA,GAAmB,OAAA;AAElB,MAAM,eAAA,GAAkB,sBAAA;AAAA,EAC7B,gBAAA;AAAA,EACA,MACE,IAAI,sBAAA,CAAuB;AAAA,IACzB,aAAa,IAAA,EAAM;AACjB,MAAA,eAAA,CAAgB,MAAM,4BAA4B,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,aAAa,IAAA,EAAM;AACjB,MAAA,eAAA,CAAgB,MAAM,4BAA4B,CAAA;AAAA,IACpD;AAAA,GACD;AACL;AAEA,MAAM,qBAAqB,MAAM;AAC/B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,GACF;AACF,CAAA,CAAA;AAeO,MAAM,gBAAA,GAAmB,kBAAkB,iBAAiB;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/kafka/index.ts"],"sourcesContent":["import { KafkaJsInstrumentation } from './vendored/instrumentation';\nimport type { IntegrationFn } from '@sentry/core';\nimport { defineIntegration } from '@sentry/core';\nimport { generateInstrumentOnce } from '@sentry/node-core';\n\nconst INTEGRATION_NAME = 'Kafka';\n\nexport const instrumentKafka = generateInstrumentOnce(INTEGRATION_NAME, () => new KafkaJsInstrumentation());\n\nconst _kafkaIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentKafka();\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for the [kafkajs](https://www.npmjs.com/package/kafkajs) library.\n *\n * For more information, see the [`kafkaIntegration` documentation](https://docs.sentry.io/platforms/javascript/guides/node/configuration/integrations/kafka/).\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n *\n * Sentry.init({\n * integrations: [Sentry.kafkaIntegration()],\n * });\n */\nexport const kafkaIntegration = defineIntegration(_kafkaIntegration);\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAA,GAAmB,OAAA;AAElB,MAAM,kBAAkB,sBAAA,CAAuB,gBAAA,EAAkB,MAAM,IAAI,wBAAwB;AAE1G,MAAM,qBAAqB,MAAM;AAC/B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,GACF;AACF,CAAA,CAAA;AAeO,MAAM,gBAAA,GAAmB,kBAAkB,iBAAiB;;;;"}
@@ -1,43 +1,13 @@
1
- import { propagation, ROOT_CONTEXT, context, trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';
2
- import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
3
- import { ATTR_SERVER_PORT, ATTR_SERVER_ADDRESS, ERROR_TYPE_VALUE_OTHER, ATTR_ERROR_TYPE } from '@opentelemetry/semantic-conventions';
4
- import { EVENT_LISTENERS_SET } from './internal-types.js';
5
- import { bufferTextMapGetter } from './propagator.js';
6
- import { METRIC_MESSAGING_CLIENT_OPERATION_DURATION, METRIC_MESSAGING_CLIENT_SENT_MESSAGES, METRIC_MESSAGING_CLIENT_CONSUMED_MESSAGES, METRIC_MESSAGING_PROCESS_DURATION, MESSAGING_SYSTEM_VALUE_KAFKA, ATTR_MESSAGING_OPERATION_NAME, ATTR_MESSAGING_SYSTEM, MESSAGING_OPERATION_TYPE_VALUE_PROCESS, ATTR_MESSAGING_DESTINATION_PARTITION_ID, ATTR_MESSAGING_DESTINATION_NAME, MESSAGING_OPERATION_TYPE_VALUE_RECEIVE, ATTR_MESSAGING_BATCH_MESSAGE_COUNT, ATTR_MESSAGING_KAFKA_OFFSET, ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE, ATTR_MESSAGING_KAFKA_MESSAGE_KEY, ATTR_MESSAGING_OPERATION_TYPE, MESSAGING_OPERATION_TYPE_VALUE_SEND } from './semconv.js';
7
- import { SDK_VERSION } from '@sentry/core';
1
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation';
2
+ import { SDK_VERSION, continueTrace, withActiveSpan, startNewTrace, startInactiveSpan, SPAN_STATUS_ERROR, SPAN_STATUS_OK } from '@sentry/core';
3
+ import { ATTR_MESSAGING_DESTINATION_PARTITION_ID, ATTR_MESSAGING_BATCH_MESSAGE_COUNT, MESSAGING_OPERATION_TYPE_VALUE_PROCESS, MESSAGING_OPERATION_TYPE_VALUE_RECEIVE } from './semconv.js';
4
+ import { getHeaderAsString, startConsumerSpan, endSpansOnPromise, getLinksFromHeaders, startProducerSpan } from './utils.js';
8
5
 
9
6
  const PACKAGE_NAME = "@sentry/instrumentation-kafkajs";
10
- function prepareCounter(meter, value, attributes) {
11
- return (errorType) => {
12
- meter.add(value, {
13
- ...attributes,
14
- ...errorType ? { [ATTR_ERROR_TYPE]: errorType } : {}
15
- });
16
- };
17
- }
18
- function prepareDurationHistogram(meter, value, attributes) {
19
- return (errorType) => {
20
- meter.record((Date.now() - value) / 1e3, {
21
- ...attributes,
22
- ...errorType ? { [ATTR_ERROR_TYPE]: errorType } : {}
23
- });
24
- };
25
- }
26
- const HISTOGRAM_BUCKET_BOUNDARIES = [5e-3, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10];
27
7
  class KafkaJsInstrumentation extends InstrumentationBase {
28
8
  constructor(config = {}) {
29
9
  super(PACKAGE_NAME, SDK_VERSION, config);
30
10
  }
31
- _updateMetricInstruments() {
32
- this._clientDuration = this.meter.createHistogram(METRIC_MESSAGING_CLIENT_OPERATION_DURATION, {
33
- advice: { explicitBucketBoundaries: HISTOGRAM_BUCKET_BOUNDARIES }
34
- });
35
- this._sentMessages = this.meter.createCounter(METRIC_MESSAGING_CLIENT_SENT_MESSAGES);
36
- this._consumedMessages = this.meter.createCounter(METRIC_MESSAGING_CLIENT_CONSUMED_MESSAGES);
37
- this._processDuration = this.meter.createHistogram(METRIC_MESSAGING_PROCESS_DURATION, {
38
- advice: { explicitBucketBoundaries: HISTOGRAM_BUCKET_BOUNDARIES }
39
- });
40
- }
41
11
  init() {
42
12
  const unpatch = (moduleExports) => {
43
13
  if (isWrapped(moduleExports?.Kafka?.prototype.producer)) {
@@ -69,27 +39,10 @@ class KafkaJsInstrumentation extends InstrumentationBase {
69
39
  instrumentation._unwrap(newConsumer, "run");
70
40
  }
71
41
  instrumentation._wrap(newConsumer, "run", instrumentation._getConsumerRunPatch());
72
- instrumentation._setKafkaEventListeners(newConsumer);
73
42
  return newConsumer;
74
43
  };
75
44
  };
76
45
  }
77
- _setKafkaEventListeners(kafkaObj) {
78
- if (kafkaObj[EVENT_LISTENERS_SET]) return;
79
- if (kafkaObj.events?.REQUEST) {
80
- kafkaObj.on(kafkaObj.events.REQUEST, this._recordClientDurationMetric.bind(this));
81
- }
82
- kafkaObj[EVENT_LISTENERS_SET] = true;
83
- }
84
- _recordClientDurationMetric(event) {
85
- const [address = "", port = "0"] = event.payload.broker.split(":");
86
- this._clientDuration.record(event.payload.duration / 1e3, {
87
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
88
- [ATTR_MESSAGING_OPERATION_NAME]: `${event.payload.apiName}`,
89
- [ATTR_SERVER_ADDRESS]: address,
90
- [ATTR_SERVER_PORT]: Number.parseInt(port, 10)
91
- });
92
- }
93
46
  _getProducerPatch() {
94
47
  const instrumentation = this;
95
48
  return (original) => {
@@ -107,7 +60,6 @@ class KafkaJsInstrumentation extends InstrumentationBase {
107
60
  instrumentation._unwrap(newProducer, "transaction");
108
61
  }
109
62
  instrumentation._wrap(newProducer, "transaction", instrumentation._getProducerTransactionPatch());
110
- instrumentation._setKafkaEventListeners(newProducer);
111
63
  return newProducer;
112
64
  };
113
65
  };
@@ -134,103 +86,60 @@ class KafkaJsInstrumentation extends InstrumentationBase {
134
86
  };
135
87
  }
136
88
  _getConsumerEachMessagePatch() {
137
- const instrumentation = this;
138
89
  return (original) => {
139
90
  return function eachMessage(...args) {
140
91
  const payload = args[0];
141
- const propagatedContext = propagation.extract(
142
- ROOT_CONTEXT,
143
- payload.message.headers,
144
- bufferTextMapGetter
145
- );
146
- const span = instrumentation._startConsumerSpan({
147
- topic: payload.topic,
148
- message: payload.message,
149
- operationType: MESSAGING_OPERATION_TYPE_VALUE_PROCESS,
150
- ctx: propagatedContext,
151
- attributes: {
152
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.partition)
153
- }
154
- });
155
- const pendingMetrics = [
156
- prepareDurationHistogram(instrumentation._processDuration, Date.now(), {
157
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
158
- [ATTR_MESSAGING_OPERATION_NAME]: "process",
159
- [ATTR_MESSAGING_DESTINATION_NAME]: payload.topic,
160
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.partition)
161
- }),
162
- prepareCounter(instrumentation._consumedMessages, 1, {
163
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
164
- [ATTR_MESSAGING_OPERATION_NAME]: "process",
165
- [ATTR_MESSAGING_DESTINATION_NAME]: payload.topic,
166
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.partition)
167
- })
168
- ];
169
- const eachMessagePromise = context.with(trace.setSpan(propagatedContext, span), () => {
170
- return original.apply(this, args);
92
+ const sentryTrace = getHeaderAsString(payload.message.headers, "sentry-trace");
93
+ const baggage = getHeaderAsString(payload.message.headers, "baggage");
94
+ return continueTrace({ sentryTrace, baggage }, () => {
95
+ const span = startConsumerSpan({
96
+ topic: payload.topic,
97
+ message: payload.message,
98
+ operationType: MESSAGING_OPERATION_TYPE_VALUE_PROCESS,
99
+ attributes: {
100
+ [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.partition)
101
+ }
102
+ });
103
+ const eachMessagePromise = withActiveSpan(span, () => {
104
+ return original.apply(this, args);
105
+ });
106
+ return endSpansOnPromise([span], eachMessagePromise);
171
107
  });
172
- return instrumentation._endSpansOnPromise([span], pendingMetrics, eachMessagePromise);
173
108
  };
174
109
  };
175
110
  }
176
111
  _getConsumerEachBatchPatch() {
177
112
  return (original) => {
178
- const instrumentation = this;
179
113
  return function eachBatch(...args) {
180
114
  const payload = args[0];
181
- const receivingSpan = instrumentation._startConsumerSpan({
182
- topic: payload.batch.topic,
183
- message: void 0,
184
- operationType: MESSAGING_OPERATION_TYPE_VALUE_RECEIVE,
185
- ctx: ROOT_CONTEXT,
186
- attributes: {
187
- [ATTR_MESSAGING_BATCH_MESSAGE_COUNT]: payload.batch.messages.length,
188
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.batch.partition)
189
- }
190
- });
191
- return context.with(trace.setSpan(context.active(), receivingSpan), () => {
192
- const startTime = Date.now();
193
- const spans = [];
194
- const pendingMetrics = [
195
- prepareCounter(instrumentation._consumedMessages, payload.batch.messages.length, {
196
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
197
- [ATTR_MESSAGING_OPERATION_NAME]: "process",
198
- [ATTR_MESSAGING_DESTINATION_NAME]: payload.batch.topic,
115
+ const receivingSpan = startNewTrace(
116
+ () => startConsumerSpan({
117
+ topic: payload.batch.topic,
118
+ message: void 0,
119
+ operationType: MESSAGING_OPERATION_TYPE_VALUE_RECEIVE,
120
+ attributes: {
121
+ [ATTR_MESSAGING_BATCH_MESSAGE_COUNT]: payload.batch.messages.length,
199
122
  [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.batch.partition)
200
- })
201
- ];
202
- payload.batch.messages.forEach((message) => {
203
- const propagatedContext = propagation.extract(ROOT_CONTEXT, message.headers, bufferTextMapGetter);
204
- const spanContext = trace.getSpan(propagatedContext)?.spanContext();
205
- let origSpanLink;
206
- if (spanContext) {
207
- origSpanLink = {
208
- context: spanContext
209
- };
210
123
  }
124
+ })
125
+ );
126
+ return withActiveSpan(receivingSpan, () => {
127
+ const spans = [receivingSpan];
128
+ payload.batch.messages.forEach((message) => {
211
129
  spans.push(
212
- instrumentation._startConsumerSpan({
130
+ startConsumerSpan({
213
131
  topic: payload.batch.topic,
214
132
  message,
215
133
  operationType: MESSAGING_OPERATION_TYPE_VALUE_PROCESS,
216
- link: origSpanLink,
134
+ links: getLinksFromHeaders(message.headers),
217
135
  attributes: {
218
136
  [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.batch.partition)
219
137
  }
220
138
  })
221
139
  );
222
- pendingMetrics.push(
223
- prepareDurationHistogram(instrumentation._processDuration, startTime, {
224
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
225
- [ATTR_MESSAGING_OPERATION_NAME]: "process",
226
- [ATTR_MESSAGING_DESTINATION_NAME]: payload.batch.topic,
227
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(payload.batch.partition)
228
- })
229
- );
230
140
  });
231
141
  const batchMessagePromise = original.apply(this, args);
232
- spans.unshift(receivingSpan);
233
- return instrumentation._endSpansOnPromise(spans, pendingMetrics, batchMessagePromise);
142
+ return endSpansOnPromise(spans, batchMessagePromise);
234
143
  });
235
144
  };
236
145
  };
@@ -239,33 +148,31 @@ class KafkaJsInstrumentation extends InstrumentationBase {
239
148
  const instrumentation = this;
240
149
  return (original) => {
241
150
  return function transaction(...args) {
242
- const transactionSpan = instrumentation.tracer.startSpan("transaction");
151
+ const transactionSpan = startInactiveSpan({ name: "transaction" });
243
152
  const transactionPromise = original.apply(this, args);
244
153
  transactionPromise.then((transaction2) => {
245
154
  const originalSend = transaction2.send;
246
155
  transaction2.send = function send(...args2) {
247
- return context.with(trace.setSpan(context.active(), transactionSpan), () => {
156
+ return withActiveSpan(transactionSpan, () => {
248
157
  const patched = instrumentation._getSendPatch()(originalSend);
249
158
  return patched.apply(this, args2).catch((err) => {
250
159
  transactionSpan.setStatus({
251
- code: SpanStatusCode.ERROR,
160
+ code: SPAN_STATUS_ERROR,
252
161
  message: err?.message
253
162
  });
254
- transactionSpan.recordException(err);
255
163
  throw err;
256
164
  });
257
165
  });
258
166
  };
259
167
  const originalSendBatch = transaction2.sendBatch;
260
168
  transaction2.sendBatch = function sendBatch(...args2) {
261
- return context.with(trace.setSpan(context.active(), transactionSpan), () => {
169
+ return withActiveSpan(transactionSpan, () => {
262
170
  const patched = instrumentation._getSendBatchPatch()(originalSendBatch);
263
171
  return patched.apply(this, args2).catch((err) => {
264
172
  transactionSpan.setStatus({
265
- code: SpanStatusCode.ERROR,
173
+ code: SPAN_STATUS_ERROR,
266
174
  message: err?.message
267
175
  });
268
- transactionSpan.recordException(err);
269
176
  throw err;
270
177
  });
271
178
  });
@@ -273,21 +180,20 @@ class KafkaJsInstrumentation extends InstrumentationBase {
273
180
  const originalCommit = transaction2.commit;
274
181
  transaction2.commit = function commit(...args2) {
275
182
  const originCommitPromise = originalCommit.apply(this, args2).then(() => {
276
- transactionSpan.setStatus({ code: SpanStatusCode.OK });
183
+ transactionSpan.setStatus({ code: SPAN_STATUS_OK });
277
184
  });
278
- return instrumentation._endSpansOnPromise([transactionSpan], [], originCommitPromise);
185
+ return endSpansOnPromise([transactionSpan], originCommitPromise);
279
186
  };
280
187
  const originalAbort = transaction2.abort;
281
188
  transaction2.abort = function abort(...args2) {
282
189
  const originAbortPromise = originalAbort.apply(this, args2);
283
- return instrumentation._endSpansOnPromise([transactionSpan], [], originAbortPromise);
190
+ return endSpansOnPromise([transactionSpan], originAbortPromise);
284
191
  };
285
192
  }).catch((err) => {
286
193
  transactionSpan.setStatus({
287
- code: SpanStatusCode.ERROR,
194
+ code: SPAN_STATUS_ERROR,
288
195
  message: err?.message
289
196
  });
290
- transactionSpan.recordException(err);
291
197
  transactionSpan.end();
292
198
  });
293
199
  return transactionPromise;
@@ -295,141 +201,33 @@ class KafkaJsInstrumentation extends InstrumentationBase {
295
201
  };
296
202
  }
297
203
  _getSendBatchPatch() {
298
- const instrumentation = this;
299
204
  return (original) => {
300
205
  return function sendBatch(...args) {
301
206
  const batch = args[0];
302
207
  const messages = batch.topicMessages || [];
303
208
  const spans = [];
304
- const pendingMetrics = [];
305
209
  messages.forEach((topicMessage) => {
306
210
  topicMessage.messages.forEach((message) => {
307
- spans.push(instrumentation._startProducerSpan(topicMessage.topic, message));
308
- pendingMetrics.push(
309
- prepareCounter(instrumentation._sentMessages, 1, {
310
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
311
- [ATTR_MESSAGING_OPERATION_NAME]: "send",
312
- [ATTR_MESSAGING_DESTINATION_NAME]: topicMessage.topic,
313
- ...message.partition !== void 0 ? {
314
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(message.partition)
315
- } : {}
316
- })
317
- );
211
+ spans.push(startProducerSpan(topicMessage.topic, message));
318
212
  });
319
213
  });
320
214
  const origSendResult = original.apply(this, args);
321
- return instrumentation._endSpansOnPromise(spans, pendingMetrics, origSendResult);
215
+ return endSpansOnPromise(spans, origSendResult);
322
216
  };
323
217
  };
324
218
  }
325
219
  _getSendPatch() {
326
- const instrumentation = this;
327
220
  return (original) => {
328
221
  return function send(...args) {
329
222
  const record = args[0];
330
223
  const spans = record.messages.map((message) => {
331
- return instrumentation._startProducerSpan(record.topic, message);
224
+ return startProducerSpan(record.topic, message);
332
225
  });
333
- const pendingMetrics = record.messages.map(
334
- (m) => prepareCounter(instrumentation._sentMessages, 1, {
335
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
336
- [ATTR_MESSAGING_OPERATION_NAME]: "send",
337
- [ATTR_MESSAGING_DESTINATION_NAME]: record.topic,
338
- ...m.partition !== void 0 ? {
339
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: String(m.partition)
340
- } : {}
341
- })
342
- );
343
226
  const origSendResult = original.apply(this, args);
344
- return instrumentation._endSpansOnPromise(spans, pendingMetrics, origSendResult);
227
+ return endSpansOnPromise(spans, origSendResult);
345
228
  };
346
229
  };
347
230
  }
348
- _endSpansOnPromise(spans, pendingMetrics, sendPromise) {
349
- return Promise.resolve(sendPromise).then((result) => {
350
- pendingMetrics.forEach((m) => m());
351
- return result;
352
- }).catch((reason) => {
353
- let errorMessage;
354
- let errorType = ERROR_TYPE_VALUE_OTHER;
355
- if (typeof reason === "string" || reason === void 0) {
356
- errorMessage = reason;
357
- } else if (typeof reason === "object" && Object.prototype.hasOwnProperty.call(reason, "message")) {
358
- errorMessage = reason.message;
359
- errorType = reason.constructor.name;
360
- }
361
- pendingMetrics.forEach((m) => m(errorType));
362
- spans.forEach((span) => {
363
- span.setAttribute(ATTR_ERROR_TYPE, errorType);
364
- span.setStatus({
365
- code: SpanStatusCode.ERROR,
366
- message: errorMessage
367
- });
368
- });
369
- throw reason;
370
- }).finally(() => {
371
- spans.forEach((span) => span.end());
372
- });
373
- }
374
- _startConsumerSpan({ topic, message, operationType, ctx, link, attributes }) {
375
- const operationName = operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? "poll" : operationType;
376
- const span = this.tracer.startSpan(
377
- `${operationName} ${topic}`,
378
- {
379
- kind: operationType === MESSAGING_OPERATION_TYPE_VALUE_RECEIVE ? SpanKind.CLIENT : SpanKind.CONSUMER,
380
- attributes: {
381
- ...attributes,
382
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
383
- [ATTR_MESSAGING_DESTINATION_NAME]: topic,
384
- [ATTR_MESSAGING_OPERATION_TYPE]: operationType,
385
- [ATTR_MESSAGING_OPERATION_NAME]: operationName,
386
- [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message?.key ? String(message.key) : void 0,
387
- [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message?.key && message.value === null ? true : void 0,
388
- [ATTR_MESSAGING_KAFKA_OFFSET]: message?.offset
389
- },
390
- links: link ? [link] : []
391
- },
392
- ctx
393
- );
394
- const { consumerHook } = this.getConfig();
395
- if (consumerHook && message) {
396
- safeExecuteInTheMiddle(
397
- () => consumerHook(span, { topic, message }),
398
- (e) => {
399
- if (e) this._diag.error("consumerHook error", e);
400
- },
401
- true
402
- );
403
- }
404
- return span;
405
- }
406
- _startProducerSpan(topic, message) {
407
- const span = this.tracer.startSpan(`send ${topic}`, {
408
- kind: SpanKind.PRODUCER,
409
- attributes: {
410
- [ATTR_MESSAGING_SYSTEM]: MESSAGING_SYSTEM_VALUE_KAFKA,
411
- [ATTR_MESSAGING_DESTINATION_NAME]: topic,
412
- [ATTR_MESSAGING_KAFKA_MESSAGE_KEY]: message.key ? String(message.key) : void 0,
413
- [ATTR_MESSAGING_KAFKA_MESSAGE_TOMBSTONE]: message.key && message.value === null ? true : void 0,
414
- [ATTR_MESSAGING_DESTINATION_PARTITION_ID]: message.partition !== void 0 ? String(message.partition) : void 0,
415
- [ATTR_MESSAGING_OPERATION_NAME]: "send",
416
- [ATTR_MESSAGING_OPERATION_TYPE]: MESSAGING_OPERATION_TYPE_VALUE_SEND
417
- }
418
- });
419
- message.headers = message.headers ?? {};
420
- propagation.inject(trace.setSpan(context.active(), span), message.headers);
421
- const { producerHook } = this.getConfig();
422
- if (producerHook) {
423
- safeExecuteInTheMiddle(
424
- () => producerHook(span, { topic, message }),
425
- (e) => {
426
- if (e) this._diag.error("producerHook error", e);
427
- },
428
- true
429
- );
430
- }
431
- return span;
432
- }
433
231
  }
434
232
 
435
233
  export { KafkaJsInstrumentation };