dd-trace 5.103.0 → 5.105.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 (213) hide show
  1. package/LICENSE-3rdparty.csv +90 -102
  2. package/index.d.ts +107 -6
  3. package/package.json +18 -17
  4. package/packages/datadog-core/src/storage.js +1 -1
  5. package/packages/datadog-instrumentations/src/aerospike.js +1 -1
  6. package/packages/datadog-instrumentations/src/ai.js +8 -7
  7. package/packages/datadog-instrumentations/src/aws-sdk.js +15 -2
  8. package/packages/datadog-instrumentations/src/azure-cosmos.js +7 -0
  9. package/packages/datadog-instrumentations/src/azure-functions.js +3 -0
  10. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -2
  11. package/packages/datadog-instrumentations/src/cucumber.js +181 -35
  12. package/packages/datadog-instrumentations/src/dns.js +54 -18
  13. package/packages/datadog-instrumentations/src/elasticsearch.js +4 -4
  14. package/packages/datadog-instrumentations/src/fastify.js +142 -82
  15. package/packages/datadog-instrumentations/src/graphql.js +188 -67
  16. package/packages/datadog-instrumentations/src/grpc/client.js +48 -32
  17. package/packages/datadog-instrumentations/src/helpers/ai-messages.js +322 -14
  18. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +1 -1
  19. package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -0
  20. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -1
  21. package/packages/datadog-instrumentations/src/helpers/kafka.js +17 -0
  22. package/packages/datadog-instrumentations/src/helpers/openai-ai-guard.js +269 -0
  23. package/packages/datadog-instrumentations/src/helpers/promise-instrumentor.js +42 -0
  24. package/packages/datadog-instrumentations/src/helpers/register.js +1 -1
  25. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +3 -2
  26. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +19 -6
  27. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/azure-cosmos.js +50 -0
  28. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -0
  29. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langgraph.js +4 -2
  30. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +85 -0
  31. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +31 -229
  32. package/packages/datadog-instrumentations/src/hono.js +54 -3
  33. package/packages/datadog-instrumentations/src/http/client.js +2 -2
  34. package/packages/datadog-instrumentations/src/http/server.js +9 -4
  35. package/packages/datadog-instrumentations/src/ioredis.js +3 -3
  36. package/packages/datadog-instrumentations/src/jest/coverage-backfill.js +163 -0
  37. package/packages/datadog-instrumentations/src/jest.js +390 -183
  38. package/packages/datadog-instrumentations/src/kafkajs.js +140 -17
  39. package/packages/datadog-instrumentations/src/mariadb.js +1 -1
  40. package/packages/datadog-instrumentations/src/memcached.js +2 -1
  41. package/packages/datadog-instrumentations/src/mocha/main.js +399 -107
  42. package/packages/datadog-instrumentations/src/mocha/utils.js +48 -8
  43. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  44. package/packages/datadog-instrumentations/src/mongoose.js +10 -12
  45. package/packages/datadog-instrumentations/src/mysql.js +2 -2
  46. package/packages/datadog-instrumentations/src/mysql2.js +1 -1
  47. package/packages/datadog-instrumentations/src/nats.js +182 -0
  48. package/packages/datadog-instrumentations/src/nyc.js +38 -1
  49. package/packages/datadog-instrumentations/src/openai.js +33 -18
  50. package/packages/datadog-instrumentations/src/oracledb.js +6 -1
  51. package/packages/datadog-instrumentations/src/pg.js +1 -1
  52. package/packages/datadog-instrumentations/src/pino.js +17 -5
  53. package/packages/datadog-instrumentations/src/playwright.js +537 -297
  54. package/packages/datadog-instrumentations/src/router.js +80 -34
  55. package/packages/datadog-instrumentations/src/stripe.js +1 -1
  56. package/packages/datadog-instrumentations/src/vitest.js +246 -149
  57. package/packages/datadog-plugin-avsc/src/schema_iterator.js +1 -1
  58. package/packages/datadog-plugin-azure-cosmos/src/index.js +144 -0
  59. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +1 -1
  60. package/packages/datadog-plugin-azure-functions/src/index.js +5 -2
  61. package/packages/datadog-plugin-azure-service-bus/src/producer.js +1 -1
  62. package/packages/datadog-plugin-bunyan/src/index.js +28 -0
  63. package/packages/datadog-plugin-cucumber/src/index.js +17 -3
  64. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +223 -45
  65. package/packages/datadog-plugin-cypress/src/support.js +69 -1
  66. package/packages/datadog-plugin-dns/src/lookup.js +8 -6
  67. package/packages/datadog-plugin-elasticsearch/src/index.js +28 -8
  68. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +1 -1
  69. package/packages/datadog-plugin-graphql/src/execute.js +2 -0
  70. package/packages/datadog-plugin-graphql/src/resolve.js +64 -67
  71. package/packages/datadog-plugin-graphql/src/utils.js +4 -1
  72. package/packages/datadog-plugin-http/src/server.js +40 -15
  73. package/packages/datadog-plugin-jest/src/index.js +11 -3
  74. package/packages/datadog-plugin-jest/src/util.js +15 -8
  75. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +1 -1
  76. package/packages/datadog-plugin-kafkajs/src/producer.js +35 -0
  77. package/packages/datadog-plugin-langgraph/src/stream.js +1 -1
  78. package/packages/datadog-plugin-mocha/src/index.js +19 -4
  79. package/packages/datadog-plugin-mongodb-core/src/index.js +311 -35
  80. package/packages/datadog-plugin-nats/src/consumer.js +43 -0
  81. package/packages/datadog-plugin-nats/src/index.js +20 -0
  82. package/packages/datadog-plugin-nats/src/producer.js +62 -0
  83. package/packages/datadog-plugin-nats/src/util.js +33 -0
  84. package/packages/datadog-plugin-next/src/index.js +5 -3
  85. package/packages/datadog-plugin-openai/src/tracing.js +15 -2
  86. package/packages/datadog-plugin-oracledb/src/index.js +13 -2
  87. package/packages/datadog-plugin-pino/src/index.js +42 -0
  88. package/packages/datadog-plugin-playwright/src/index.js +4 -4
  89. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  90. package/packages/datadog-plugin-redis/src/index.js +37 -2
  91. package/packages/datadog-plugin-rhea/src/producer.js +1 -1
  92. package/packages/datadog-plugin-router/src/index.js +33 -44
  93. package/packages/datadog-plugin-selenium/src/index.js +1 -1
  94. package/packages/datadog-plugin-undici/src/index.js +19 -0
  95. package/packages/datadog-plugin-vitest/src/index.js +24 -20
  96. package/packages/datadog-plugin-winston/src/index.js +30 -0
  97. package/packages/datadog-shimmer/src/shimmer.js +49 -21
  98. package/packages/dd-trace/src/aiguard/index.js +1 -1
  99. package/packages/dd-trace/src/aiguard/sdk.js +1 -1
  100. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  101. package/packages/dd-trace/src/appsec/blocking.js +2 -2
  102. package/packages/dd-trace/src/appsec/index.js +11 -4
  103. package/packages/dd-trace/src/appsec/reporter.js +24 -11
  104. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  105. package/packages/dd-trace/src/appsec/sdk/utils.js +1 -1
  106. package/packages/dd-trace/src/appsec/user_tracking.js +5 -4
  107. package/packages/dd-trace/src/baggage.js +7 -1
  108. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +0 -1
  109. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +25 -13
  110. package/packages/dd-trace/src/ci-visibility/requests/request.js +3 -1
  111. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +5 -3
  112. package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +70 -6
  113. package/packages/dd-trace/src/config/generated-config-types.d.ts +7 -2
  114. package/packages/dd-trace/src/config/supported-configurations.json +36 -8
  115. package/packages/dd-trace/src/crashtracking/crashtracker.js +15 -3
  116. package/packages/dd-trace/src/datastreams/context.js +4 -2
  117. package/packages/dd-trace/src/datastreams/writer.js +2 -4
  118. package/packages/dd-trace/src/debugger/devtools_client/condition.js +5 -8
  119. package/packages/dd-trace/src/encode/0.4.js +124 -108
  120. package/packages/dd-trace/src/encode/0.5.js +114 -26
  121. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +57 -42
  122. package/packages/dd-trace/src/encode/agentless-json.js +4 -2
  123. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +32 -13
  124. package/packages/dd-trace/src/encode/span-stats.js +16 -16
  125. package/packages/dd-trace/src/encode/tags-processors.js +16 -0
  126. package/packages/dd-trace/src/exporters/common/agents.js +3 -1
  127. package/packages/dd-trace/src/exporters/common/request.js +3 -1
  128. package/packages/dd-trace/src/id.js +17 -4
  129. package/packages/dd-trace/src/lambda/handler.js +2 -4
  130. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +1 -1
  131. package/packages/dd-trace/src/llmobs/plugins/genai/index.js +1 -1
  132. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +1 -1
  133. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +9 -7
  134. package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -1
  135. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +1 -1
  136. package/packages/dd-trace/src/llmobs/sdk.js +10 -16
  137. package/packages/dd-trace/src/llmobs/span_processor.js +3 -3
  138. package/packages/dd-trace/src/llmobs/tagger.js +9 -1
  139. package/packages/dd-trace/src/llmobs/telemetry.js +1 -1
  140. package/packages/dd-trace/src/llmobs/util.js +66 -3
  141. package/packages/dd-trace/src/log/index.js +1 -1
  142. package/packages/dd-trace/src/log/writer.js +3 -1
  143. package/packages/dd-trace/src/msgpack/chunk.js +394 -10
  144. package/packages/dd-trace/src/msgpack/index.js +96 -2
  145. package/packages/dd-trace/src/noop/span.js +3 -1
  146. package/packages/dd-trace/src/openfeature/encoding.js +70 -0
  147. package/packages/dd-trace/src/openfeature/flagging_provider.js +20 -0
  148. package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +143 -0
  149. package/packages/dd-trace/src/openfeature/span-enrichment.js +149 -0
  150. package/packages/dd-trace/src/openfeature/writers/exposures.js +51 -20
  151. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +1 -1
  152. package/packages/dd-trace/src/opentelemetry/span-helpers.js +4 -3
  153. package/packages/dd-trace/src/opentelemetry/span.js +1 -1
  154. package/packages/dd-trace/src/opentracing/propagation/log.js +18 -7
  155. package/packages/dd-trace/src/opentracing/propagation/text_map.js +62 -67
  156. package/packages/dd-trace/src/opentracing/span.js +59 -19
  157. package/packages/dd-trace/src/opentracing/span_context.js +49 -0
  158. package/packages/dd-trace/src/plugins/apollo.js +3 -1
  159. package/packages/dd-trace/src/plugins/ci_plugin.js +23 -33
  160. package/packages/dd-trace/src/plugins/database.js +7 -6
  161. package/packages/dd-trace/src/plugins/index.js +4 -0
  162. package/packages/dd-trace/src/plugins/log_injection.js +56 -0
  163. package/packages/dd-trace/src/plugins/log_plugin.js +3 -46
  164. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  165. package/packages/dd-trace/src/plugins/plugin.js +15 -17
  166. package/packages/dd-trace/src/plugins/tracing.js +48 -8
  167. package/packages/dd-trace/src/plugins/util/git.js +3 -1
  168. package/packages/dd-trace/src/plugins/util/test.js +318 -13
  169. package/packages/dd-trace/src/plugins/util/web.js +89 -64
  170. package/packages/dd-trace/src/priority_sampler.js +2 -2
  171. package/packages/dd-trace/src/profiling/profiler.js +2 -2
  172. package/packages/dd-trace/src/profiling/profilers/wall.js +10 -4
  173. package/packages/dd-trace/src/sampling_rule.js +7 -7
  174. package/packages/dd-trace/src/scope.js +7 -5
  175. package/packages/dd-trace/src/service-naming/extra-services.js +14 -0
  176. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +10 -0
  177. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  178. package/packages/dd-trace/src/service-naming/source-resolver.js +46 -0
  179. package/packages/dd-trace/src/span_format.js +190 -58
  180. package/packages/dd-trace/src/spanleak.js +1 -1
  181. package/packages/dd-trace/src/standalone/index.js +3 -3
  182. package/packages/dd-trace/src/tagger.js +0 -2
  183. package/vendor/dist/@apm-js-collab/code-transformer/index.js +70 -39
  184. package/vendor/dist/@datadog/sketches-js/LICENSE +10 -36
  185. package/vendor/dist/@datadog/sketches-js/index.js +1 -1
  186. package/vendor/dist/protobufjs/index.js +1 -1
  187. package/vendor/dist/protobufjs/minimal/index.js +1 -1
  188. package/packages/dd-trace/src/msgpack/encoder.js +0 -308
  189. package/packages/dd-trace/src/plugins/structured_log_plugin.js +0 -9
  190. package/vendor/dist/opentracing/LICENSE +0 -201
  191. package/vendor/dist/opentracing/binary_carrier.d.ts +0 -11
  192. package/vendor/dist/opentracing/constants.d.ts +0 -61
  193. package/vendor/dist/opentracing/examples/demo/demo.d.ts +0 -2
  194. package/vendor/dist/opentracing/ext/tags.d.ts +0 -90
  195. package/vendor/dist/opentracing/functions.d.ts +0 -20
  196. package/vendor/dist/opentracing/global_tracer.d.ts +0 -14
  197. package/vendor/dist/opentracing/index.d.ts +0 -12
  198. package/vendor/dist/opentracing/index.js +0 -1
  199. package/vendor/dist/opentracing/mock_tracer/index.d.ts +0 -5
  200. package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +0 -13
  201. package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +0 -16
  202. package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +0 -50
  203. package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +0 -26
  204. package/vendor/dist/opentracing/noop.d.ts +0 -8
  205. package/vendor/dist/opentracing/reference.d.ts +0 -33
  206. package/vendor/dist/opentracing/span.d.ts +0 -147
  207. package/vendor/dist/opentracing/span_context.d.ts +0 -26
  208. package/vendor/dist/opentracing/test/api_compatibility.d.ts +0 -16
  209. package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +0 -3
  210. package/vendor/dist/opentracing/test/noop_implementation.d.ts +0 -4
  211. package/vendor/dist/opentracing/test/opentracing_api.d.ts +0 -3
  212. package/vendor/dist/opentracing/test/unittest.d.ts +0 -2
  213. package/vendor/dist/opentracing/tracer.d.ts +0 -127
