dd-trace 6.9.0 → 6.10.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 (59) hide show
  1. package/ci/vitest-no-worker-init-setup.mjs +112 -10
  2. package/index.d.ts +42 -0
  3. package/package.json +4 -3
  4. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +111 -6
  5. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +629 -0
  6. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -1
  7. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +81 -0
  8. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +1 -0
  9. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +83 -1
  10. package/packages/datadog-instrumentations/src/jest.js +1 -1
  11. package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
  12. package/packages/datadog-instrumentations/src/mocha/utils.js +2 -8
  13. package/packages/datadog-instrumentations/src/mysql.js +45 -15
  14. package/packages/datadog-instrumentations/src/mysql2.js +119 -18
  15. package/packages/datadog-instrumentations/src/path-to-regexp.js +67 -1
  16. package/packages/datadog-instrumentations/src/pg.js +116 -92
  17. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +43 -4
  18. package/packages/datadog-instrumentations/src/vitest-main.js +169 -17
  19. package/packages/datadog-instrumentations/src/vitest-util.js +64 -5
  20. package/packages/datadog-instrumentations/src/vitest-worker.js +150 -25
  21. package/packages/datadog-instrumentations/src/webdriverio.js +31 -17
  22. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +12 -6
  23. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +2 -5
  24. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -5
  25. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +1 -1
  26. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +31 -17
  27. package/packages/datadog-plugin-jest/src/index.js +5 -4
  28. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +2 -3
  29. package/packages/datadog-plugin-kafkajs/src/consumer.js +2 -3
  30. package/packages/datadog-plugin-kafkajs/src/producer.js +3 -2
  31. package/packages/datadog-plugin-kafkajs/src/utils.js +65 -7
  32. package/packages/datadog-plugin-mocha/src/index.js +550 -39
  33. package/packages/datadog-plugin-mysql/src/index.js +37 -0
  34. package/packages/datadog-plugin-next/src/index.js +1 -19
  35. package/packages/datadog-plugin-openai-agents/src/integration.js +278 -69
  36. package/packages/datadog-plugin-openai-agents/src/processor.js +16 -4
  37. package/packages/datadog-plugin-pg/src/index.js +1 -0
  38. package/packages/datadog-plugin-vitest/src/index.js +8 -20
  39. package/packages/datadog-plugin-ws/src/util.js +2 -1
  40. package/packages/dd-trace/src/appsec/api_security/normalized-route.js +453 -0
  41. package/packages/dd-trace/src/appsec/handlers/http-request.js +13 -0
  42. package/packages/dd-trace/src/carrier.js +356 -0
  43. package/packages/dd-trace/src/config/generated-config-types.d.ts +3 -0
  44. package/packages/dd-trace/src/config/supported-configurations.json +10 -0
  45. package/packages/dd-trace/src/datastreams/context.js +6 -1
  46. package/packages/dd-trace/src/datastreams/manager.js +5 -1
  47. package/packages/dd-trace/src/datastreams/pathway.js +23 -22
  48. package/packages/dd-trace/src/datastreams/processor.js +3 -2
  49. package/packages/dd-trace/src/llmobs/constants/tags.js +5 -0
  50. package/packages/dd-trace/src/llmobs/index.js +34 -2
  51. package/packages/dd-trace/src/llmobs/span_processor.js +16 -0
  52. package/packages/dd-trace/src/llmobs/tagger.js +96 -0
  53. package/packages/dd-trace/src/llmobs/util.js +78 -0
  54. package/packages/dd-trace/src/opentracing/propagation/text_map.js +126 -120
  55. package/packages/dd-trace/src/opentracing/propagation/text_map_dsm.js +4 -8
  56. package/packages/dd-trace/src/plugin_manager.js +2 -0
  57. package/packages/{datadog-plugin-jest/src/util.js → dd-trace/src/plugins/util/jest.js} +1 -62
  58. package/packages/dd-trace/src/plugins/util/test.js +84 -5
  59. package/packages/dd-trace/src/plugins/util/web.js +53 -2
@@ -1,9 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const dc = require('dc-polyfill')
4
- const { getMessageSize } = require('../../dd-trace/src/datastreams')
5
4
  const ConsumerPlugin = require('../../dd-trace/src/plugins/consumer')
6
- const { convertToTextMap } = require('./utils')
5
+ const { convertToTextMap, getKafkaMessageSize } = require('./utils')
7
6
  const afterStartCh = dc.channel('dd-trace:kafkajs:consumer:afterStart')
8
7
  const beforeFinishCh = dc.channel('dd-trace:kafkajs:consumer:beforeFinish')
9
8
 
@@ -69,7 +68,7 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
69
68
  if (!headers) return
70
69
 
71
70
  const { span } = ctx.currentStore
72
- const payloadSize = getMessageSize(message)
71
+ const payloadSize = getKafkaMessageSize(message)
73
72
  this.tracer.decodeDataStreamsContext(headers)
74
73
  const edgeTags = ['direction:in', `group:${groupId}`, `topic:${topic}`, 'type:kafka']
