dd-trace 5.104.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 (151) hide show
  1. package/LICENSE-3rdparty.csv +90 -102
  2. package/index.d.ts +82 -3
  3. package/package.json +15 -15
  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 +13 -0
  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/cucumber.js +78 -5
  11. package/packages/datadog-instrumentations/src/dns.js +54 -18
  12. package/packages/datadog-instrumentations/src/fastify.js +142 -82
  13. package/packages/datadog-instrumentations/src/graphql.js +188 -62
  14. package/packages/datadog-instrumentations/src/helpers/ai-messages.js +322 -14
  15. package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -0
  16. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -1
  17. package/packages/datadog-instrumentations/src/helpers/openai-ai-guard.js +269 -0
  18. package/packages/datadog-instrumentations/src/helpers/promise-instrumentor.js +42 -0
  19. package/packages/datadog-instrumentations/src/helpers/register.js +1 -1
  20. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -3
  21. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/azure-cosmos.js +50 -0
  22. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -0
  23. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langgraph.js +4 -2
  24. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +85 -0
  25. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +37 -236
  26. package/packages/datadog-instrumentations/src/hono.js +54 -3
  27. package/packages/datadog-instrumentations/src/http/server.js +9 -4
  28. package/packages/datadog-instrumentations/src/jest/coverage-backfill.js +163 -0
  29. package/packages/datadog-instrumentations/src/jest.js +360 -150
  30. package/packages/datadog-instrumentations/src/kafkajs.js +120 -16
  31. package/packages/datadog-instrumentations/src/mocha/main.js +128 -17
  32. package/packages/datadog-instrumentations/src/nats.js +182 -0
  33. package/packages/datadog-instrumentations/src/nyc.js +38 -1
  34. package/packages/datadog-instrumentations/src/openai.js +33 -18
  35. package/packages/datadog-instrumentations/src/oracledb.js +6 -1
  36. package/packages/datadog-instrumentations/src/pino.js +17 -5
  37. package/packages/datadog-instrumentations/src/playwright.js +515 -292
  38. package/packages/datadog-instrumentations/src/router.js +76 -32
  39. package/packages/datadog-instrumentations/src/stripe.js +1 -1
  40. package/packages/datadog-plugin-avsc/src/schema_iterator.js +1 -1
  41. package/packages/datadog-plugin-azure-cosmos/src/index.js +144 -0
  42. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +1 -1
  43. package/packages/datadog-plugin-azure-functions/src/index.js +5 -2
  44. package/packages/datadog-plugin-azure-service-bus/src/producer.js +1 -1
  45. package/packages/datadog-plugin-bunyan/src/index.js +28 -0
  46. package/packages/datadog-plugin-cucumber/src/index.js +17 -3
  47. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +199 -28
  48. package/packages/datadog-plugin-cypress/src/support.js +69 -1
  49. package/packages/datadog-plugin-dns/src/lookup.js +8 -6
  50. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +1 -1
  51. package/packages/datadog-plugin-graphql/src/execute.js +2 -0
  52. package/packages/datadog-plugin-graphql/src/resolve.js +64 -67
  53. package/packages/datadog-plugin-http/src/server.js +40 -15
  54. package/packages/datadog-plugin-jest/src/index.js +11 -3
  55. package/packages/datadog-plugin-jest/src/util.js +15 -8
  56. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +1 -1
  57. package/packages/datadog-plugin-kafkajs/src/producer.js +3 -0
  58. package/packages/datadog-plugin-langgraph/src/stream.js +1 -1
  59. package/packages/datadog-plugin-mocha/src/index.js +19 -4
  60. package/packages/datadog-plugin-mongodb-core/src/index.js +281 -40
  61. package/packages/datadog-plugin-nats/src/consumer.js +43 -0
  62. package/packages/datadog-plugin-nats/src/index.js +20 -0
  63. package/packages/datadog-plugin-nats/src/producer.js +62 -0
  64. package/packages/datadog-plugin-nats/src/util.js +33 -0
  65. package/packages/datadog-plugin-next/src/index.js +5 -3
  66. package/packages/datadog-plugin-openai/src/tracing.js +15 -2
  67. package/packages/datadog-plugin-oracledb/src/index.js +13 -2
  68. package/packages/datadog-plugin-pino/src/index.js +42 -0
  69. package/packages/datadog-plugin-playwright/src/index.js +4 -4
  70. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  71. package/packages/datadog-plugin-rhea/src/producer.js +1 -1
  72. package/packages/datadog-plugin-router/src/index.js +33 -44
  73. package/packages/datadog-plugin-selenium/src/index.js +1 -1
  74. package/packages/datadog-plugin-vitest/src/index.js +5 -13
  75. package/packages/datadog-plugin-winston/src/index.js +30 -0
  76. package/packages/datadog-shimmer/src/shimmer.js +33 -40
  77. package/packages/dd-trace/src/aiguard/index.js +1 -1
  78. package/packages/dd-trace/src/aiguard/sdk.js +1 -1
  79. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  80. package/packages/dd-trace/src/appsec/index.js +1 -1
  81. package/packages/dd-trace/src/appsec/reporter.js +5 -6
  82. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  83. package/packages/dd-trace/src/appsec/sdk/utils.js +1 -1
  84. package/packages/dd-trace/src/appsec/user_tracking.js +5 -4
  85. package/packages/dd-trace/src/baggage.js +7 -1
  86. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +0 -1
  87. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +25 -13
  88. package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +70 -6
  89. package/packages/dd-trace/src/config/generated-config-types.d.ts +6 -2
  90. package/packages/dd-trace/src/config/supported-configurations.json +27 -8
  91. package/packages/dd-trace/src/datastreams/writer.js +2 -4
  92. package/packages/dd-trace/src/debugger/devtools_client/condition.js +5 -8
  93. package/packages/dd-trace/src/encode/0.4.js +124 -108
  94. package/packages/dd-trace/src/encode/0.5.js +114 -26
  95. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +31 -23
  96. package/packages/dd-trace/src/encode/agentless-json.js +4 -2
  97. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +32 -13
  98. package/packages/dd-trace/src/encode/span-stats.js +16 -16
  99. package/packages/dd-trace/src/encode/tags-processors.js +16 -0
  100. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +1 -1
  101. package/packages/dd-trace/src/llmobs/plugins/genai/index.js +1 -1
  102. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +1 -1
  103. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +9 -7
  104. package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -1
  105. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +1 -1
  106. package/packages/dd-trace/src/llmobs/sdk.js +0 -16
  107. package/packages/dd-trace/src/llmobs/span_processor.js +3 -3
  108. package/packages/dd-trace/src/llmobs/tagger.js +9 -1
  109. package/packages/dd-trace/src/llmobs/telemetry.js +1 -1
  110. package/packages/dd-trace/src/llmobs/util.js +66 -3
  111. package/packages/dd-trace/src/log/index.js +1 -1
  112. package/packages/dd-trace/src/msgpack/chunk.js +394 -10
  113. package/packages/dd-trace/src/msgpack/index.js +96 -2
  114. package/packages/dd-trace/src/openfeature/encoding.js +70 -0
  115. package/packages/dd-trace/src/openfeature/flagging_provider.js +20 -0
  116. package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +143 -0
  117. package/packages/dd-trace/src/openfeature/span-enrichment.js +149 -0
  118. package/packages/dd-trace/src/opentelemetry/span-helpers.js +4 -3
  119. package/packages/dd-trace/src/opentelemetry/span.js +1 -1
  120. package/packages/dd-trace/src/opentracing/propagation/log.js +18 -7
  121. package/packages/dd-trace/src/opentracing/propagation/text_map.js +62 -67
  122. package/packages/dd-trace/src/opentracing/span.js +59 -19
  123. package/packages/dd-trace/src/opentracing/span_context.js +49 -0
  124. package/packages/dd-trace/src/plugins/ci_plugin.js +20 -20
  125. package/packages/dd-trace/src/plugins/database.js +7 -6
  126. package/packages/dd-trace/src/plugins/index.js +4 -0
  127. package/packages/dd-trace/src/plugins/log_injection.js +56 -0
  128. package/packages/dd-trace/src/plugins/log_plugin.js +3 -48
  129. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  130. package/packages/dd-trace/src/plugins/plugin.js +15 -17
  131. package/packages/dd-trace/src/plugins/tracing.js +43 -5
  132. package/packages/dd-trace/src/plugins/util/test.js +236 -13
  133. package/packages/dd-trace/src/plugins/util/web.js +79 -65
  134. package/packages/dd-trace/src/priority_sampler.js +2 -2
  135. package/packages/dd-trace/src/profiling/profiler.js +2 -2
  136. package/packages/dd-trace/src/profiling/profilers/wall.js +10 -4
  137. package/packages/dd-trace/src/sampling_rule.js +7 -7
  138. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +10 -0
  139. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  140. package/packages/dd-trace/src/service-naming/source-resolver.js +46 -0
  141. package/packages/dd-trace/src/span_format.js +190 -58
  142. package/packages/dd-trace/src/spanleak.js +1 -1
  143. package/packages/dd-trace/src/standalone/index.js +3 -3
  144. package/packages/dd-trace/src/tagger.js +0 -2
  145. package/vendor/dist/@apm-js-collab/code-transformer/index.js +70 -39
  146. package/vendor/dist/@datadog/sketches-js/LICENSE +10 -36
  147. package/vendor/dist/@datadog/sketches-js/index.js +1 -1
  148. package/vendor/dist/protobufjs/index.js +1 -1
  149. package/vendor/dist/protobufjs/minimal/index.js +1 -1
  150. package/packages/dd-trace/src/msgpack/encoder.js +0 -308
  151. package/packages/dd-trace/src/plugins/structured_log_plugin.js +0 -9