@@ -4,6 +4,7 @@ const plugins = {
4
4
  get '@anthropic-ai/sdk' () { return require('../../../datadog-plugin-anthropic/src') },
5
5
  get '@apollo/gateway' () { return require('../../../datadog-plugin-apollo/src') },
6
6
  get '@aws-sdk/smithy-client' () { return require('../../../datadog-plugin-aws-sdk/src') },
7
+ get '@azure/cosmos' () { return require('../../../datadog-plugin-azure-cosmos/src') },
7
8
  get '@azure/event-hubs' () { return require('../../../datadog-plugin-azure-event-hubs/src') },
8
9
  get '@azure/functions' () { return require('../../../datadog-plugin-azure-functions/src') },
9
10
  get '@modelcontextprotocol/sdk' () { return require('../../../datadog-plugin-modelcontextprotocol-sdk/src') },
@@ -30,6 +31,7 @@ const plugins = {
30
31
  get '@prisma/client' () { return require('../../../datadog-plugin-prisma/src') },
31
32
  get './runtime/library.js' () { return require('../../../datadog-plugin-prisma/src') },
32
33
  get '@redis/client' () { return require('../../../datadog-plugin-redis/src') },
34
+ get '@smithy/core' () { return require('../../../datadog-plugin-aws-sdk/src') },
33
35
  get '@smithy/smithy-client' () { return require('../../../datadog-plugin-aws-sdk/src') },
34
36
  get '@vitest/runner' () { return require('../../../datadog-plugin-vitest/src') },
35
37
  get '@langchain/langgraph' () { return require('../../../datadog-plugin-langgraph/src') },
@@ -90,6 +92,8 @@ const plugins = {
90
92
  get mongoose () { return require('../../../datadog-plugin-mongoose/src') },
91
93
  get mysql () { return require('../../../datadog-plugin-mysql/src') },
92
94
  get mysql2 () { return require('../../../datadog-plugin-mysql2/src') },
95
+ get '@nats-io/nats-core' () { return require('../../../datadog-plugin-nats/src') },
96
+ get '@nats-io/transport-node' () { return require('../../../datadog-plugin-nats/src') },
93
97
  get net () { return require('../../../datadog-plugin-net/src') },
94
98
  get next () { return require('../../../datadog-plugin-next/src') },
95
99
  get 'node:dns' () { return require('../../../datadog-plugin-dns/src') },
@@ -0,0 +1,56 @@
1
+ 'use strict'
2
+
3
+ const { LOG } = require('../../../../ext/formats')
4
+ const { storage } = require('../../../datadog-core')
5
+
6
+ const legacyStorage = storage('legacy')
7
+
8
+ /**
9
+ * Runs the tracer's log injector and returns the populated log holder, or
10
+ * `undefined` when the propagator emitted no `dd` field (no span, no
11
+ * service / version / env). Hot-path callers gate on the return.
12
+ *
13
+ * @param {object} tracer
14
+ * @returns {{ dd: object } | undefined}
15
+ */
16
+ function buildLogHolder (tracer) {
17
+ const logHolder = {}
18
+ tracer.inject(legacyStorage.getStore()?.span, LOG, logHolder)
19
+ return logHolder.dd ? logHolder : undefined
20
+ }
21
+
22
+ /**
23
+ * @param {object} message Caller-owned log record; never mutated.
24
+ * @param {{ dd: object }} logHolder Holds the dd fields injected by the tracer.
25
+ */
26
+ function messageProxy (message, logHolder) {
27
+ return new Proxy(message, {
28
+ get (target, key) {
29
+ if (shouldOverride(target, key)) return logHolder.dd
30
+ return target[key]
31
+ },
32
+ set (target, key, value) {
33
+ return Reflect.set(target, key, value)
34
+ },
35
+ ownKeys (target) {
36
+ const ownKeys = Reflect.ownKeys(target)
37
+ if (!Object.hasOwn(target, 'dd') && Reflect.isExtensible(target)) {
38
+ ownKeys.push('dd')
39
+ }
40
+ return ownKeys
41
+ },
42
+ getOwnPropertyDescriptor (target, p) {
43
+ return Reflect.getOwnPropertyDescriptor(shouldOverride(target, p) ? logHolder : target, p)
44
+ },
45
+ })
46
+ }
47
+
48
+ /**
49
+ * @param {object} target
50
+ * @param {string | symbol} p
51
+ */
52
+ function shouldOverride (target, p) {
53
+ return p === 'dd' && !Object.hasOwn(target, p) && Reflect.isExtensible(target)
54
+ }
55
+
56
+ module.exports = { buildLogHolder, messageProxy }
@@ -1,53 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const { LOG } = require('../../../../ext/formats')
4
- const { storage } = require('../../../datadog-core')
5
3
  const Plugin = require('./plugin')
6
4
 
7
- function messageProxy (message, holder) {
8
- return new Proxy(message, {
9
- get (target, key) {
10
- if (shouldOverride(target, key)) {
11
- return holder.dd
12
- }
13
-
14
- return target[key]
15
- },
16
- set (target, key, value) {
17
- return Reflect.set(target, key, value)
18
- },
19
- ownKeys (target) {
20
- const ownKeys = Reflect.ownKeys(target)
21
- if (!Object.hasOwn(target, 'dd') && Reflect.isExtensible(target)) {
22
- ownKeys.push('dd')
23
- }
24
- return ownKeys
25
- },
26
- getOwnPropertyDescriptor (target, p) {
27
- return Reflect.getOwnPropertyDescriptor(shouldOverride(target, p) ? holder : target, p)
28
- },
29
- })
30
- }
31
-
32
- function shouldOverride (target, p) {
33
- return p === 'dd' && !Object.hasOwn(target, p) && Reflect.isExtensible(target)
34
- }
35
-
36
- module.exports = class LogPlugin extends Plugin {
37
- constructor (...args) {
38
- super(...args)
39
-
40
- this.addSub(`apm:${this.constructor.id}:log`, (arg) => {
41
- const span = storage('legacy').getStore()?.span
42
-
43
- // NOTE: This needs to run whether or not there is a span
44
- // so service, version, and env will always get injected.
45
- const holder = {}
46
- this.tracer.inject(span, LOG, holder)
47
- arg.message = messageProxy(arg.message, holder)
48
- })
49
- }
50
-
5
+ class LogPlugin extends Plugin {
51
6
  configure (config) {
52
7
  return super.configure({
53
8
  ...config,
@@ -55,3 +10,5 @@ module.exports = class LogPlugin extends Plugin {
55
10
  })
56
11
  }
57
12
  }
13
+
14
+ module.exports = LogPlugin
@@ -125,7 +125,7 @@ class OutboundPlugin extends TracingPlugin {
125
125
  */
126
126
  tagPeerService (span) {
127
127
  if (this._tracerConfig.spanComputePeerService) {
128
- const peerData = this.getPeerService(span.context()._tags)
128
+ const peerData = this.getPeerService(span.context().getTags())
129
129
  if (peerData !== undefined) {
130
130
  span.addTags(this.getPeerServiceRemap(peerData))
131
131
  }
@@ -6,6 +6,8 @@ const dc = require('dc-polyfill')
6
6
  const logger = require('../log')
7
7
  const { storage } = require('../../../datadog-core')
8
8
 
9
+ const legacyStorage = storage('legacy')
10
+
9
11
  /**
10
12
  * Base class for all Datadog plugins.
11
13
  *
@@ -28,8 +30,7 @@ class Subscription {
28
30
  constructor (event, handler) {
29
31
  this._channel = dc.channel(event)
30
32
  this._handler = (message, name) => {
31
- const store = storage('legacy').getStore()
32
- if (!store || !store.noop) {
33
+ if (!legacyStorage.getHandle()?.noop) {
33
34
  handler(message, name)
34
35
  }
35
36
  }
@@ -50,20 +51,20 @@ class StoreBinding {
50
51
  constructor (event, transform) {
51
52
  this._channel = dc.channel(event)
52
53
  this._transform = data => {
53
- const store = storage('legacy').getStore()
54
+ const handle = legacyStorage.getHandle()
54
55
 
55
- return !store || !store.noop || (data && Object.hasOwn(data, 'currentStore'))
56
+ return !handle?.noop || (data && Object.hasOwn(data, 'currentStore'))
56
57
  ? transform(data)
57
- : store
58
+ : legacyStorage.getStore()
58
59
  }
59
60
  }
60
61
 
61
62
  enable () {
62
- this._channel.bindStore(storage('legacy'), this._transform)
63
+ this._channel.bindStore(legacyStorage, this._transform)
63
64
  }
64
65
 
65
66
  disable () {
66
- this._channel.unbindStore(storage('legacy'))
67
+ this._channel.unbindStore(legacyStorage)
67
68
  }
68
69
  }
69
70
 
@@ -102,24 +103,21 @@ module.exports = class Plugin {
102
103
  * @returns {void}
103
104
  */
104
105
  enter (span, store) {
105
- store = store || storage('legacy').getStore()
106
- storage('legacy').enterWith({ ...store, span })
106
+ store = store || legacyStorage.getStore()
107
+ legacyStorage.enterWith({ ...store, span })
107
108
  }
108
109
 
109
110
  /**
110
111
  * Subscribe to a diagnostic channel with automatic error handling and enable/disable lifecycle.
111
112
  *
112
113
  * @param {string} channelName Diagnostic channel name.
113
- * @param {(...args: unknown[]) => unknown} handler Handler invoked on messages.
114
+ * @param {(message: unknown, name: string) => unknown} handler Handler invoked on messages.
114
115
  * @returns {void}
115
116
  */
116
117
  addSub (channelName, handler) {
117
- /**
118
- * @type {typeof handler}
119
- */
120
- const wrappedHandler = (...args) => {
118
+ const wrappedHandler = (message, name) => {
121
119
  try {
122
- return handler.apply(this, args)
120
+ return handler.call(this, message, name)
123
121
  } catch (error) {
124
122
  logger.error('Error in plugin handler:', error)
125
123
  logger.info('Disabling plugin: %s', this.constructor.name)
@@ -147,12 +145,12 @@ module.exports = class Plugin {
147
145
  * @returns {void}
148
146
  */
149
147
  addError (error) {
150
- const store = storage('legacy').getStore()
148
+ const store = legacyStorage.getStore()
151
149
 
152
150
  if (!store || !store.span) return
153
151
 
154
152
  const span = /** @type {import('../opentracing/span')} */ (store.span)
155
- if (!span._spanContext._tags.error) {
153
+ if (!span.context().getTag('error')) {
156
154
  span.setTag('error', error || 1)
157
155
  }
158
156
  }
@@ -3,8 +3,11 @@
3
3
  const { storage } = require('../../../datadog-core')
4
4
  const analyticsSampler = require('../analytics_sampler')
5
5
  const { COMPONENT, SVC_SRC_KEY } = require('../constants')
6
+ const { INTEGRATION_SERVICE } = require('../service-naming/source-resolver')
6
7
  const Plugin = require('./plugin')
7
8
 
9
+ const legacyStorage = storage('legacy')
10
+
8
11
  class TracingPlugin extends Plugin {
9
12
  constructor (...args) {
10
13
  super(...args)
@@ -16,7 +19,7 @@ class TracingPlugin extends Plugin {
16
19
  }
17
20
 
18
21
  get activeSpan () {
19
- const store = /** @type {{ span?: import('../../../..').Span }} */ (storage('legacy').getStore())
22
+ const store = /** @type {{ span?: import('../../../..').Span }} */ (legacyStorage.getStore())
20
23
 
21
24
  return store?.span
22
25
  }
@@ -97,13 +100,11 @@ class TracingPlugin extends Plugin {
97
100
  const bindName = `bind${event.charAt(0).toUpperCase()}${event.slice(1)}`
98
101
 
99
102
  if (this[event]) {
100
- this.addTraceSub(event, message => {
101
- this[event](message)
102
- })
103
+ this.addTraceSub(event, this[event].bind(this))
103
104
  }
104
105
 
105
106
  if (this[bindName]) {
106
- this.addTraceBind(event, message => this[bindName](message))
107
+ this.addTraceBind(event, this[bindName].bind(this))
107
108
  }
108
109
  }
109
110
  }
@@ -126,12 +127,49 @@ class TracingPlugin extends Plugin {
126
127
  this.addBind(`${prefix}:${eventName}`, transform)
127
128
  }
128
129
 
130
+ /**
131
+ * Record the integration's intended `service.name` on a span without writing the tag.
132
+ *
133
+ * Use this when the plugin has already set `service.name` directly on the span (e.g. via
134
+ * the `tracer.startSpan` tags object) and only needs to stamp the marker so
135
+ * `Span#finish` can later detect user overrides and re-attribute the source.
136
+ *
137
+ * Prefer {@link TracingPlugin#setServiceName} when the tag itself also needs to be written.
138
+ *
139
+ * No-op when there is nothing meaningful to record
140
+ *
141
+ * @param {import('../opentracing/span')} span Internal DatadogSpan instance.
142
+ * @param {string|undefined} name Service name the integration is claiming.
143
+ */
144
+ stampIntegrationService (span, name) {
145
+ if (name === undefined) return
146
+ span[INTEGRATION_SERVICE] = name
147
+ }
148
+
149
+ /**
150
+ * Set `service.name` on a span on behalf of this integration and stamp the marker.
151
+ *
152
+ * Use this for late-binding cases where the service is not known at startSpan time
153
+ * (e.g. web framework config applied after the span is already open).
154
+ *
155
+ * For spans started via {@link TracingPlugin#startSpan}, pass `service` as an option
156
+ * instead — it sets the tag and stamps the marker in one step.
157
+ *
158
+ * @param {import('../opentracing/span')} span Internal DatadogSpan instance.
159
+ * @param {string} name Service name the integration is claiming.
160
+ */
161
+ setServiceName (span, name) {
162
+ // eslint-disable-next-line eslint-rules/eslint-prefer-set-service-name -- this is the implementation
163
+ span._spanContext.setTag('service.name', name)
164
+ this.stampIntegrationService(span, name)
165
+ }
166
+
129
167
  /**
130
168
  * @param {unknown} error
131
169
  * @param {import('../../../..').Span} [span]
132
170
  */
133
171
  addError (error, span = this.activeSpan) {
134
- if (span && !span._spanContext._tags.error) {
172
+ if (span && !span.context().getTag('error')) {
135
173
  // Errors may be wrapped in a context.
136
174
  span.setTag('error', error?.error || error || 1)
137
175
  }
@@ -193,7 +231,7 @@ class TracingPlugin extends Plugin {
193
231
  serviceSource = service ? 'opt.plugin' : undefined
194
232
  }
195
233
 
196
- const store = storage('legacy').getStore()
234
+ const store = legacyStorage.getStore()
197
235
  if (store && childOf === undefined) {
198
236
  childOf = /** @type {import('../opentracing/span') | undefined} */ (store.span)
199
237
  }
@@ -222,11 +260,13 @@ class TracingPlugin extends Plugin {
222
260
  links: childOf?._links,
223
261
  })
224
262
 
263
+ this.stampIntegrationService(span, serviceName)
264
+
225
265
  analyticsSampler.sample(span, config.measured)
226
266
 
227
267
  // TODO: Remove this after migration to TracingChannel is done.
228
268
  if (enterOrCtx === true) {
229
- storage('legacy').enterWith({ ...store, span })
269
+ legacyStorage.enterWith({ ...store, span })
230
270
  } else if (enterOrCtx) {
231
271
  enterOrCtx.parentStore = store
232
272
  enterOrCtx.currentStore = { ...store, span }
@@ -37,6 +37,8 @@ const {
37
37
  const { filterSensitiveInfoFromRepository } = require('./url')
38
38
  const { cachedExec } = require('./git-cache')
39
39
 
40
+ const legacyStorage = storage('legacy')
41
+
40
42
  const GIT_REV_LIST_MAX_BUFFER = 12 * 1024 * 1024 // 12MB
41
43
 
42
44
  function sanitizedExec (
@@ -47,7 +49,7 @@ function sanitizedExec (
47
49
  errorMetric,
48
50
  shouldTrim = true
49
51
  ) {
50
- return storage('legacy').run({ noop: true }, () => {
52
+ return legacyStorage.run({ noop: true }, () => {
51
53
  let startTime
52
54
  if (operationMetric) {
53
55
  incrementCountMetric(operationMetric.name, operationMetric.tags)