dd-trace 5.109.0 → 5.111.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 (208) hide show
  1. package/README.md +13 -8
  2. package/ci/init.js +25 -5
  3. package/ci/vitest-no-worker-init-setup.mjs +430 -0
  4. package/ext/tags.js +2 -0
  5. package/index.d.ts +79 -24
  6. package/initialize.mjs +5 -6
  7. package/loader-hook.mjs +154 -47
  8. package/package.json +20 -16
  9. package/packages/datadog-esbuild/index.js +26 -0
  10. package/packages/datadog-esbuild/src/utils.js +46 -3
  11. package/packages/datadog-instrumentations/src/connect.js +4 -3
  12. package/packages/datadog-instrumentations/src/fastify.js +4 -12
  13. package/packages/datadog-instrumentations/src/fs.js +8 -6
  14. package/packages/datadog-instrumentations/src/graphql.js +26 -484
  15. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +81 -8
  16. package/packages/datadog-instrumentations/src/helpers/instrument.js +27 -2
  17. package/packages/datadog-instrumentations/src/helpers/optional-peer-bundler.js +65 -0
  18. package/packages/datadog-instrumentations/src/helpers/register.js +6 -4
  19. package/packages/datadog-instrumentations/src/helpers/require-optional-peer.js +17 -0
  20. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql.js +201 -0
  21. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
  22. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +18 -2
  23. package/packages/datadog-instrumentations/src/koa.js +3 -2
  24. package/packages/datadog-instrumentations/src/mariadb.js +4 -2
  25. package/packages/datadog-instrumentations/src/mocha/main.js +3 -3
  26. package/packages/datadog-instrumentations/src/mongoose.js +14 -2
  27. package/packages/datadog-instrumentations/src/next.js +10 -10
  28. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +7 -6
  29. package/packages/datadog-instrumentations/src/playwright.js +1 -1
  30. package/packages/datadog-instrumentations/src/restify.js +4 -3
  31. package/packages/datadog-instrumentations/src/router.js +18 -5
  32. package/packages/datadog-instrumentations/src/selenium.js +1 -2
  33. package/packages/datadog-instrumentations/src/tedious.js +28 -0
  34. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +1293 -0
  35. package/packages/datadog-instrumentations/src/vitest-main.js +1567 -0
  36. package/packages/datadog-instrumentations/src/vitest-util.js +249 -0
  37. package/packages/datadog-instrumentations/src/vitest-worker.js +753 -0
  38. package/packages/datadog-instrumentations/src/vitest.js +11 -1598
  39. package/packages/datadog-plugin-avsc/src/schema_iterator.js +2 -2
  40. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/client.js +2 -2
  41. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/context.js +18 -10
  42. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +47 -11
  43. package/packages/datadog-plugin-aws-sdk/src/base.js +13 -9
  44. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +43 -6
  45. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +83 -91
  46. package/packages/datadog-plugin-cucumber/src/index.js +1 -1
  47. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +19 -5
  48. package/packages/datadog-plugin-cypress/src/support.js +45 -1
  49. package/packages/datadog-plugin-express/src/code_origin.js +1 -1
  50. package/packages/datadog-plugin-fastify/src/code_origin.js +1 -1
  51. package/packages/datadog-plugin-graphql/src/execute.js +627 -11
  52. package/packages/datadog-plugin-graphql/src/index.js +20 -8
  53. package/packages/datadog-plugin-graphql/src/parse.js +24 -4
  54. package/packages/datadog-plugin-graphql/src/validate.js +16 -5
  55. package/packages/datadog-plugin-http/src/client.js +8 -3
  56. package/packages/datadog-plugin-http/src/index.js +6 -8
  57. package/packages/datadog-plugin-http2/src/client.js +5 -2
  58. package/packages/datadog-plugin-jest/src/index.js +1 -1
  59. package/packages/datadog-plugin-mocha/src/index.js +1 -1
  60. package/packages/datadog-plugin-mysql/src/index.js +7 -2
  61. package/packages/datadog-plugin-openai/src/services.js +2 -2
  62. package/packages/datadog-plugin-playwright/src/index.js +1 -1
  63. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +2 -2
  64. package/packages/datadog-plugin-undici/src/index.js +5 -2
  65. package/packages/datadog-plugin-vitest/src/index.js +76 -64
  66. package/packages/datadog-shimmer/src/shimmer.js +37 -16
  67. package/packages/datadog-webpack/index.js +17 -1
  68. package/packages/datadog-webpack/src/optional-peer-loader.js +17 -0
  69. package/packages/dd-trace/src/aiguard/sdk.js +15 -3
  70. package/packages/dd-trace/src/appsec/api_security/index.js +55 -0
  71. package/packages/dd-trace/src/appsec/api_security/sampler.js +147 -0
  72. package/packages/dd-trace/src/appsec/channels.js +3 -1
  73. package/packages/dd-trace/src/appsec/downstream_requests.js +4 -4
  74. package/packages/dd-trace/src/appsec/graphql.js +5 -5
  75. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +26 -19
  76. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +2 -2
  77. package/packages/dd-trace/src/appsec/iast/telemetry/index.js +2 -1
  78. package/packages/dd-trace/src/appsec/index.js +20 -7
  79. package/packages/dd-trace/src/appsec/lambda.js +135 -0
  80. package/packages/dd-trace/src/appsec/reporter.js +50 -10
  81. package/packages/dd-trace/src/appsec/telemetry/api_security.js +34 -0
  82. package/packages/dd-trace/src/appsec/telemetry/index.js +27 -1
  83. package/packages/dd-trace/src/appsec/waf/index.js +16 -4
  84. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +4 -4
  85. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +21 -6
  86. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +2 -2
  87. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  88. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  89. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +3 -2
  90. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  91. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +55 -13
  92. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  93. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +17 -0
  94. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +47 -26
  95. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +2 -2
  96. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +64 -53
  97. package/packages/dd-trace/src/ci-visibility/requests/request.js +1 -17
  98. package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +3 -3
  99. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +23 -5
  100. package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache-schema.js +128 -0
  101. package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +287 -0
  102. package/packages/dd-trace/src/config/defaults.js +25 -5
  103. package/packages/dd-trace/src/config/generated-config-types.d.ts +596 -58
  104. package/packages/dd-trace/src/config/helper.js +134 -33
  105. package/packages/dd-trace/src/config/index.js +39 -23
  106. package/packages/dd-trace/src/config/major-overrides.js +4 -2
  107. package/packages/dd-trace/src/config/parsers.js +19 -1
  108. package/packages/dd-trace/src/config/remote_config.js +1 -1
  109. package/packages/dd-trace/src/config/supported-configurations.json +109 -57
  110. package/packages/dd-trace/src/constants.js +7 -0
  111. package/packages/dd-trace/src/datastreams/processor.js +11 -3
  112. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +47 -35
  113. package/packages/dd-trace/src/debugger/devtools_client/index.js +31 -66
  114. package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +83 -0
  115. package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -0
  116. package/packages/dd-trace/src/debugger/index.js +5 -0
  117. package/packages/dd-trace/src/debugger/probe_sampler.js +112 -0
  118. package/packages/dd-trace/src/debugger/probe_sampler_constants.js +19 -0
  119. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +77 -26
  120. package/packages/dd-trace/src/exporters/agent/index.js +1 -1
  121. package/packages/dd-trace/src/exporters/agentless/writer.js +4 -4
  122. package/packages/dd-trace/src/exporters/common/request.js +1 -20
  123. package/packages/dd-trace/src/exporters/common/url.js +34 -0
  124. package/packages/dd-trace/src/exporters/span-stats/writer.js +1 -3
  125. package/packages/dd-trace/src/guardrails/index.js +8 -5
  126. package/packages/dd-trace/src/index.js +6 -4
  127. package/packages/dd-trace/src/llmobs/constants/tags.js +6 -0
  128. package/packages/dd-trace/src/llmobs/index.js +17 -6
  129. package/packages/dd-trace/src/llmobs/plugins/base.js +4 -4
  130. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +3 -3
  131. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +5 -1
  132. package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -1
  133. package/packages/dd-trace/src/llmobs/sdk.js +8 -6
  134. package/packages/dd-trace/src/llmobs/span_processor.js +5 -1
  135. package/packages/dd-trace/src/llmobs/tagger.js +58 -3
  136. package/packages/dd-trace/src/llmobs/telemetry.js +1 -0
  137. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  138. package/packages/dd-trace/src/log/index.js +18 -20
  139. package/packages/dd-trace/src/openfeature/flagging_provider.js +2 -7
  140. package/packages/dd-trace/src/opentelemetry/bridge-span-base.js +5 -4
  141. package/packages/dd-trace/src/opentelemetry/metrics/index.js +54 -5
  142. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +2 -1
  143. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +40 -0
  144. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +169 -0
  145. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +4 -3
  146. package/packages/dd-trace/src/opentelemetry/metrics/time.js +19 -0
  147. package/packages/dd-trace/src/opentelemetry/otlp/common.proto +2 -2
  148. package/packages/dd-trace/src/opentelemetry/otlp/logs.proto +1 -1
  149. package/packages/dd-trace/src/opentelemetry/otlp/logs_service.proto +1 -1
  150. package/packages/dd-trace/src/opentelemetry/otlp/metrics.proto +1 -1
  151. package/packages/dd-trace/src/opentelemetry/otlp/metrics_service.proto +1 -1
  152. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +44 -38
  153. package/packages/dd-trace/src/opentelemetry/span-helpers.js +29 -13
  154. package/packages/dd-trace/src/opentelemetry/span.js +14 -3
  155. package/packages/dd-trace/src/opentelemetry/span_context.js +1 -0
  156. package/packages/dd-trace/src/opentelemetry/trace/index.js +6 -1
  157. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +3 -2
  158. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +26 -13
  159. package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
  160. package/packages/dd-trace/src/opentracing/propagation/text_map.js +3 -3
  161. package/packages/dd-trace/src/opentracing/span_context.js +17 -0
  162. package/packages/dd-trace/src/opentracing/tracer.js +6 -1
  163. package/packages/dd-trace/src/plugin_manager.js +14 -8
  164. package/packages/dd-trace/src/plugins/ci_plugin.js +21 -4
  165. package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +276 -0
  166. package/packages/dd-trace/src/plugins/util/llm.js +6 -1
  167. package/packages/dd-trace/src/plugins/util/test.js +91 -9
  168. package/packages/dd-trace/src/plugins/util/url.js +68 -1
  169. package/packages/dd-trace/src/plugins/util/web.js +19 -36
  170. package/packages/dd-trace/src/priority_sampler.js +1 -13
  171. package/packages/dd-trace/src/profiling/config.js +129 -198
  172. package/packages/dd-trace/src/profiling/constants.js +4 -7
  173. package/packages/dd-trace/src/profiling/exporter_cli.js +10 -10
  174. package/packages/dd-trace/src/profiling/exporters/agent.js +23 -16
  175. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +45 -14
  176. package/packages/dd-trace/src/profiling/exporters/file.js +16 -5
  177. package/packages/dd-trace/src/profiling/oom.js +71 -0
  178. package/packages/dd-trace/src/profiling/profiler.js +35 -23
  179. package/packages/dd-trace/src/profiling/profilers/events.js +14 -7
  180. package/packages/dd-trace/src/profiling/profilers/space.js +27 -18
  181. package/packages/dd-trace/src/profiling/profilers/wall.js +35 -25
  182. package/packages/dd-trace/src/proxy.js +8 -8
  183. package/packages/dd-trace/src/ritm.js +4 -2
  184. package/packages/dd-trace/src/serverless.js +1 -2
  185. package/packages/dd-trace/src/service-naming/schemas/util.js +36 -5
  186. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +5 -3
  187. package/packages/dd-trace/src/span_format.js +2 -1
  188. package/packages/dd-trace/src/span_processor.js +11 -6
  189. package/packages/dd-trace/src/span_stats.js +96 -78
  190. package/packages/dd-trace/src/startup-log.js +2 -1
  191. package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
  192. package/packages/dd-trace/src/telemetry/endpoints.js +6 -4
  193. package/packages/dd-trace/src/telemetry/index.js +2 -2
  194. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  195. package/packages/dd-trace/src/telemetry/send-data.js +20 -18
  196. package/packages/dd-trace/src/telemetry/session-propagation.js +1 -1
  197. package/packages/dd-trace/src/telemetry/telemetry.js +9 -9
  198. package/packages/dd-trace/src/tracer.js +15 -1
  199. package/packages/dd-trace/src/util.js +14 -0
  200. package/register.js +58 -1
  201. package/vendor/dist/@apm-js-collab/code-transformer/index.js +1 -1
  202. package/vendor/dist/@datadog/sketches-js/index.js +1 -1
  203. package/vendor/dist/pprof-format/index.js +1 -1
  204. package/vendor/dist/protobufjs/index.js +1 -1
  205. package/vendor/dist/protobufjs/minimal/index.js +1 -1
  206. package/vendor/dist/shell-quote/index.js +1 -1
  207. package/packages/datadog-plugin-graphql/src/resolve.js +0 -170
  208. package/packages/dd-trace/src/appsec/api_security_sampler.js +0 -117