@@ -3,6 +3,7 @@
3
3
  const dc = require('dc-polyfill')
4
4
  const shimmer = require('../../datadog-shimmer')
5
5
  const { addHook } = require('./helpers/instrument')
6
+ const aiGuard = require('./helpers/openai-ai-guard')
6
7
 
7
8
  const ch = dc.tracingChannel('apm:openai:request')
8
9
  const onStreamedChunkCh = dc.channel('apm:openai:request:chunk')
@@ -216,15 +217,20 @@ for (const extension of extensions) {
216
217
 
217
218
  for (const methodName of methods) {
218
219
  shimmer.wrap(targetPrototype, methodName, methodFn => function (...args) {
219
- if (!ch.start.hasSubscribers) {
220
+ if (!ch.start.hasSubscribers && !aiGuard.hasSubscribers()) {
220
221
  return methodFn.apply(this, args)
221
222
  }
222
-
223
223
  // The OpenAI library lets you set `stream: true` on the options arg to any method
224
224
  // However, we only want to handle streamed responses in specific cases
225
225
  // chat.completions and completions
226
226
  const stream = streamedResponse && getOption(args, 'stream', false)
227
227
 
228
+ const guard = aiGuard.createGuard(baseResource, args[0], stream)
229
+
230
+ if (!ch.start.hasSubscribers && !guard) {
231
+ return methodFn.apply(this, args)
232
+ }
233
+
228
234
  const client = this._client || this.client
229
235
 
230
236
  const ctx = {
@@ -249,7 +255,7 @@ for (const extension of extensions) {
249
255
  const parsedPromise = origApiPromParse.apply(this, args)
250
256
  .then(body => Promise.all([this.responsePromise, body]))
251
257
 
252
- return handleUnwrappedAPIPromise(parsedPromise, ctx, stream)
258
+ return handleUnwrappedAPIPromise(parsedPromise, ctx, stream, guard)
253
259
  })
254
260
 
255
261
  return unwrappedPromise
@@ -262,9 +268,11 @@ for (const extension of extensions) {
262
268
  const parsedPromise = origApiPromParse.apply(this, args)
263
269
  .then(body => Promise.all([this.responsePromise, body]))
264
270
 
265
- return handleUnwrappedAPIPromise(parsedPromise, ctx, stream)
271
+ return handleUnwrappedAPIPromise(parsedPromise, ctx, stream, guard)
266
272
  })
267
273
 
274
+ if (guard) aiGuard.wrapAsResponse(apiProm, guard)
275
+
268
276
  ch.end.publish(ctx)
269
277
 
270
278
  return apiProm
@@ -276,8 +284,10 @@ for (const extension of extensions) {
276
284
  }
277
285
  }
278
286
 
279
- function handleUnwrappedAPIPromise (apiProm, ctx, stream) {
280
- return apiProm
287
+ function handleUnwrappedAPIPromise (apiProm, ctx, stream, guard) {
288
+ const guardedApiProm = guard ? aiGuard.gateParse(apiProm, guard) : apiProm
289
+
290
+ return guardedApiProm
281
291
  .then(([{ response, options }, body]) => {
282
292
  if (stream) {
283
293
  if (body.iterator) {
@@ -287,22 +297,27 @@ function handleUnwrappedAPIPromise (apiProm, ctx, stream) {
287
297
  body.response.body, Symbol.asyncIterator, wrapStreamIterator(response, options, ctx)
288
298
  )
289
299
  }
290
- } else {
291
- finish(ctx, {
292
- headers: response.headers,
293
- data: body,
294
- request: {
295
- path: response.url,
296
- method: options.method,
297
- },
298
- })
300
+ return body
299
301
  }
300
302
 
301
- return body
303
+ finish(ctx, {
304
+ headers: response.headers,
305
+ data: body,
306
+ request: {
307
+ path: response.url,
308
+ method: options.method,
309
+ },
310
+ })
311
+
312
+ if (!guard) return body
313
+
314
+ return aiGuard.evaluateOutput(guard, body).then(() => body)
302
315
  })
303
316
  .catch(error => {
304
- finish(ctx, undefined, error)
305
-
317
+ // ctx.result is set inside finish(); if absent, finish never ran (sync throw in
318
+ // success branch, before-model block, or openai error) — record the error now.
319
+ // If finish already ran successfully (after-model block), don't double-publish.
320
+ if (!ctx.result) finish(ctx, undefined, error)
306
321
  throw error
307
322
  })
308
323
  }
@@ -22,7 +22,7 @@ function finish (ctx) {
22
22
 
23
23
  addHook({ name: 'oracledb', versions: ['>=5'], file: 'lib/oracledb.js' }, oracledb => {
24
24
  shimmer.wrap(oracledb.Connection.prototype, 'execute', execute => {
25
- return function wrappedExecute (dbQuery, ...args) {
25
+ return function wrappedExecute (dbQuery) {
26
26
  if (!startChannel.hasSubscribers) {
27
27
  return execute.apply(this, arguments)
28
28
  }
@@ -72,6 +72,11 @@ addHook({ name: 'oracledb', versions: ['>=5'], file: 'lib/oracledb.js' }, oracle
72
72
  }
73
73
 
74
74
  return startChannel.runStores(ctx, () => {
75
+ // bindStart is skipped when tracing is suppressed (legacy store is `noop`),
76
+ // leaving ctx.injected unset — do not overwrite the caller's SQL argument.
77
+ if (ctx.injected !== undefined) {
78
+ arguments[0] = ctx.injected
79
+ }
75
80
  try {
76
81
  let result = execute.apply(this, arguments)
77
82
 
@@ -6,7 +6,16 @@ const {
6
6
  addHook,
7
7
  } = require('./helpers/instrument')
8
8
 
9
+ /**
10
+ * @param {string} symbol
11
+ * @param {(original: Function) => Function} wrapper
12
+ * @param {Function} pino
13
+ */
9
14
  function wrapPino (symbol, wrapper, pino) {
15
+ /**
16
+ * @param {unknown[]} args
17
+ * @returns {unknown}
18
+ */
10
19
  return function pinoWithTrace (...args) {
11
20
  const instance = pino.apply(this, args)
12
21
 
@@ -22,15 +31,18 @@ function wrapPino (symbol, wrapper, pino) {
22
31
  }
23
32
 
24
33
  function wrapAsJson (asJson) {
25
- const ch = channel('apm:pino:log')
34
+ const jsonCh = channel('apm:pino:log:json')
26
35
  return function asJsonWithTrace (obj, msg, num, time) {
27
36
  obj = arguments[0] = obj || {}
28
37
 
29
- const payload = { message: obj }
30
- ch.publish(payload)
31
- arguments[0] = payload.message
38
+ // Caller-provided `dd` wins -- skip the splice so a bespoke `dd` survives.
39
+ if (!jsonCh.hasSubscribers || Object.hasOwn(obj, 'dd')) {
40
+ return asJson.apply(this, arguments)
41
+ }
32
42
 
33
- return asJson.apply(this, arguments)
43
+ const payload = { line: asJson.apply(this, arguments) }
44
+ jsonCh.publish(payload)
45
+ return payload.line
34
46
  }
35
47
  }
36
48