dd-trace 6.9.0 → 6.11.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 (175) hide show
  1. package/README.md +0 -17
  2. package/ci/vitest-no-worker-init-setup.mjs +112 -10
  3. package/index.d.ts +150 -3
  4. package/initialize.mjs +28 -17
  5. package/openfeature.js +2 -2
  6. package/package.json +14 -10
  7. package/packages/datadog-esbuild/index.js +0 -34
  8. package/packages/datadog-instrumentations/src/anthropic.js +210 -15
  9. package/packages/datadog-instrumentations/src/aws-sdk.js +9 -1
  10. package/packages/datadog-instrumentations/src/browser-bunyan.js +11 -0
  11. package/packages/datadog-instrumentations/src/bunyan.js +3 -16
  12. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +111 -6
  13. package/packages/datadog-instrumentations/src/cucumber.js +26 -11
  14. package/packages/datadog-instrumentations/src/cypress-config.js +182 -16
  15. package/packages/datadog-instrumentations/src/cypress-legacy-finalizers.js +30 -0
  16. package/packages/datadog-instrumentations/src/cypress.js +2 -0
  17. package/packages/datadog-instrumentations/src/fastify.js +2 -0
  18. package/packages/datadog-instrumentations/src/helpers/bunyan.js +22 -0
  19. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -1
  20. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +634 -0
  21. package/packages/datadog-instrumentations/src/helpers/register.js +10 -8
  22. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -1
  23. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +81 -0
  24. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +1 -0
  25. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +83 -1
  26. package/packages/datadog-instrumentations/src/jest.js +26 -18
  27. package/packages/datadog-instrumentations/src/mariadb.js +278 -21
  28. package/packages/datadog-instrumentations/src/mocha/main.js +540 -56
  29. package/packages/datadog-instrumentations/src/mocha/utils.js +132 -25
  30. package/packages/datadog-instrumentations/src/mysql.js +45 -15
  31. package/packages/datadog-instrumentations/src/mysql2.js +119 -18
  32. package/packages/datadog-instrumentations/src/path-to-regexp.js +67 -1
  33. package/packages/datadog-instrumentations/src/pg.js +116 -92
  34. package/packages/datadog-instrumentations/src/playwright-reporter.js +99 -0
  35. package/packages/datadog-instrumentations/src/playwright.js +149 -2
  36. package/packages/datadog-instrumentations/src/router.js +2 -0
  37. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +43 -4
  38. package/packages/datadog-instrumentations/src/vitest-main.js +180 -20
  39. package/packages/datadog-instrumentations/src/vitest-util.js +64 -5
  40. package/packages/datadog-instrumentations/src/vitest-worker.js +150 -25
  41. package/packages/datadog-instrumentations/src/webdriverio.js +31 -17
  42. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +12 -6
  43. package/packages/datadog-plugin-aws-sdk/src/base.js +1 -0
  44. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +163 -44
  45. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -13
  46. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -5
  47. package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
  48. package/packages/datadog-plugin-browser-bunyan/src/index.js +9 -0
  49. package/packages/datadog-plugin-bunyan/src/index.js +5 -8
  50. package/packages/datadog-plugin-cucumber/src/index.js +11 -0
  51. package/packages/datadog-plugin-cypress/src/after-run.js +5 -1
  52. package/packages/datadog-plugin-cypress/src/after-spec.js +5 -1
  53. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +82 -30
  54. package/packages/datadog-plugin-cypress/src/finalization.js +76 -0
  55. package/packages/datadog-plugin-cypress/src/index.js +12 -6
  56. package/packages/datadog-plugin-cypress/src/plugin.js +16 -3
  57. package/packages/datadog-plugin-dd-trace-api/src/index.js +4 -0
  58. package/packages/datadog-plugin-electron/src/index.js +2 -0
  59. package/packages/datadog-plugin-fs/src/index.js +1 -1
  60. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +31 -17
  61. package/packages/datadog-plugin-jest/src/index.js +11 -4
  62. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +2 -3
  63. package/packages/datadog-plugin-kafkajs/src/consumer.js +2 -3
  64. package/packages/datadog-plugin-kafkajs/src/producer.js +3 -2
  65. package/packages/datadog-plugin-kafkajs/src/utils.js +65 -7
  66. package/packages/datadog-plugin-mocha/src/index.js +606 -40
  67. package/packages/datadog-plugin-mysql/src/index.js +37 -0
  68. package/packages/datadog-plugin-nats/src/index.js +1 -1
  69. package/packages/datadog-plugin-next/src/index.js +1 -19
  70. package/packages/datadog-plugin-openai/src/tracing.js +41 -30
  71. package/packages/datadog-plugin-openai-agents/src/integration.js +279 -69
  72. package/packages/datadog-plugin-openai-agents/src/processor.js +16 -4
  73. package/packages/datadog-plugin-pg/src/index.js +1 -0
  74. package/packages/datadog-plugin-playwright/src/index.js +42 -13
  75. package/packages/datadog-plugin-vitest/src/index.js +14 -20
  76. package/packages/datadog-plugin-ws/src/util.js +2 -1
  77. package/packages/datadog-webpack/index.js +0 -11
  78. package/packages/dd-trace/index.js +0 -1
  79. package/packages/dd-trace/src/agent/info.js +6 -5
  80. package/packages/dd-trace/src/aiguard/client.js +100 -1
  81. package/packages/dd-trace/src/aiguard/errors.js +41 -0
  82. package/packages/dd-trace/src/aiguard/evaluation.js +357 -0
  83. package/packages/dd-trace/src/aiguard/integrations/anthropic.js +70 -0
  84. package/packages/dd-trace/src/aiguard/integrations/index.js +4 -0
  85. package/packages/dd-trace/src/aiguard/messages/anthropic.js +423 -0
  86. package/packages/dd-trace/src/aiguard/messages/openai.js +1 -24
  87. package/packages/dd-trace/src/aiguard/messages/utils.js +28 -0
  88. package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +1 -11
  89. package/packages/dd-trace/src/aiguard/sdk.js +22 -278
  90. package/packages/dd-trace/src/appsec/api_security/normalized-route.js +453 -0
  91. package/packages/dd-trace/src/appsec/handlers/http-request.js +13 -0
  92. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +9 -12
  93. package/packages/dd-trace/src/carrier.js +356 -0
  94. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +1 -0
  95. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +27 -3
  96. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +22 -6
  97. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +21 -5
  98. package/packages/dd-trace/src/ci-visibility/exporters/agentless/request-tracker.js +164 -0
  99. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +22 -6
  100. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +365 -32
  101. package/packages/dd-trace/src/ci-visibility/exporters/request.js +201 -0
  102. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +5 -3
  103. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +9 -5
  104. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  105. package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +39 -0
  106. package/packages/dd-trace/src/ci-visibility/requests/request.js +3 -6
  107. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +6 -2
  108. package/packages/dd-trace/src/config/generated-config-types.d.ts +7 -0
  109. package/packages/dd-trace/src/config/index.js +13 -2
  110. package/packages/dd-trace/src/config/major-overrides.js +7 -0
  111. package/packages/dd-trace/src/config/supported-configurations.json +24 -0
  112. package/packages/dd-trace/src/datastreams/context.js +6 -1
  113. package/packages/dd-trace/src/datastreams/index.js +2 -0
  114. package/packages/dd-trace/src/datastreams/manager.js +14 -3
  115. package/packages/dd-trace/src/datastreams/pathway.js +23 -22
  116. package/packages/dd-trace/src/datastreams/processor.js +16 -13
  117. package/packages/dd-trace/src/datastreams/size.js +5 -0
  118. package/packages/dd-trace/src/debugger/devtools_client/index.js +3 -2
  119. package/packages/dd-trace/src/exporters/agent/writer.js +49 -9
  120. package/packages/dd-trace/src/exporters/common/buffering-exporter.js +6 -4
  121. package/packages/dd-trace/src/exporters/common/writer.js +11 -6
  122. package/packages/dd-trace/src/llmobs/constants/tags.js +5 -0
  123. package/packages/dd-trace/src/llmobs/experiments/client.js +163 -5
  124. package/packages/dd-trace/src/llmobs/experiments/dataset.js +241 -87
  125. package/packages/dd-trace/src/llmobs/experiments/experiment.js +280 -20
  126. package/packages/dd-trace/src/llmobs/experiments/index.js +58 -59
  127. package/packages/dd-trace/src/llmobs/experiments/noop.js +71 -3
  128. package/packages/dd-trace/src/llmobs/experiments/result.js +1 -0
  129. package/packages/dd-trace/src/llmobs/experiments/util.js +41 -5
  130. package/packages/dd-trace/src/llmobs/index.js +34 -2
  131. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +12 -3
  132. package/packages/dd-trace/src/llmobs/plugins/base.js +4 -2
  133. package/packages/dd-trace/src/llmobs/span_processor.js +16 -0
  134. package/packages/dd-trace/src/llmobs/tagger.js +96 -0
  135. package/packages/dd-trace/src/llmobs/util.js +78 -0
  136. package/packages/dd-trace/src/noop/proxy.js +3 -4
  137. package/packages/dd-trace/src/openfeature/flagging_provider.js +18 -2
  138. package/packages/dd-trace/src/openfeature/remote_config.js +1 -1
  139. package/packages/dd-trace/src/opentelemetry/context_manager.js +7 -7
  140. package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +2 -1
  141. package/packages/dd-trace/src/opentelemetry/logs/logger.js +67 -11
  142. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +14 -3
  143. package/packages/dd-trace/src/opentelemetry/metrics/index.js +25 -12
  144. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +2 -5
  145. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +96 -43
  146. package/packages/dd-trace/src/opentracing/propagation/text_map.js +126 -120
  147. package/packages/dd-trace/src/opentracing/propagation/text_map_dsm.js +4 -8
  148. package/packages/dd-trace/src/opentracing/tracer.js +5 -2
  149. package/packages/dd-trace/src/otel-thread-ctx.js +387 -0
  150. package/packages/dd-trace/src/plugin_manager.js +5 -3
  151. package/packages/dd-trace/src/plugins/ci_plugin.js +6 -1
  152. package/packages/dd-trace/src/plugins/index.js +1 -0
  153. package/packages/{datadog-plugin-jest/src/util.js → dd-trace/src/plugins/util/jest.js} +5 -65
  154. package/packages/dd-trace/src/plugins/util/test.js +93 -14
  155. package/packages/dd-trace/src/plugins/util/web.js +56 -2
  156. package/packages/dd-trace/src/profiling/profiler.js +1 -1
  157. package/packages/dd-trace/src/profiling/profilers/space.js +1 -3
  158. package/packages/dd-trace/src/profiling/profilers/wall.js +37 -90
  159. package/packages/dd-trace/src/profiling/webspan-utils.js +45 -0
  160. package/packages/dd-trace/src/proxy.js +38 -29
  161. package/packages/dd-trace/src/ritm.js +9 -2
  162. package/packages/dd-trace/src/serverless.js +37 -0
  163. package/packages/dd-trace/src/span_format.js +1 -0
  164. package/packages/dd-trace/src/span_stats.js +30 -3
  165. package/packages/dd-trace/src/storage-channels.js +86 -0
  166. package/packages/dd-trace/src/tracer.js +9 -2
  167. package/packages/dd-trace/src/tracer_metadata.js +14 -1
  168. package/packages/dd-trace/src/web-tags-cache.js +132 -0
  169. package/vendor/dist/@datadog/openfeature-node-server/LICENSE +201 -0
  170. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -0
  171. package/packages/datadog-instrumentations/src/helpers/optional-peer-bundler.js +0 -65
  172. package/packages/datadog-webpack/src/optional-peer-loader.js +0 -17
  173. package/packages/dd-trace/src/feature-registry.js +0 -29
  174. package/packages/dd-trace/src/openfeature/register.js +0 -35
  175. package/packages/dd-trace/src/openfeature/require-provider.js +0 -18