@@ -36,7 +36,7 @@ class WAFContextWrapper {
36
36
  }
37
37
  }
38
38
 
39
- run ({ persistent, ephemeral }, raspRule, req) {
39
+ run ({ persistent, ephemeral }, raspRule, req, rootSpan) {
40
40
  if (this.ddwafContext.disposed) {
41
41
  log.warn('[ASM] Calling run on a disposed context')
42
42
  if (raspRule) {
@@ -156,10 +156,10 @@ class WAFContextWrapper {
156
156
  metrics.wafTimeout = result.timeout
157
157
 
158
158
  if (ruleTriggered) {
159
- Reporter.reportAttack(result, req)
159
+ Reporter.reportAttack(result, req, rootSpan)
160
160
  }
161
161
 
162
- Reporter.reportAttributes(result.attributes, req)
162
+ Reporter.reportAttributes(result.attributes, req, rootSpan)
163
163
 
164
164
  return result
165
165
  } catch (err) {
@@ -171,7 +171,7 @@ class WAFContextWrapper {
171
171
  wafRunFinished.publish({ payload })
172
172
  }
173
173
 
174
- Reporter.reportMetrics(metrics, raspRule, req)
174
+ Reporter.reportMetrics(metrics, raspRule, req, rootSpan)
175
175
  }
176
176
  }
177
177
 
@@ -17,6 +17,7 @@ const {
17
17
 
18
18
  const { getNumFromKnownTests } = require('../../plugins/util/test')
19
19
  const { buildCacheKey, writeToCache, withCache } = require('../requests/fs-cache')
20
+ const { validateKnownTestsResponse } = require('../test-optimization-http-cache-schema')
20
21
 
21
22
  const MAX_KNOWN_TESTS_PAGES = 10_000
22
23
 
@@ -52,6 +53,19 @@ function mergeKnownTests (aggregate, page) {
52
53
  return aggregate
53
54
  }
54
55
 
56
+ function parseJsonResponse (rawJson) {
57
+ return typeof rawJson === 'string' ? JSON.parse(rawJson) : rawJson
58
+ }
59
+
60
+ function parseKnownTestsResponse (rawJson, options = {}) {
61
+ const parsedResponse = parseJsonResponse(rawJson)
62
+ if (options.validateRequiredFields) {
63
+ validateKnownTestsResponse(parsedResponse)
64
+ }
65
+ const { data: { attributes: { tests } } } = parsedResponse
66
+ return tests
67
+ }
68
+
55
69
  function getKnownTests ({
56
70
  url,
57
71
  isEvpProxy,
@@ -151,12 +165,12 @@ function fetchFromApi ({
151
165
  options.path = `${evpProxyPrefix}/api/v2/ci/libraries/tests`
152
166
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
153
167
  } else {
154
- const { apiKey } = getConfig()
155
- if (!apiKey) {
168
+ const { DD_API_KEY } = getConfig()
169
+ if (!DD_API_KEY) {
156
170
  return done(new Error('Known tests were not fetched because Datadog API key is not defined.'))
157
171
  }
158
172
 
159
- options.headers['dd-api-key'] = apiKey
173
+ options.headers['dd-api-key'] = DD_API_KEY
160
174
  }
161
175
 
162
176
  const configurations = {
@@ -211,8 +225,9 @@ function fetchFromApi ({
211
225
  try {
212
226
  totalResponseBytes += res.length
213
227
 
214
- const { data: { attributes } } = JSON.parse(res)
215
- const { tests: pageTests, page_info: responsePageInfo } = attributes
228
+ const parsedResponse = parseJsonResponse(res)
229
+ const pageTests = parseKnownTestsResponse(parsedResponse)
230
+ const { page_info: responsePageInfo } = parsedResponse.data.attributes
216
231
 
217
232
  aggregateTests = mergeKnownTests(aggregateTests, pageTests)
218
233
 
@@ -251,4 +266,4 @@ function fetchFromApi ({
251
266
  fetchPage(null)
252
267
  }
253
268
 
254
- module.exports = { getKnownTests }
269
+ module.exports = { getKnownTests, parseKnownTestsResponse }
@@ -40,7 +40,7 @@ class AgentProxyCiVisibilityExporter extends CiVisibilityExporter {
40
40
  lookup,
41
41
  protocolVersion,
42
42
  headers,
43
- isTestDynamicInstrumentationEnabled,
43
+ testOptimization,
44
44
  } = config
45
45
 
46
46
  fetchAgentInfo(this._url, (err, agentInfo) => {
@@ -68,7 +68,7 @@ class AgentProxyCiVisibilityExporter extends CiVisibilityExporter {
68
68
  evpProxyPrefix,
69
69
  })
70
70
  this._codeCoverageReportUrl = this._url
71
- if (isTestDynamicInstrumentationEnabled) {
71
+ if (testOptimization.DD_TEST_FAILED_TEST_REPLAY_ENABLED) {
72
72
  const canFowardLogs = getCanForwardDebuggerLogs(err, agentInfo)
73
73
  if (canFowardLogs) {
74
74
  const DynamicInstrumentationLogsWriter = require('../agentless/di-logs-writer')
@@ -29,7 +29,7 @@ class Writer extends BaseWriter {
29
29
  path: '/api/v2/citestcov',
30
30
  method: 'POST',
31
31
  headers: {
32
- 'dd-api-key': getConfig().apiKey,
32
+ 'dd-api-key': getConfig().DD_API_KEY,
33
33
  ...form.getHeaders(),
34
34
  },
35
35
  timeout: 15_000,
@@ -26,7 +26,7 @@ class DynamicInstrumentationLogsWriter extends BaseWriter {
26
26
  path: '/api/v2/logs',
27
27
  method: 'POST',
28
28
  headers: {
29
- 'dd-api-key': getConfig().apiKey,
29
+ 'dd-api-key': getConfig().DD_API_KEY,
30
30
  'Content-Type': 'application/json',
31
31
  },
32
32
  timeout: this.timeout,
@@ -9,7 +9,8 @@ const CoverageWriter = require('./coverage-writer')
9
9
  class AgentlessCiVisibilityExporter extends CiVisibilityExporter {
10
10
  constructor (config) {
11
11
  super(config)
12
- const { tags, site, DD_CIVISIBILITY_AGENTLESS_URL: url, isTestDynamicInstrumentationEnabled } = config
12
+ const { tags, site, testOptimization } = config
13
+ const { DD_CIVISIBILITY_AGENTLESS_URL: url } = testOptimization
13
14
  // we don't need to request /info because we are using agentless by configuration
14
15
  this._isInitialized = true
15
16
  this._resolveCanUseCiVisProtocol(true)
@@ -23,7 +24,7 @@ class AgentlessCiVisibilityExporter extends CiVisibilityExporter {
23
24
 
24
25
  this._codeCoverageReportUrl = url || new URL(`https://ci-intake.${site}`)
25
26
 
26
- if (isTestDynamicInstrumentationEnabled) {
27
+ if (testOptimization.DD_TEST_FAILED_TEST_REPLAY_ENABLED) {
27
28
  const DynamicInstrumentationLogsWriter = require('./di-logs-writer')
28
29
  this._logsUrl = url || new URL(`https://http-intake.logs.${site}`)
29
30
  this._logsWriter = new DynamicInstrumentationLogsWriter({ url: this._logsUrl, tags })
@@ -30,7 +30,7 @@ class Writer extends BaseWriter {
30
30
  path: '/api/v2/citestcycle',
31
31
  method: 'POST',
32
32
  headers: {
33
- 'dd-api-key': getConfig().apiKey,
33
+ 'dd-api-key': getConfig().DD_API_KEY,
34
34
  'Content-Type': 'application/msgpack',
35
35
  },
36
36
  timeout: 15_000,
@@ -7,6 +7,8 @@ const { getSkippableSuites: getSkippableSuitesRequest } = require('../intelligen
7
7
  const { getKnownTests: getKnownTestsRequest } = require('../early-flake-detection/get-known-tests')
8
8
  const { getTestManagementTests: getTestManagementTestsRequest } =
9
9
  require('../test-management/get-test-management-tests')
10
+ const { writeSettingsToCache } = require('../test-optimization-cache')
11
+ const { CACHE_MISS, TestOptimizationHttpCache } = require('../test-optimization-http-cache')
10
12
  const { uploadCoverageReport: uploadCoverageReportRequest } = require('../requests/upload-coverage-report')
11
13
  const log = require('../../log')
12
14
  const BufferingExporter = require('../../exporters/common/buffering-exporter')
@@ -42,6 +44,7 @@ class CiVisibilityExporter extends BufferingExporter {
42
44
  this._coverageTimer = undefined
43
45
  this._logsTimer = undefined
44
46
  this._coverageBuffer = []
47
+ this._testOptimizationHttpCache = new TestOptimizationHttpCache()
45
48
  // The library can use new features like ITR and test suite level visibility
46
49
  // AKA CI Vis Protocol
47
50
  this._canUseCiVisProtocol = false
@@ -86,7 +89,7 @@ class CiVisibilityExporter extends BufferingExporter {
86
89
  }
87
90
 
88
91
  shouldRequestSkippableSuites () {
89
- return !!(this._config.isIntelligentTestRunnerEnabled &&
92
+ return !!(this._config.testOptimization.DD_CIVISIBILITY_ITR_ENABLED &&
90
93
  this._canUseCiVisProtocol &&
91
94
  this._libraryConfig?.isSuitesSkippingEnabled)
92
95
  }
@@ -101,7 +104,7 @@ class CiVisibilityExporter extends BufferingExporter {
101
104
  shouldRequestTestManagementTests () {
102
105
  return !!(
103
106
  this._canUseCiVisProtocol &&
104
- this._config.isTestManagementEnabled &&
107
+ this._config.testOptimization.DD_TEST_MANAGEMENT_ENABLED &&
105
108
  this._libraryConfig?.isTestManagementEnabled
106
109
  )
107
110
  }
@@ -133,11 +136,21 @@ class CiVisibilityExporter extends BufferingExporter {
133
136
  if (!this.shouldRequestSkippableSuites()) {
134
137
  return callback(null, [])
135
138
  }
139
+ const requestConfiguration = this.getRequestConfiguration(testConfiguration)
140
+ const cachedSkippableSuites = this._testOptimizationHttpCache.readSkippableSuites({
141
+ testLevel: requestConfiguration.testLevel,
142
+ isCoverageReportUploadEnabled: requestConfiguration.isCoverageReportUploadEnabled,
143
+ })
144
+ if (cachedSkippableSuites !== CACHE_MISS) {
145
+ const { skippableSuites, correlationId, coverage } = cachedSkippableSuites
146
+ return callback(null, skippableSuites, correlationId, coverage)
147
+ }
148
+
136
149
  this._gitUploadPromise.then(gitUploadError => {
137
150
  if (gitUploadError) {
138
151
  return callback(gitUploadError, [])
139
152
  }
140
- getSkippableSuitesRequest(this.getRequestConfiguration(testConfiguration), callback)
153
+ getSkippableSuitesRequest(requestConfiguration, callback)
141
154
  })
142
155
  }
143
156
 
@@ -145,6 +158,10 @@ class CiVisibilityExporter extends BufferingExporter {
145
158
  if (!this.shouldRequestKnownTests()) {
146
159
  return callback(null)
147
160
  }
161
+ const cachedKnownTests = this._testOptimizationHttpCache.readKnownTests()
162
+ if (cachedKnownTests !== CACHE_MISS) {
163
+ return callback(null, cachedKnownTests)
164
+ }
148
165
  getKnownTestsRequest(this.getRequestConfiguration(testConfiguration), callback)
149
166
  }
150
167
 
@@ -152,6 +169,10 @@ class CiVisibilityExporter extends BufferingExporter {
152
169
  if (!this.shouldRequestTestManagementTests()) {
153
170
  return callback(null)
154
171
  }
172
+ const cachedTestManagementTests = this._testOptimizationHttpCache.readTestManagementTests()
173
+ if (cachedTestManagementTests !== CACHE_MISS) {
174
+ return callback(null, cachedTestManagementTests)
175
+ }
155
176
  getTestManagementTestsRequest(this.getRequestConfiguration(testConfiguration), callback)
156
177
  }
157
178
 
@@ -161,13 +182,30 @@ class CiVisibilityExporter extends BufferingExporter {
161
182
  */
162
183
  getLibraryConfiguration (testConfiguration, callback) {
163
184
  const { repositoryUrl } = testConfiguration
164
- this.sendGitMetadata(repositoryUrl)
165
185
  this._canUseCiVisProtocolPromise.then((canUseCiVisProtocol) => {
166
186
  if (!canUseCiVisProtocol) {
167
187
  return callback(null, {})
168
188
  }
169
189
  const configuration = this.getRequestConfiguration(testConfiguration)
190
+ const cachedLibraryConfig = this._testOptimizationHttpCache.readSettings()
191
+ if (cachedLibraryConfig !== CACHE_MISS) {
192
+ log.debug('Test Optimization HTTP cache settings found, skipping settings request')
193
+ writeSettingsToCache(cachedLibraryConfig)
194
+ this._libraryConfig = this.filterConfiguration(cachedLibraryConfig)
195
+ const canUseCachedSkippableSuites = !this.shouldRequestSkippableSuites() ||
196
+ this._testOptimizationHttpCache.hasValidSkippableSuites({
197
+ testLevel: configuration.testLevel,
198
+ isCoverageReportUploadEnabled: configuration.isCoverageReportUploadEnabled,
199
+ })
200
+ if (this._libraryConfig.requireGit && !canUseCachedSkippableSuites) {
201
+ this.sendGitMetadata(repositoryUrl)
202
+ } else {
203
+ this._resolveGit()
204
+ }
205
+ return callback(null, this._libraryConfig)
206
+ }
170
207
 
208
+ this.sendGitMetadata(repositoryUrl)
171
209
  getLibraryConfigurationRequest(configuration, (err, libraryConfig) => {
172
210
  /**
173
211
  * **Important**: this._libraryConfig remains empty in testing frameworks
@@ -218,29 +256,32 @@ class CiVisibilityExporter extends BufferingExporter {
218
256
  isImpactedTestsEnabled,
219
257
  isCoverageReportUploadEnabled,
220
258
  } = remoteConfiguration
259
+ const { testOptimization } = this._config
221
260
  return {
222
261
  isCodeCoverageEnabled,
223
262
  isSuitesSkippingEnabled,
224
263
  isItrEnabled,
225
264
  requireGit,
226
- isEarlyFlakeDetectionEnabled: isEarlyFlakeDetectionEnabled && this._config.isEarlyFlakeDetectionEnabled,
265
+ isEarlyFlakeDetectionEnabled:
266
+ isEarlyFlakeDetectionEnabled && testOptimization.DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED,
227
267
  earlyFlakeDetectionNumRetries,
228
268
  earlyFlakeDetectionSlowTestRetries,
229
269
  earlyFlakeDetectionFaultyThreshold,
230
- isFlakyTestRetriesEnabled: isFlakyTestRetriesEnabled && this._config.isFlakyTestRetriesEnabled,
231
- flakyTestRetriesCount: this._config.flakyTestRetriesCount,
232
- isDiEnabled: isDiEnabled && this._config.isTestDynamicInstrumentationEnabled,
270
+ isFlakyTestRetriesEnabled: isFlakyTestRetriesEnabled && testOptimization.DD_CIVISIBILITY_FLAKY_RETRY_ENABLED,
271
+ flakyTestRetriesCount: testOptimization.DD_CIVISIBILITY_FLAKY_RETRY_COUNT,
272
+ isDiEnabled: isDiEnabled && testOptimization.DD_TEST_FAILED_TEST_REPLAY_ENABLED,
233
273
  isKnownTestsEnabled,
234
- isTestManagementEnabled: isTestManagementEnabled && this._config.isTestManagementEnabled,
274
+ isTestManagementEnabled: isTestManagementEnabled && testOptimization.DD_TEST_MANAGEMENT_ENABLED,
235
275
  testManagementAttemptToFixRetries:
236
- testManagementAttemptToFixRetries ?? this._config.testManagementAttemptToFixRetries,
237
- isImpactedTestsEnabled: isImpactedTestsEnabled && this._config.isImpactedTestsEnabled,
276
+ testManagementAttemptToFixRetries ?? testOptimization.DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
277
+ isImpactedTestsEnabled:
278
+ isImpactedTestsEnabled && testOptimization.DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED,
238
279
  isCoverageReportUploadEnabled,
239
280
  }
240
281
  }
241
282
 
242
283
  sendGitMetadata (repositoryUrl) {
243
- if (!this._config.isGitUploadEnabled) {
284
+ if (!this._config.testOptimization.DD_CIVISIBILITY_GIT_UPLOAD_ENABLED) {
244
285
  return
245
286
  }
246
287
  this._canUseCiVisProtocolPromise.then((canUseCiVisProtocol) => {
@@ -318,7 +359,8 @@ class CiVisibilityExporter extends BufferingExporter {
318
359
  // DI logs
319
360
  exportDiLogs (testEnvironmentMetadata, logMessage) {
320
361
  // TODO: could we lose logs if it's not initialized?
321
- if (!this._config.isTestDynamicInstrumentationEnabled || !this._isInitialized || !this._canForwardLogs) {
362
+ if (!this._config.testOptimization.DD_TEST_FAILED_TEST_REPLAY_ENABLED ||
363
+ !this._isInitialized || !this._canForwardLogs) {
322
364
  return
323
365
  }
324
366
 
@@ -50,7 +50,7 @@ function getCommonRequestOptions (url) {
50
50
  return {
51
51
  method: 'POST',
52
52
  headers: {
53
- 'dd-api-key': getConfig().apiKey,
53
+ 'dd-api-key': getConfig().DD_API_KEY,
54
54
  },
55
55
  timeout: 15_000,
56
56
  url,
@@ -287,7 +287,7 @@ function sendGitMetadata (url, { isEvpProxy, evpProxyPrefix }, configRepositoryU
287
287
  }
288
288
  // Otherwise we unshallow and get commits to upload again
289
289
  log.debug('It is shallow clone, unshallowing...')
290
- if (getConfig().DD_CIVISIBILITY_GIT_UNSHALLOW_ENABLED) {
290
+ if (getConfig().testOptimization.DD_CIVISIBILITY_GIT_UNSHALLOW_ENABLED) {
291
291
  unshallowRepository(false)
292
292
  }
293
293
 
@@ -3,6 +3,11 @@ const { JSONEncoder } = require('../../encode/json-encoder')
3
3
  const { getEnvironmentVariable } = require('../../../config/helper')
4
4
  const log = require('../../../log')
5
5
 
6
+ function getVitestWorkerPort () {
7
+ const port = globalThis.__vitest_worker__?.ctx?.port
8
+ return typeof port?.postMessage === 'function' ? port : undefined
9
+ }
10
+
6
11
  class Writer {
7
12
  constructor (interprocessCode) {
8
13
  this._encoder = new JSONEncoder()
@@ -37,6 +42,18 @@ class Writer {
37
42
  ? { __tinypool_worker_message__: true, interprocessCode: this._interprocessCode, data }
38
43
  : [this._interprocessCode, data]
39
44
 
45
+ const vitestWorkerPort = getVitestWorkerPort()
46
+ if (vitestWorkerPort) {
47
+ try {
48
+ vitestWorkerPort.postMessage(payload)
49
+ } catch (error) {
50
+ log.error('Error posting message to vitest worker port', error)
51
+ } finally {
52
+ onDone()
53
+ }
54
+ return
55
+ }
56
+
40
57
  // child_process workers (jest default, cucumber)
41
58
  if (process.send) {
42
59
  process.send(payload, () => {
@@ -14,6 +14,42 @@ const {
14
14
  TELEMETRY_ITR_SKIPPABLE_TESTS_RESPONSE_BYTES,
15
15
  } = require('../../ci-visibility/telemetry')
16
16
  const { buildCacheKey, writeToCache, withCache } = require('../requests/fs-cache')
17
+ const { validateSkippableTestsResponse } = require('../test-optimization-http-cache-schema')
18
+
19
+ function parseJsonResponse (rawJson) {
20
+ return typeof rawJson === 'string' ? JSON.parse(rawJson) : rawJson
21
+ }
22
+
23
+ function parseSkippableSuitesResponse (
24
+ rawJson,
25
+ { testLevel = 'suite', isCoverageReportUploadEnabled = false, validateRequiredFields = false } = {}
26
+ ) {
27
+ const parsedResponse = parseJsonResponse(rawJson)
28
+ if (validateRequiredFields) {
29
+ validateSkippableTestsResponse(parsedResponse)
30
+ }
31
+ const coverage = parsedResponse.meta?.coverage || {}
32
+
33
+ const skippableItems = parsedResponse
34
+ .data
35
+ .filter(({ type }) => type === testLevel)
36
+ const skippableSuites = []
37
+ for (const {
38
+ attributes: {
39
+ suite,
40
+ name,
41
+ _is_missing_line_code_coverage: isMissingLineCodeCoverage,
42
+ },
43
+ } of skippableItems) {
44
+ // Only reject candidates without backend line coverage when we need that coverage to backfill reports.
45
+ if (isCoverageReportUploadEnabled && isMissingLineCodeCoverage) continue
46
+
47
+ skippableSuites.push(testLevel === 'suite' ? suite : { suite, name })
48
+ }
49
+ const correlationId = parsedResponse.meta?.correlation_id
50
+
51
+ return { skippableSuites, correlationId, coverage }
52
+ }
17
53
 
18
54
  function getSkippableSuites ({
19
55
  url,
@@ -124,12 +160,12 @@ function fetchFromApi ({
124
160
  options.path = `${evpProxyPrefix}/api/v2/ci/tests/skippable`
125
161
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
126
162
  } else {
127
- const { apiKey } = getConfig()
128
- if (!apiKey) {
163
+ const { DD_API_KEY } = getConfig()
164
+ if (!DD_API_KEY) {
129
165
  return done(new Error('Skippable suites were not fetched because Datadog API key is not defined.'))
130
166
  }
131
167
 
132
- options.headers['dd-api-key'] = apiKey
168
+ options.headers['dd-api-key'] = DD_API_KEY
133
169
  }
134
170
 
135
171
  const data = JSON.stringify({
@@ -163,26 +199,12 @@ function fetchFromApi ({
163
199
  done(err)
164
200
  } else {
165
201
  try {
166
- const parsedResponse = JSON.parse(res)
167
- const coverage = parsedResponse.meta?.coverage || {}
168
-
169
- const skippableItems = parsedResponse
170
- .data
171
- .filter(({ type }) => type === testLevel)
172
- const skippableSuites = []
173
- for (const {
174
- attributes: {
175
- suite,
176
- name,
177
- _is_missing_line_code_coverage: isMissingLineCodeCoverage,
178
- },
179
- } of skippableItems) {
180
- // Only reject candidates without backend line coverage when we need that coverage to backfill reports.
181
- if (isCoverageReportUploadEnabled && isMissingLineCodeCoverage) continue
182
-
183
- skippableSuites.push(testLevel === 'suite' ? suite : { suite, name })
184
- }
185
- const correlationId = parsedResponse.meta?.correlation_id
202
+ const parsedResponse = parseJsonResponse(res)
203
+ const result = parseSkippableSuitesResponse(parsedResponse, {
204
+ testLevel,
205
+ isCoverageReportUploadEnabled,
206
+ })
207
+ const skippableItems = parsedResponse.data.filter(({ type }) => type === testLevel)
186
208
  incrementCountMetric(
187
209
  testLevel === 'test'
188
210
  ? TELEMETRY_ITR_SKIPPABLE_TESTS_RESPONSE_TESTS
@@ -191,9 +213,8 @@ function fetchFromApi ({
191
213
  skippableItems.length
192
214
  )
193
215
  distributionMetric(TELEMETRY_ITR_SKIPPABLE_TESTS_RESPONSE_BYTES, {}, res.length)
194
- log.debug('Number of received skippable %ss:', testLevel, skippableSuites.length)
216
+ log.debug('Number of received skippable %ss:', testLevel, result.skippableSuites.length)
195
217
 
196
- const result = { skippableSuites, correlationId, coverage }
197
218
  writeToCache(cacheKey, result)
198
219
 
199
220
  done(null, result)
@@ -204,4 +225,4 @@ function fetchFromApi ({
204
225
  })
205
226
  }
206
227
 
207
- module.exports = { getSkippableSuites }
228
+ module.exports = { getSkippableSuites, parseSkippableSuitesResponse }
@@ -4,14 +4,14 @@ const Plugin = require('../../plugins/plugin')
4
4
  const log = require('../../log')
5
5
 
6
6
  function getWinstonLogSubmissionParameters (config) {
7
- const { site, service, apiKey, DD_AGENTLESS_LOG_SUBMISSION_URL } = config
7
+ const { site, service, DD_API_KEY, DD_AGENTLESS_LOG_SUBMISSION_URL } = config
8
8
 
9
9
  const defaultParameters = {
10
10
  host: `http-intake.logs.${site}`,
11
11
  path: `/api/v2/logs?ddsource=winston&service=${service}`,
12
12
  ssl: true,
13
13
  headers: {
14
- 'DD-API-KEY': apiKey,
14
+ 'DD-API-KEY': DD_API_KEY,
15
15
  },
16
16
  }
17
17
 
@@ -12,12 +12,72 @@ const {
12
12
  TELEMETRY_GIT_REQUESTS_SETTINGS_RESPONSE,
13
13
  } = require('../telemetry')
14
14
  const { writeSettingsToCache } = require('../test-optimization-cache')
15
+ const { validateSettingsResponse } = require('../test-optimization-http-cache-schema')
15
16
  const request = require('./request')
16
17
 
17
18
  const DEFAULT_EARLY_FLAKE_DETECTION_NUM_RETRIES = 2
18
19
  const DEFAULT_EARLY_FLAKE_DETECTION_SLOW_TEST_RETRIES = { '5s': 10, '10s': 5, '30s': 3, '5m': 2 }
19
20
  const DEFAULT_EARLY_FLAKE_DETECTION_ERROR_THRESHOLD = 30
20
21
 
22
+ function parseJsonResponse (rawJson) {
23
+ return typeof rawJson === 'string' ? JSON.parse(rawJson) : rawJson
24
+ }
25
+
26
+ function parseLibraryConfigurationResponse (rawJson, config = getConfig(), options = {}) {
27
+ const parsedResponse = parseJsonResponse(rawJson)
28
+ if (options.validateRequiredFields) {
29
+ validateSettingsResponse(parsedResponse)
30
+ }
31
+ const {
32
+ code_coverage: isCodeCoverageEnabled,
33
+ tests_skipping: isSuitesSkippingEnabled,
34
+ itr_enabled: isItrEnabled,
35
+ require_git: requireGit,
36
+ early_flake_detection: earlyFlakeDetectionConfig,
37
+ flaky_test_retries_enabled: isFlakyTestRetriesEnabled,
38
+ di_enabled: isDiEnabled,
39
+ known_tests_enabled: isKnownTestsEnabled,
40
+ test_management: testManagementConfig,
41
+ impacted_tests_enabled: isImpactedTestsEnabled,
42
+ coverage_report_upload_enabled: isCoverageReportUploadEnabled,
43
+ } = parsedResponse?.data?.attributes ?? parsedResponse
44
+
45
+ const settings = {
46
+ isCodeCoverageEnabled,
47
+ isSuitesSkippingEnabled,
48
+ isItrEnabled,
49
+ requireGit,
50
+ isEarlyFlakeDetectionEnabled: isKnownTestsEnabled && (earlyFlakeDetectionConfig?.enabled ?? false),
51
+ earlyFlakeDetectionNumRetries:
52
+ earlyFlakeDetectionConfig?.slow_test_retries?.['5s'] || DEFAULT_EARLY_FLAKE_DETECTION_NUM_RETRIES,
53
+ earlyFlakeDetectionSlowTestRetries:
54
+ earlyFlakeDetectionConfig?.slow_test_retries ?? DEFAULT_EARLY_FLAKE_DETECTION_SLOW_TEST_RETRIES,
55
+ earlyFlakeDetectionFaultyThreshold:
56
+ earlyFlakeDetectionConfig?.faulty_session_threshold ?? DEFAULT_EARLY_FLAKE_DETECTION_ERROR_THRESHOLD,
57
+ isFlakyTestRetriesEnabled,
58
+ isDiEnabled: isDiEnabled && isFlakyTestRetriesEnabled,
59
+ isKnownTestsEnabled,
60
+ isTestManagementEnabled: (testManagementConfig?.enabled ?? false),
61
+ testManagementAttemptToFixRetries:
62
+ testManagementConfig?.attempt_to_fix_retries,
63
+ isImpactedTestsEnabled,
64
+ isCoverageReportUploadEnabled: isCoverageReportUploadEnabled ?? false,
65
+ }
66
+
67
+ log.debug('Remote settings: %j', settings)
68
+
69
+ if (config.testOptimization.DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE) {
70
+ settings.isCodeCoverageEnabled = true
71
+ log.debug('Dangerously set code coverage to true')
72
+ }
73
+ if (config.testOptimization.DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING) {
74
+ settings.isSuitesSkippingEnabled = true
75
+ log.debug('Dangerously set test skipping to true')
76
+ }
77
+
78
+ return settings
79
+ }
80
+
21
81
  function getLibraryConfiguration ({
22
82
  url,
23
83
  isEvpProxy,
@@ -51,10 +111,10 @@ function getLibraryConfiguration ({
51
111
  options.path = `${evpProxyPrefix}/api/v2/libraries/tests/services/setting`
52
112
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
53
113
  } else {
54
- if (!config.apiKey) {
114
+ if (!config.DD_API_KEY) {
55
115
  return done(new Error('Request to settings endpoint was not done because Datadog API key is not defined.'))
56
116
  }
57
- options.headers['dd-api-key'] = config.apiKey
117
+ options.headers['dd-api-key'] = config.DD_API_KEY
58
118
  }
59
119
 
60
120
  const data = JSON.stringify({
@@ -90,56 +150,7 @@ function getLibraryConfiguration ({
90
150
  done(err)
91
151
  } else {
92
152
  try {
93
- const {
94
- data: {
95
- attributes: {
96
- code_coverage: isCodeCoverageEnabled,
97
- tests_skipping: isSuitesSkippingEnabled,
98
- itr_enabled: isItrEnabled,
99
- require_git: requireGit,
100
- early_flake_detection: earlyFlakeDetectionConfig,
101
- flaky_test_retries_enabled: isFlakyTestRetriesEnabled,
102
- di_enabled: isDiEnabled,
103
- known_tests_enabled: isKnownTestsEnabled,
104
- test_management: testManagementConfig,
105
- impacted_tests_enabled: isImpactedTestsEnabled,
106
- coverage_report_upload_enabled: isCoverageReportUploadEnabled,
107
- },
108
- },
109
- } = JSON.parse(res)
110
-
111
- const settings = {
112
- isCodeCoverageEnabled,
113
- isSuitesSkippingEnabled,
114
- isItrEnabled,
115
- requireGit,
116
- isEarlyFlakeDetectionEnabled: isKnownTestsEnabled && (earlyFlakeDetectionConfig?.enabled ?? false),
117
- earlyFlakeDetectionNumRetries:
118
- earlyFlakeDetectionConfig?.slow_test_retries?.['5s'] || DEFAULT_EARLY_FLAKE_DETECTION_NUM_RETRIES,
119
- earlyFlakeDetectionSlowTestRetries:
120
- earlyFlakeDetectionConfig?.slow_test_retries ?? DEFAULT_EARLY_FLAKE_DETECTION_SLOW_TEST_RETRIES,
121
- earlyFlakeDetectionFaultyThreshold:
122
- earlyFlakeDetectionConfig?.faulty_session_threshold ?? DEFAULT_EARLY_FLAKE_DETECTION_ERROR_THRESHOLD,
123
- isFlakyTestRetriesEnabled,
124
- isDiEnabled: isDiEnabled && isFlakyTestRetriesEnabled,
125
- isKnownTestsEnabled,
126
- isTestManagementEnabled: (testManagementConfig?.enabled ?? false),
127
- testManagementAttemptToFixRetries:
128
- testManagementConfig?.attempt_to_fix_retries,
129
- isImpactedTestsEnabled,
130
- isCoverageReportUploadEnabled: isCoverageReportUploadEnabled ?? false,
131
- }
132
-
133
- log.debug('Remote settings: %j', settings)
134
-
135
- if (config.DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE) {
136
- settings.isCodeCoverageEnabled = true
137
- log.debug('Dangerously set code coverage to true')
138
- }
139
- if (config.DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING) {
140
- settings.isSuitesSkippingEnabled = true
141
- log.debug('Dangerously set test skipping to true')
142
- }
153
+ const settings = parseLibraryConfigurationResponse(res, config)
143
154
 
144
155
  incrementCountMetric(TELEMETRY_GIT_REQUESTS_SETTINGS_RESPONSE, settings)
145
156
 
@@ -153,4 +164,4 @@ function getLibraryConfiguration ({
153
164
  })
154
165
  }
155
166
 
156
- module.exports = { getLibraryConfiguration }
167
+ module.exports = { getLibraryConfiguration, parseLibraryConfigurationResponse }
@@ -12,26 +12,10 @@ const {
12
12
  isRetriableNetworkError,
13
13
  singleJitteredDelay,
14
14
  } = require('../../exporters/common/retry')
15
- const { urlToHttpOptions } = require('../../exporters/common/url-to-http-options-polyfill')
15
+ const { parseUrl } = require('../../exporters/common/url')
16
16
 
17
17
  const legacyStorage = storage('legacy')
18
18
 
19
- function parseUrl (urlObjOrString) {
20
- if (urlObjOrString !== null && typeof urlObjOrString === 'object') {
21
- return urlToHttpOptions(urlObjOrString)
22
- }
23
-
24
- const url = urlToHttpOptions(new URL(urlObjOrString))
25
-
26
- if (url.protocol === 'unix:' && url.hostname === '.') {
27
- const udsPath = urlObjOrString.slice(5)
28
- url.path = udsPath
29
- url.pathname = udsPath
30
- }
31
-
32
- return url
33
- }
34
-
35
19
  /**
36
20
  * Simplified HTTP request for test optimization (library config). Uses common HTTP agents.
37
21
  * Retries: 429 (with X-ratelimit-reset, max 30s wait),