75
74
  if (clusterId) {
@@ -1,7 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const ProducerPlugin = require('../../dd-trace/src/plugins/producer')
4
- const { DsmPathwayCodec, getMessageSize } = require('../../dd-trace/src/datastreams')
4
+ const { DsmPathwayCodec } = require('../../dd-trace/src/datastreams')
5
+ const { getKafkaMessageSize } = require('./utils')
5
6
 
6
7
  const BOOTSTRAP_SERVERS_KEY = 'messaging.kafka.bootstrap.servers'
7
8
  const MESSAGING_DESTINATION_KEY = 'messaging.destination.name'
@@ -77,7 +78,7 @@ class KafkajsProducerPlugin extends ProducerPlugin {
77
78
 
78
79
  for (const message of messages) {
79
80
  if (message !== null && typeof message === 'object') {
80
- const payloadSize = getMessageSize(message)
81
+ const payloadSize = getKafkaMessageSize(message)
81
82
  const edgeTags = ['direction:out', `topic:${topic}`, 'type:kafka']
82
83
 
83
84
  if (clusterId) {
@@ -1,27 +1,85 @@
1
1
  'use strict'
2
2
 
3
+ const { getSizeOrZero } = require('../../dd-trace/src/datastreams')
4
+
5
+ /** @typedef {string | Buffer | null | undefined} KafkaHeaderValue */
6
+ /** @typedef {Record<string, KafkaHeaderValue | KafkaHeaderValue[]>} KafkaHeaderMap */
7
+ /** @typedef {Array<Record<string, KafkaHeaderValue>>} NativeHeaderList */
8
+
9
+ /** @typedef {Record<string, string | string[]>} TextMap */
10
+
11
+ /**
12
+ * @param {TextMap} textMap
13
+ * @param {string} key
14
+ * @param {KafkaHeaderValue} value
15
+ */
16
+ function addHeaderValue (textMap, key, value) {
17
+ if (value === null || value === undefined) return
18
+
19
+ const existing = textMap[key]
20
+ if (existing === undefined) {
21
+ textMap[key] = value.toString()
22
+ } else if (typeof existing === 'string') {
23
+ textMap[key] = [existing, value.toString()]
24
+ } else {
25
+ existing.push(value.toString())
26
+ }
27
+ }
28
+
29
+ /** @param {KafkaHeaderMap | NativeHeaderList | null | undefined} bufferMap */
3
30
  function convertToTextMap (bufferMap) {
4
31
  if (!bufferMap) return null
5
32
 
6
- // rdKafka returns an array of header maps
33
+ // A `toString` or `__proto__` wire key would read an inherited value back as a repeat.
34
+ /** @type {TextMap} */
35
+ const textMap = Object.create(null)
36
+
37
+ // rdKafka reports one single-key record per wire field.
7
38
  if (Array.isArray(bufferMap)) {
8
- const headers = {}
9
39
  for (const headerMap of bufferMap) {
10
40
  for (const key of Object.keys(headerMap)) {
11
- headers[key] = headerMap[key].toString()
41
+ addHeaderValue(textMap, key, headerMap[key])
12
42
  }
13
43
  }
14
- return headers
44
+ return textMap
15
45
  }
16
46
 
17
- const textMap = {}
18
47
  for (const key of Object.keys(bufferMap)) {
19
- if (bufferMap[key] === null || bufferMap[key] === undefined) continue
20
- textMap[key] = bufferMap[key].toString()
48
+ const value = bufferMap[key]
49
+ if (Array.isArray(value)) {
50
+ for (const repeated of value) {
51
+ addHeaderValue(textMap, key, repeated)
52
+ }
53
+ } else {
54
+ addHeaderValue(textMap, key, value)
55
+ }
21
56
  }
22
57
  return textMap
23
58
  }
24
59
 
60
+ /**
61
+ * A KafkaJS header value array becomes one wire record per element, so its key
62
+ * counts once per value. A native header array already holds one record per
63
+ * entry, where the array indices are not wire bytes.
64
+ *
65
+ * @param {{ key?: unknown, value?: unknown,
66
+ * headers?: KafkaHeaderMap | NativeHeaderList | null }} message
67
+ */
68
+ function getKafkaMessageSize (message) {
69
+ const { key, value, headers } = message
70
+ let size = getSizeOrZero(key) + getSizeOrZero(value)
71
+ if (headers === undefined || headers === null) return size
72
+ if (Array.isArray(headers)) return size + getSizeOrZero(headers)
73
+
74
+ for (const headerKey of Object.keys(headers)) {
75
+ const headerValue = headers[headerKey]
76
+ const keySize = Buffer.byteLength(headerKey, 'utf8')
77
+ size += (Array.isArray(headerValue) ? keySize * headerValue.length : keySize) + getSizeOrZero(headerValue)
78
+ }
79
+ return size
80
+ }
81
+
25
82
  module.exports = {
26
83
  convertToTextMap,
84
+ getKafkaMessageSize,
27
85
  }