@@ -0,0 +1,164 @@
1
+ 'use strict'
2
+
3
+ const BaseWriter = require('../../../exporters/common/writer')
4
+
5
+ const FINAL_FLUSH_TIMEOUT_CODE = 'ERR_DD_TEST_OPTIMIZATION_FLUSH_TIMEOUT'
6
+
7
+ class TestOptimizationRequestTracker {
8
+ #writer
9
+ #pendingRequests = new Set()
10
+ #finalFlushes = new Set()
11
+ #activeFinalFlush
12
+
13
+ /**
14
+ * Creates request tracking for a Test Optimization writer.
15
+ *
16
+ * @param {BaseWriter} writer
17
+ */
18
+ constructor (writer) {
19
+ this.#writer = writer
20
+ }
21
+
22
+ /**
23
+ * Flushes queued payloads and, for a final flush, waits for requests that were
24
+ * already in flight. The absolute deadline prevents Test Optimization from
25
+ * keeping the test process alive indefinitely.
26
+ *
27
+ * @param {(error?: Error) => void} [done]
28
+ * @param {{ deadline?: number }} [options]
29
+ * @returns {void}
30
+ */
31
+ flush (done, options) {
32
+ if (options?.deadline === undefined) {
33
+ BaseWriter.prototype.flush.call(this.#writer, done, options)
34
+ return
35
+ }
36
+
37
+ const finalFlush = {
38
+ deadline: options.deadline,
39
+ done: done || (() => {}),
40
+ error: undefined,
41
+ requests: new Set(),
42
+ timeoutId: undefined,
43
+ writerDone: false,
44
+ }
45
+ this.#finalFlushes.add(finalFlush)
46
+
47
+ for (const pendingRequest of this.#pendingRequests) {
48
+ this.#attachRequest(finalFlush, pendingRequest)
49
+ }
50
+
51
+ const remaining = Math.max(0, options.deadline - Date.now())
52
+ finalFlush.timeoutId = setTimeout(() => {
53
+ const error = new Error('Timed out flushing Test Optimization data')
54
+ error.code = FINAL_FLUSH_TIMEOUT_CODE
55
+
56
+ finalFlush.error ||= error
57
+ finalFlush.writerDone = true
58
+
59
+ for (const pendingRequest of finalFlush.requests) {
60
+ pendingRequest.finalFlushes.delete(finalFlush)
61
+ if (pendingRequest.finalFlushes.size === 0) {
62
+ pendingRequest.controller.abort(error)
63
+ this.#pendingRequests.delete(pendingRequest)
64
+ } else {
65
+ this.#updateRequestDeadline(pendingRequest)
66
+ }
67
+ }
68
+ finalFlush.requests.clear()
69
+ this.#finishFinalFlush(finalFlush)
70
+ }, remaining)
71
+
72
+ const previousFinalFlush = this.#activeFinalFlush
73
+ this.#activeFinalFlush = finalFlush
74
+ try {
75
+ BaseWriter.prototype.flush.call(this.#writer, (error) => {
76
+ finalFlush.error ||= error
77
+ finalFlush.writerDone = true
78
+ this.#finishFinalFlush(finalFlush)
79
+ }, options)
80
+ } finally {
81
+ this.#activeFinalFlush = previousFinalFlush
82
+ }
83
+ this.#finishFinalFlush(finalFlush)
84
+ }
85
+
86
+ /**
87
+ * Sends and tracks a request so a later final flush can wait for or abort it.
88
+ *
89
+ * @param {Function} request
90
+ * @param {Buffer|string|object} data
91
+ * @param {object} options
92
+ * @param {(error: Error|null, result?: string|null, statusCode?: number,
93
+ * headers?: import('node:http').IncomingHttpHeaders) => void} callback
94
+ * @returns {void}
95
+ */
96
+ send (request, data, options, callback) {
97
+ const controller = new AbortController()
98
+ const requestOptions = { ...options, signal: controller.signal }
99
+ const pendingRequest = { controller, finalFlushes: new Set(), options: requestOptions }
100
+ this.#pendingRequests.add(pendingRequest)
101
+ if (this.#activeFinalFlush) this.#attachRequest(this.#activeFinalFlush, pendingRequest)
102
+
103
+ request(data, requestOptions, (error, result, statusCode, headers) => {
104
+ if (error) {
105
+ for (const finalFlush of pendingRequest.finalFlushes) finalFlush.error ||= error
106
+ }
107
+
108
+ try {
109
+ callback(error, result, statusCode, headers)
110
+ } finally {
111
+ this.#pendingRequests.delete(pendingRequest)
112
+ for (const finalFlush of pendingRequest.finalFlushes) {
113
+ finalFlush.requests.delete(pendingRequest)
114
+ this.#finishFinalFlush(finalFlush)
115
+ }
116
+ pendingRequest.finalFlushes.clear()
117
+ }
118
+ })
119
+ }
120
+
121
+ /**
122
+ * Associates a request with the final flush boundary that must wait for it.
123
+ *
124
+ * @param {object} finalFlush
125
+ * @param {object} pendingRequest
126
+ * @returns {void}
127
+ */
128
+ #attachRequest (finalFlush, pendingRequest) {
129
+ finalFlush.requests.add(pendingRequest)
130
+ pendingRequest.finalFlushes.add(finalFlush)
131
+ this.#updateRequestDeadline(pendingRequest)
132
+ }
133
+
134
+ /**
135
+ * Gives a shared request the latest deadline of the flushes waiting for it.
136
+ *
137
+ * @param {object} pendingRequest
138
+ * @returns {void}
139
+ */
140
+ #updateRequestDeadline (pendingRequest) {
141
+ let deadline = 0
142
+ for (const finalFlush of pendingRequest.finalFlushes) {
143
+ deadline = Math.max(deadline, finalFlush.deadline)
144
+ }
145
+ pendingRequest.options.deadline = deadline
146
+ }
147
+
148
+ /**
149
+ * Completes a final flush callback once its writer and associated requests
150
+ * have settled.
151
+ *
152
+ * @param {object} finalFlush
153
+ * @returns {void}
154
+ */
155
+ #finishFinalFlush (finalFlush) {
156
+ if (!this.#finalFlushes.has(finalFlush) || !finalFlush.writerDone || finalFlush.requests.size !== 0) return
157
+
158
+ this.#finalFlushes.delete(finalFlush)
159
+ clearTimeout(finalFlush.timeoutId)
160
+ finalFlush.done(finalFlush.error)
161
+ }
162
+ }
163
+
164
+ module.exports = TestOptimizationRequestTracker
@@ -1,11 +1,8 @@
1
1
  'use strict'
2
2
  const getConfig = require('../../../config')
3
- const request = require('../../../exporters/common/request')
4
3
  const { safeJSONStringify } = require('../../../exporters/common/util')
5
4
  const log = require('../../../log')
6
5
 
7
- const { AgentlessCiVisibilityEncoder } = require('../../../encode/agentless-ci-visibility')
8
- const BaseWriter = require('../../../exporters/common/writer')
9
6
  const {
10
7
  incrementCountMetric,
11
8
  distributionMetric,
@@ -15,17 +12,35 @@ const {
15
12
  TELEMETRY_ENDPOINT_PAYLOAD_REQUESTS_ERRORS,
16
13
  TELEMETRY_ENDPOINT_PAYLOAD_DROPPED,
17
14
  } = require('../../../ci-visibility/telemetry')
15
+ const { AgentlessCiVisibilityEncoder } = require('../../../encode/agentless-ci-visibility')
16
+ const BaseWriter = require('../../../exporters/common/writer')
17
+ const request = require('../request')
18
+ const TestOptimizationRequestTracker = require('./request-tracker')
18
19
 
19
20
  class Writer extends BaseWriter {
21
+ #requestTracker
22
+
20
23
  constructor ({ url, tags, evpProxyPrefix = '' }) {
21
24
  super(...arguments)
25
+ this.#requestTracker = new TestOptimizationRequestTracker(this)
22
26
  const { 'runtime-id': runtimeId, env, service } = tags
23
27
  this._url = url
24
28
  this._encoder = new AgentlessCiVisibilityEncoder(this, { runtimeId, env, service })
25
29
  this._evpProxyPrefix = evpProxyPrefix
26
30
  }
27
31
 
28
- _sendPayload (data, _, done) {
32
+ /**
33
+ * Flushes buffered events, waiting for tracked requests during finalization.
34
+ *
35
+ * @param {(error?: Error) => void} [done]
36
+ * @param {{ deadline?: number }} [options]
37
+ * @returns {void}
38
+ */
39
+ flush (done, options) {
40
+ this.#requestTracker.flush(done, options)
41
+ }
42
+
43
+ _sendPayload (data, _, done, flushOptions) {
29
44
  const options = {
30
45
  path: '/api/v2/citestcycle',
31
46
  method: 'POST',
@@ -35,6 +50,7 @@ class Writer extends BaseWriter {
35
50
  },
36
51
  timeout: 15_000,
37
52
  url: this._url,
53
+ deadline: flushOptions?.deadline,
38
54
  }
39
55
 
40
56
  if (this._evpProxyPrefix) {
@@ -51,7 +67,7 @@ class Writer extends BaseWriter {
51
67
  incrementCountMetric(TELEMETRY_ENDPOINT_PAYLOAD_REQUESTS, { endpoint: 'test_cycle' })
52
68
  distributionMetric(TELEMETRY_ENDPOINT_PAYLOAD_BYTES, { endpoint: 'test_cycle' }, Buffer.byteLength(data))
53
69
 
54
- request(data, options, (err, res, statusCode) => {
70
+ this.#requestTracker.send(request, data, options, (err, res, statusCode) => {
55
71
  distributionMetric(
56
72
  TELEMETRY_ENDPOINT_PAYLOAD_REQUESTS_MS,
57
73
  { endpoint: 'test_cycle' },
@@ -67,7 +83,7 @@ class Writer extends BaseWriter {
67
83
  { endpoint: 'test_cycle' }
68
84
  )
69
85
  log.error('Error sending CI agentless payload', err)
70
- done()
86
+ done(err)
71
87
  return
72
88
  }
73
89
  log.debug('Response from the intake:', res)