dd-trace 5.97.0 → 5.99.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/LICENSE-3rdparty.csv +0 -1
  2. package/ext/tags.js +1 -0
  3. package/index.d.ts +35 -3
  4. package/package.json +48 -46
  5. package/packages/datadog-instrumentations/src/crypto.js +45 -0
  6. package/packages/datadog-instrumentations/src/cucumber.js +65 -3
  7. package/packages/datadog-instrumentations/src/cypress-config.js +153 -53
  8. package/packages/datadog-instrumentations/src/dns.js +24 -56
  9. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  10. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +74 -0
  11. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +4 -1
  12. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  13. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +10 -3
  14. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
  15. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/modelcontextprotocol-sdk.js +59 -0
  16. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +11 -2
  17. package/packages/datadog-instrumentations/src/jest.js +104 -12
  18. package/packages/datadog-instrumentations/src/mocha/utils.js +8 -0
  19. package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +7 -0
  20. package/packages/datadog-instrumentations/src/pino.js +4 -28
  21. package/packages/datadog-instrumentations/src/playwright-browser-scripts.js +27 -0
  22. package/packages/datadog-instrumentations/src/playwright.js +5 -17
  23. package/packages/datadog-instrumentations/src/redis.js +12 -6
  24. package/packages/datadog-instrumentations/src/stripe.js +38 -24
  25. package/packages/datadog-instrumentations/src/vitest.js +32 -4
  26. package/packages/datadog-instrumentations/src/zlib.js +29 -0
  27. package/packages/datadog-plugin-aws-sdk/src/base.js +2 -3
  28. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -0
  29. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -0
  30. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -0
  31. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -0
  32. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -0
  33. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -0
  34. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +8 -15
  35. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -9
  36. package/packages/datadog-plugin-cucumber/src/index.js +8 -2
  37. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +114 -6
  38. package/packages/datadog-plugin-cypress/src/index.js +59 -2
  39. package/packages/datadog-plugin-cypress/src/source-map-utils.js +48 -1
  40. package/packages/datadog-plugin-fs/src/index.js +1 -1
  41. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -1
  42. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -7
  43. package/packages/datadog-plugin-http/src/client.js +1 -1
  44. package/packages/datadog-plugin-http/src/server.js +21 -13
  45. package/packages/datadog-plugin-http2/src/client.js +1 -1
  46. package/packages/datadog-plugin-http2/src/server.js +10 -2
  47. package/packages/datadog-plugin-jest/src/index.js +2 -2
  48. package/packages/datadog-plugin-mocha/src/index.js +1 -2
  49. package/packages/datadog-plugin-modelcontextprotocol-sdk/src/index.js +24 -0
  50. package/packages/datadog-plugin-modelcontextprotocol-sdk/src/tracing.js +55 -0
  51. package/packages/datadog-plugin-mongodb-core/src/index.js +4 -9
  52. package/packages/datadog-plugin-mysql/src/index.js +1 -1
  53. package/packages/datadog-plugin-next/src/index.js +8 -2
  54. package/packages/datadog-plugin-pg/src/index.js +1 -1
  55. package/packages/datadog-plugin-playwright/src/index.js +2 -3
  56. package/packages/datadog-plugin-tedious/src/index.js +1 -1
  57. package/packages/datadog-plugin-vitest/src/index.js +14 -6
  58. package/packages/datadog-plugin-ws/src/close.js +3 -1
  59. package/packages/datadog-plugin-ws/src/producer.js +2 -0
  60. package/packages/datadog-plugin-ws/src/receiver.js +2 -1
  61. package/packages/dd-trace/src/aiguard/channels.js +8 -0
  62. package/packages/dd-trace/src/aiguard/index.js +7 -3
  63. package/packages/dd-trace/src/aiguard/sdk.js +66 -22
  64. package/packages/dd-trace/src/aiguard/tags.js +1 -0
  65. package/packages/dd-trace/src/appsec/blocked_templates.js +4 -3
  66. package/packages/dd-trace/src/appsec/blocking.js +62 -34
  67. package/packages/dd-trace/src/appsec/graphql.js +6 -6
  68. package/packages/dd-trace/src/appsec/index.js +9 -11
  69. package/packages/dd-trace/src/appsec/rasp/command_injection.js +4 -5
  70. package/packages/dd-trace/src/appsec/rasp/lfi.js +8 -4
  71. package/packages/dd-trace/src/appsec/rasp/sql_injection.js +5 -10
  72. package/packages/dd-trace/src/appsec/rasp/ssrf.js +5 -6
  73. package/packages/dd-trace/src/appsec/recommended.json +2438 -13
  74. package/packages/dd-trace/src/appsec/reporter.js +6 -5
  75. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  76. package/packages/dd-trace/src/appsec/sdk/track_event.js +5 -5
  77. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +6 -10
  78. package/packages/dd-trace/src/appsec/sdk/utils.js +4 -2
  79. package/packages/dd-trace/src/appsec/store.js +50 -0
  80. package/packages/dd-trace/src/appsec/waf/index.js +3 -5
  81. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
  82. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
  83. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -2
  84. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  85. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -4
  86. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
  87. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -5
  88. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +3 -4
  89. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +6 -6
  90. package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +2 -2
  91. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
  92. package/packages/dd-trace/src/config/config-types.d.ts +0 -4
  93. package/packages/dd-trace/src/config/defaults.js +10 -11
  94. package/packages/dd-trace/src/config/generated-config-types.d.ts +14 -8
  95. package/packages/dd-trace/src/config/index.js +49 -32
  96. package/packages/dd-trace/src/config/parsers.js +26 -9
  97. package/packages/dd-trace/src/config/supported-configurations.json +86 -33
  98. package/packages/dd-trace/src/constants.js +1 -0
  99. package/packages/dd-trace/src/debugger/config.js +2 -0
  100. package/packages/dd-trace/src/debugger/devtools_client/send.js +25 -5
  101. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +5 -2
  102. package/packages/dd-trace/src/encode/0.4.js +11 -11
  103. package/packages/dd-trace/src/encode/span-stats.js +4 -1
  104. package/packages/dd-trace/src/exporters/agent/index.js +0 -1
  105. package/packages/dd-trace/src/exporters/agent/writer.js +1 -2
  106. package/packages/dd-trace/src/exporters/agentless/writer.js +3 -3
  107. package/packages/dd-trace/src/exporters/common/util.js +2 -2
  108. package/packages/dd-trace/src/id.js +2 -0
  109. package/packages/dd-trace/src/index.js +2 -5
  110. package/packages/dd-trace/src/lambda/handler.js +1 -3
  111. package/packages/dd-trace/src/llmobs/plugins/{anthropic.js → anthropic/index.js} +5 -63
  112. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +106 -0
  113. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +3 -2
  114. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -2
  115. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +2 -1
  116. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +0 -49
  117. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +2 -1
  118. package/packages/dd-trace/src/llmobs/plugins/langchain/messages.js +76 -0
  119. package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -26
  120. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/index.js +68 -0
  121. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +57 -0
  122. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  123. package/packages/dd-trace/src/log/index.js +0 -10
  124. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +103 -0
  125. package/packages/dd-trace/src/openfeature/flagging_provider.js +3 -0
  126. package/packages/dd-trace/src/openfeature/remote_config.js +6 -1
  127. package/packages/dd-trace/src/opentelemetry/context_manager.js +6 -4
  128. package/packages/dd-trace/src/opentelemetry/logs/index.js +1 -1
  129. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +3 -2
  130. package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
  131. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +3 -2
  132. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +19 -51
  133. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +14 -2
  134. package/packages/dd-trace/src/opentelemetry/otlp/trace.proto +358 -0
  135. package/packages/dd-trace/src/opentelemetry/otlp/trace_service.proto +78 -0
  136. package/packages/dd-trace/src/opentelemetry/trace/index.js +70 -0
  137. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +74 -0
  138. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +342 -0
  139. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -11
  140. package/packages/dd-trace/src/opentracing/propagation/text_map.js +17 -10
  141. package/packages/dd-trace/src/opentracing/span.js +1 -1
  142. package/packages/dd-trace/src/opentracing/tracer.js +17 -5
  143. package/packages/dd-trace/src/plugins/index.js +1 -0
  144. package/packages/dd-trace/src/plugins/log_plugin.js +3 -0
  145. package/packages/dd-trace/src/plugins/plugin.js +6 -11
  146. package/packages/dd-trace/src/plugins/storage.js +2 -2
  147. package/packages/dd-trace/src/plugins/tracing.js +22 -5
  148. package/packages/dd-trace/src/plugins/util/test.js +128 -5
  149. package/packages/dd-trace/src/plugins/util/url.js +2 -1
  150. package/packages/dd-trace/src/plugins/util/web.js +6 -88
  151. package/packages/dd-trace/src/profiling/profiler.js +34 -77
  152. package/packages/dd-trace/src/profiling/profilers/event_plugins/crypto.js +32 -0
  153. package/packages/dd-trace/src/profiling/profilers/event_plugins/zlib.js +19 -0
  154. package/packages/dd-trace/src/profiling/profilers/events.js +35 -0
  155. package/packages/dd-trace/src/proxy.js +3 -4
  156. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +17 -13
  157. package/packages/dd-trace/src/service-naming/index.js +1 -1
  158. package/packages/dd-trace/src/service-naming/schemas/definition.js +4 -1
  159. package/packages/dd-trace/src/service-naming/schemas/util.js +15 -1
  160. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +24 -1
  161. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +60 -0
  162. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +21 -1
  163. package/packages/dd-trace/src/service-naming/schemas/v0/websocket.js +5 -0
  164. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +17 -0
  165. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +15 -1
  166. package/packages/dd-trace/src/service-naming/schemas/v1/websocket.js +6 -0
  167. package/packages/dd-trace/src/span_processor.js +1 -2
  168. package/packages/dd-trace/src/span_stats.js +5 -1
  169. package/packages/dd-trace/src/tagger.js +2 -2
  170. package/packages/dd-trace/src/telemetry/send-data.js +5 -7
  171. package/vendor/dist/@apm-js-collab/code-transformer/index.js +28 -6
  172. package/vendor/dist/protobufjs/index.js +1 -1
  173. package/packages/dd-trace/src/log/utils.js +0 -16
  174. package/vendor/dist/ignore/LICENSE +0 -21
  175. package/vendor/dist/ignore/index.js +0 -1
@@ -3,11 +3,12 @@
3
3
  const zlib = require('zlib')
4
4
  const dc = require('dc-polyfill')
5
5
 
6
- const { storage } = require('../../../datadog-core')
6
+ const { NETWORK_CLIENT_IP } = require('../../../../ext/tags')
7
7
  const web = require('../plugins/util/web')
8
8
  const { ipHeaderList } = require('../plugins/util/ip_extractor')
9
9
  const { keepTrace } = require('../priority_sampler')
10
10
  const { ASM } = require('../standalone/product')
11
+ const { getActiveRequest } = require('./store')
11
12
  const {
12
13
  incrementWafInitMetric,
13
14
  incrementWafUpdatesMetric,
@@ -302,7 +303,7 @@ function reportWafConfigUpdate (product, rcConfigId, diagnostics, wafVersion) {
302
303
 
303
304
  function reportMetrics (metrics, raspRule, req) {
304
305
  if (!req) {
305
- req = storage('legacy').getStore()?.req
306
+ req = getActiveRequest()
306
307
  }
307
308
  const rootSpan = req && web.root(req)
308
309
 
@@ -337,7 +338,7 @@ function reportTruncationMetrics (rootSpan, metrics) {
337
338
 
338
339
  function reportAttack ({ events: attackData, actions }, req) {
339
340
  if (!req) {
340
- req = storage('legacy').getStore()?.req
341
+ req = getActiveRequest()
341
342
  }
342
343
 
343
344
  const rootSpan = web.root(req)
@@ -363,7 +364,7 @@ function reportAttack ({ events: attackData, actions }, req) {
363
364
  : '{"triggers":' + attackDataStr + '}'
364
365
 
365
366
  if (req.socket) {
366
- newTags['network.client.ip'] = req.socket.remoteAddress
367
+ newTags[NETWORK_CLIENT_IP] = req.socket.remoteAddress
367
368
  }
368
369
 
369
370
  rootSpan.addTags(newTags)
@@ -481,7 +482,7 @@ function reportAttributes (attributes, req) {
481
482
  if (!attributes) return
482
483
 
483
484
  if (!req) {
484
- req = storage('legacy').getStore()?.req
485
+ req = getActiveRequest()
485
486
  }
486
487
 
487
488
  const rootSpan = web.root(req)
@@ -19,7 +19,7 @@ function setUser (tracer, user) {
19
19
  return
20
20
  }
21
21
 
22
- const rootSpan = getRootSpan(tracer)
22
+ const rootSpan = getRootSpan()
23
23
  if (!rootSpan) {
24
24
  log.warn('[ASM] Root span not available in setUser')
25
25
  return
@@ -21,7 +21,7 @@ function trackUserLoginSuccessEvent (tracer, user, metadata) {
21
21
 
22
22
  incrementSdkEventMetric('login_success', 'v1')
23
23
 
24
- const rootSpan = getRootSpan(tracer)
24
+ const rootSpan = getRootSpan()
25
25
  if (!rootSpan) {
26
26
  log.warn('[ASM] Root span not available in trackUserLoginSuccessEvent')
27
27
  return
@@ -54,7 +54,7 @@ function trackUserLoginFailureEvent (tracer, userId, exists, metadata) {
54
54
  ...metadata,
55
55
  }
56
56
 
57
- trackEvent('users.login.failure', fields, 'trackUserLoginFailureEvent', getRootSpan(tracer))
57
+ trackEvent('users.login.failure', fields, 'trackUserLoginFailureEvent', getRootSpan())
58
58
 
59
59
  runWaf('users.login.failure', { login: userId })
60
60
 
@@ -67,7 +67,7 @@ function trackCustomEvent (tracer, eventName, metadata) {
67
67
  return
68
68
  }
69
69
 
70
- trackEvent(eventName, metadata, 'trackCustomEvent', getRootSpan(tracer))
70
+ trackEvent(eventName, metadata, 'trackCustomEvent', getRootSpan())
71
71
 
72
72
  incrementSdkEventMetric('custom', 'v1')
73
73
 
@@ -84,7 +84,7 @@ function trackUserLoginSuccessV2 (tracer, login, user, metadata) {
84
84
 
85
85
  incrementSdkEventMetric('login_success', 'v2')
86
86
 
87
- const rootSpan = getRootSpan(tracer)
87
+ const rootSpan = getRootSpan()
88
88
  if (!rootSpan) {
89
89
  log.warn('[ASM] Root span not available in eventTrackingV2.trackUserLoginSuccess')
90
90
  return
@@ -122,7 +122,7 @@ function trackUserLoginFailureV2 (tracer, login, exists, metadata) {
122
122
 
123
123
  incrementSdkEventMetric('login_failure', 'v2')
124
124
 
125
- const rootSpan = getRootSpan(tracer)
125
+ const rootSpan = getRootSpan()
126
126
  if (!rootSpan) {
127
127
  log.warn('[ASM] Root span not available in eventTrackingV2.trackUserLoginFailure')
128
128
  return
@@ -3,8 +3,9 @@
3
3
  const { USER_ID } = require('../addresses')
4
4
  const waf = require('../waf')
5
5
  const { block, getBlockingAction } = require('../blocking')
6
- const { storage } = require('../../../../datadog-core')
7
6
  const log = require('../../log')
7
+ const web = require('../../plugins/util/web')
8
+ const { getActiveRequest } = require('../store')
8
9
  const { setUserTags } = require('./set_user')
9
10
  const { getRootSpan } = require('./utils')
10
11
 
@@ -19,7 +20,7 @@ function checkUserAndSetUser (tracer, user) {
19
20
  return false
20
21
  }
21
22
 
22
- const rootSpan = getRootSpan(tracer)
23
+ const rootSpan = getRootSpan()
23
24
  if (rootSpan) {
24
25
  if (!rootSpan.context()._tags['usr.id']) {
25
26
  setUserTags(user, rootSpan)
@@ -32,20 +33,15 @@ function checkUserAndSetUser (tracer, user) {
32
33
  }
33
34
 
34
35
  function blockRequest (tracer, req, res) {
35
- if (!req || !res) {
36
- const store = storage('legacy').getStore()
37
- if (store) {
38
- req = req || store.req
39
- res = res || store.res
40
- }
41
- }
36
+ req ||= getActiveRequest()
37
+ res ||= req && web.getContext(req)?.res
42
38
 
43
39
  if (!req || !res) {
44
40
  log.warn('[ASM] Requests or response object not available in blockRequest')
45
41
  return false
46
42
  }
47
43
 
48
- const rootSpan = getRootSpan(tracer)
44
+ const rootSpan = getRootSpan()
49
45
  if (!rootSpan) {
50
46
  log.warn('[ASM] Root span not available in blockRequest')
51
47
  return false
@@ -1,7 +1,9 @@
1
1
  'use strict'
2
2
 
3
- function getRootSpan (tracer) {
4
- let span = tracer.scope().active()
3
+ const { storage } = require('../../../../datadog-core')
4
+
5
+ function getRootSpan () {
6
+ let span = storage('legacy').getStore()?.span
5
7
  if (!span) return
6
8
 
7
9
  const context = span.context()
@@ -0,0 +1,50 @@
1
+ 'use strict'
2
+
3
+ const { storage } = require('../../../datadog-core')
4
+
5
+ const legacyStorage = storage('legacy')
6
+
7
+ const kReq = Symbol('dd-trace.appsec.req')
8
+
9
+ /**
10
+ * Return a new legacy-storage clone that weakly references `req`.
11
+ *
12
+ * The ref lives on an enumerable symbol key so it survives the
13
+ * `{ ...store, span }` spreads performed by plugin scope handling,
14
+ * while still allowing `req` (and therefore `res`) to be garbage
15
+ * collected once the request is done.
16
+ *
17
+ * @param {object|undefined} store
18
+ * @param {object} req
19
+ * @returns {object}
20
+ */
21
+ function withRequest (store, req) {
22
+ return { ...store, [kReq]: new WeakRef(req) }
23
+ }
24
+
25
+ /**
26
+ * Resolve the inbound request attached to a specific legacy store.
27
+ * Prefer {@link getActiveRequest} unless you already have a store in hand.
28
+ *
29
+ * @param {object|undefined} store
30
+ * @returns {object|undefined}
31
+ */
32
+ function getRequest (store) {
33
+ return store?.[kReq]?.deref()
34
+ }
35
+
36
+ /**
37
+ * Resolve the inbound request attached to the currently active legacy store.
38
+ * Shortcut for `getRequest(storage('legacy').getStore())`.
39
+ *
40
+ * @returns {object|undefined}
41
+ */
42
+ function getActiveRequest () {
43
+ return legacyStorage.getStore()?.[kReq]?.deref()
44
+ }
45
+
46
+ module.exports = {
47
+ withRequest,
48
+ getRequest,
49
+ getActiveRequest,
50
+ }
@@ -1,12 +1,12 @@
1
1
  'use strict'
2
2
 
3
- const { storage } = require('../../../../datadog-core')
4
3
  const log = require('../../log')
5
4
  const Reporter = require('../reporter')
6
5
  const Limiter = require('../../rate_limiter')
7
6
  const { keepTrace } = require('../../priority_sampler')
8
7
  const { ASM } = require('../../standalone/product')
9
8
  const web = require('../../plugins/util/web')
9
+ const { getActiveRequest } = require('../store')
10
10
  const { updateRateLimitedMetric } = require('../telemetry')
11
11
 
12
12
  class WafUpdateError extends Error {
@@ -112,13 +112,11 @@ function removeConfig (configPath) {
112
112
 
113
113
  function run (data, req, raspRule) {
114
114
  if (!req) {
115
- const store = storage('legacy').getStore()
116
- if (!store || !store.req) {
115
+ req = getActiveRequest()
116
+ if (!req) {
117
117
  log.warn('[ASM] Request object not available in waf.run')
118
118
  return
119
119
  }
120
-
121
- req = store.req
122
120
  }
123
121
 
124
122
  const wafContext = waf.wafManager.getWAFContext(req)
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
+ const getConfig = require('../../config')
3
4
  const request = require('../requests/request')
4
5
  const id = require('../../id')
5
6
  const log = require('../../log')
6
- const { getValueFromEnvSources } = require('../../config/helper')
7
7
 
8
8
  const {
9
9
  incrementCountMetric,
@@ -151,7 +151,7 @@ function fetchFromApi ({
151
151
  options.path = `${evpProxyPrefix}/api/v2/ci/libraries/tests`
152
152
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
153
153
  } else {
154
- const apiKey = getValueFromEnvSources('DD_API_KEY')
154
+ const { apiKey } = getConfig()
155
155
  if (!apiKey) {
156
156
  return done(new Error('Known tests were not fetched because Datadog API key is not defined.'))
157
157
  }
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
+ const getConfig = require('../../../config')
2
3
  const request = require('../../../exporters/common/request')
3
4
  const log = require('../../../log')
4
5
  const { safeJSONStringify } = require('../../../exporters/common/util')
5
- const { getValueFromEnvSources } = require('../../../config/helper')
6
6
 
7
7
  const { CoverageCIVisibilityEncoder } = require('../../../encode/coverage-ci-visibility')
8
8
  const BaseWriter = require('../../../exporters/common/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': getValueFromEnvSources('DD_API_KEY'),
32
+ 'dd-api-key': getConfig().apiKey,
33
33
  ...form.getHeaders(),
34
34
  },
35
35
  timeout: 15_000,
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
+ const getConfig = require('../../../config')
2
3
  const request = require('../../../exporters/common/request')
3
4
  const log = require('../../../log')
4
5
  const { safeJSONStringify } = require('../../../exporters/common/util')
5
6
  const { JSONEncoder } = require('../../encode/json-encoder')
6
- const { getValueFromEnvSources } = require('../../../config/helper')
7
7
  const { DEBUGGER_INPUT_V1 } = require('../../../debugger/constants')
8
8
 
9
9
  const BaseWriter = require('../../../exporters/common/writer')
@@ -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': getValueFromEnvSources('DD_API_KEY'),
29
+ 'dd-api-key': getConfig().apiKey,
30
30
  'Content-Type': 'application/json',
31
31
  },
32
32
  timeout: this.timeout,
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
+ const getConfig = require('../../../config')
2
3
  const request = require('../../../exporters/common/request')
3
4
  const { safeJSONStringify } = require('../../../exporters/common/util')
4
5
  const log = require('../../../log')
5
- const { getValueFromEnvSources } = require('../../../config/helper')
6
6
 
7
7
  const { AgentlessCiVisibilityEncoder } = require('../../../encode/agentless-ci-visibility')
8
8
  const BaseWriter = require('../../../exporters/common/writer')
@@ -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': getValueFromEnvSources('DD_API_KEY'),
33
+ 'dd-api-key': getConfig().apiKey,
34
34
  'Content-Type': 'application/msgpack',
35
35
  },
36
36
  timeout: 15_000,
@@ -3,12 +3,11 @@
3
3
  const fs = require('fs')
4
4
  const path = require('path')
5
5
 
6
+ const getConfig = require('../../../config')
6
7
  const FormData = require('../../../exporters/common/form-data')
7
8
  const request = require('../../../exporters/common/request')
8
- const { getValueFromEnvSources } = require('../../../config/helper')
9
9
 
10
10
  const log = require('../../../log')
11
- const { isFalse } = require('../../../util')
12
11
  const {
13
12
  getLatestCommits,
14
13
  getRepositoryUrl,
@@ -51,7 +50,7 @@ function getCommonRequestOptions (url) {
51
50
  return {
52
51
  method: 'POST',
53
52
  headers: {
54
- 'dd-api-key': getValueFromEnvSources('DD_API_KEY'),
53
+ 'dd-api-key': getConfig().apiKey,
55
54
  },
56
55
  timeout: 15_000,
57
56
  url,
@@ -288,7 +287,7 @@ function sendGitMetadata (url, { isEvpProxy, evpProxyPrefix }, configRepositoryU
288
287
  }
289
288
  // Otherwise we unshallow and get commits to upload again
290
289
  log.debug('It is shallow clone, unshallowing...')
291
- if (!isFalse(getValueFromEnvSources('DD_CIVISIBILITY_GIT_UNSHALLOW_ENABLED'))) {
290
+ if (getConfig().DD_CIVISIBILITY_GIT_UNSHALLOW_ENABLED) {
292
291
  unshallowRepository(false)
293
292
  }
294
293
 
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
+ const getConfig = require('../../config')
3
4
  const request = require('../requests/request')
4
5
  const log = require('../../log')
5
- const { getValueFromEnvSources } = require('../../config/helper')
6
6
  const {
7
7
  incrementCountMetric,
8
8
  distributionMetric,
@@ -120,7 +120,7 @@ function fetchFromApi ({
120
120
  options.path = `${evpProxyPrefix}/api/v2/ci/tests/skippable`
121
121
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
122
122
  } else {
123
- const apiKey = getValueFromEnvSources('DD_API_KEY')
123
+ const { apiKey } = getConfig()
124
124
  if (!apiKey) {
125
125
  return done(new Error('Skippable suites were not fetched because Datadog API key is not defined.'))
126
126
  }
@@ -2,26 +2,25 @@
2
2
 
3
3
  const Plugin = require('../../plugins/plugin')
4
4
  const log = require('../../log')
5
- const { getValueFromEnvSources } = require('../../config/helper')
6
5
 
7
6
  function getWinstonLogSubmissionParameters (config) {
8
- const { site, service } = config
7
+ const { site, service, apiKey, DD_AGENTLESS_LOG_SUBMISSION_URL } = config
9
8
 
10
9
  const defaultParameters = {
11
10
  host: `http-intake.logs.${site}`,
12
11
  path: `/api/v2/logs?ddsource=winston&service=${service}`,
13
12
  ssl: true,
14
13
  headers: {
15
- 'DD-API-KEY': getValueFromEnvSources('DD_API_KEY'),
14
+ 'DD-API-KEY': apiKey,
16
15
  },
17
16
  }
18
17
 
19
- if (!getValueFromEnvSources('DD_AGENTLESS_LOG_SUBMISSION_URL')) {
18
+ if (!DD_AGENTLESS_LOG_SUBMISSION_URL) {
20
19
  return defaultParameters
21
20
  }
22
21
 
23
22
  try {
24
- const url = new URL(getValueFromEnvSources('DD_AGENTLESS_LOG_SUBMISSION_URL'))
23
+ const url = new URL(DD_AGENTLESS_LOG_SUBMISSION_URL)
25
24
  return {
26
25
  host: url.hostname,
27
26
  port: url.port,
@@ -5,8 +5,8 @@ const path = require('node:path')
5
5
  const { createHash } = require('node:crypto')
6
6
  const { tmpdir } = require('node:os')
7
7
 
8
+ const getConfig = require('../../config')
8
9
  const log = require('../../log')
9
- const { getValueFromEnvSources } = require('../../config/helper')
10
10
 
11
11
  const CACHE_TTL_MS = 30 * 60 * 1000 // 30 minutes
12
12
  const CACHE_LOCK_POLL_MS = 500
@@ -14,13 +14,12 @@ const CACHE_LOCK_TIMEOUT_MS = 120_000 // 2 minutes
14
14
  const CACHE_LOCK_HEARTBEAT_MS = 30_000 // 30 seconds
15
15
 
16
16
  /**
17
- * Returns whether the filesystem cache is enabled via the env var.
17
+ * Returns whether the filesystem cache is enabled via config.
18
18
  *
19
19
  * @returns {boolean}
20
20
  */
21
21
  function isCacheEnabled () {
22
- const { isTrue } = require('../../util')
23
- return isTrue(getValueFromEnvSources('DD_EXPERIMENTAL_TEST_REQUESTS_FS_CACHE'))
22
+ return getConfig().DD_EXPERIMENTAL_TEST_REQUESTS_FS_CACHE
24
23
  }
25
24
 
26
25
  /**
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
+ const getConfig = require('../../config')
3
4
  const id = require('../../id')
4
5
  const log = require('../../log')
5
- const { getValueFromEnvSources } = require('../../config/helper')
6
6
  const {
7
7
  incrementCountMetric,
8
8
  distributionMetric,
@@ -36,6 +36,7 @@ function getLibraryConfiguration ({
36
36
  custom,
37
37
  tag,
38
38
  }, done) {
39
+ const config = getConfig()
39
40
  const options = {
40
41
  path: '/api/v2/libraries/tests/services/setting',
41
42
  method: 'POST',
@@ -50,11 +51,10 @@ function getLibraryConfiguration ({
50
51
  options.path = `${evpProxyPrefix}/api/v2/libraries/tests/services/setting`
51
52
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
52
53
  } else {
53
- const apiKey = getValueFromEnvSources('DD_API_KEY')
54
- if (!apiKey) {
54
+ if (!config.apiKey) {
55
55
  return done(new Error('Request to settings endpoint was not done because Datadog API key is not defined.'))
56
56
  }
57
- options.headers['dd-api-key'] = apiKey
57
+ options.headers['dd-api-key'] = config.apiKey
58
58
  }
59
59
 
60
60
  const data = JSON.stringify({
@@ -132,11 +132,11 @@ function getLibraryConfiguration ({
132
132
 
133
133
  log.debug('Remote settings: %j', settings)
134
134
 
135
- if (getValueFromEnvSources('DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE')) {
135
+ if (config.DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE) {
136
136
  settings.isCodeCoverageEnabled = true
137
137
  log.debug('Dangerously set code coverage to true')
138
138
  }
139
- if (getValueFromEnvSources('DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING')) {
139
+ if (config.DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING) {
140
140
  settings.isSuitesSkippingEnabled = true
141
141
  log.debug('Dangerously set test skipping to true')
142
142
  }
@@ -3,10 +3,10 @@
3
3
  const { readFileSync } = require('node:fs')
4
4
  const { gzipSync } = require('node:zlib')
5
5
 
6
+ const getConfig = require('../../config')
6
7
  const FormData = require('../../exporters/common/form-data')
7
8
  const request = require('../../exporters/common/request')
8
9
  const log = require('../../log')
9
- const { getValueFromEnvSources } = require('../../config/helper')
10
10
  const {
11
11
  incrementCountMetric,
12
12
  distributionMetric,
@@ -34,7 +34,7 @@ function uploadCoverageReport (
34
34
  { filePath, format, testEnvironmentMetadata, url, isEvpProxy, evpProxyPrefix },
35
35
  callback
36
36
  ) {
37
- const apiKey = getValueFromEnvSources('DD_API_KEY')
37
+ const apiKey = getConfig().apiKey
38
38
 
39
39
  if (!apiKey && !isEvpProxy) {
40
40
  return callback(new Error('DD_API_KEY is required for coverage report upload'))
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
+ const getConfig = require('../../config')
3
4
  const request = require('../requests/request')
4
5
  const id = require('../../id')
5
- const { getValueFromEnvSources } = require('../../config/helper')
6
6
  const log = require('../../log')
7
7
 
8
8
  const {
@@ -121,7 +121,7 @@ function fetchFromApi ({
121
121
  options.path = `${evpProxyPrefix}/api/v2/test/libraries/test-management/tests`
122
122
  options.headers['X-Datadog-EVP-Subdomain'] = 'api'
123
123
  } else {
124
- const apiKey = getValueFromEnvSources('DD_API_KEY')
124
+ const { apiKey } = getConfig()
125
125
  if (!apiKey) {
126
126
  return done(new Error('Test management tests were not fetched because Datadog API key is not defined.'))
127
127
  }
@@ -10,11 +10,8 @@ export interface ConfigProperties extends GeneratedConfig {
10
10
  }
11
11
  commitSHA: string | undefined
12
12
  debug: boolean
13
- gcpPubSubPushSubscriptionEnabled: boolean
14
13
  instrumentationSource: 'manual' | 'ssi'
15
- isAzureFunction: boolean
16
14
  isCiVisibility: boolean
17
- isGCPFunction: boolean
18
15
  isServiceNameInferred: boolean
19
16
  isServiceUserProvided: boolean
20
17
  logger: import('../../../../index').TracerOptions['logger'] | undefined
@@ -22,7 +19,6 @@ export interface ConfigProperties extends GeneratedConfig {
22
19
  readonly parsedDdTags: Record<string, string>
23
20
  plugins: boolean
24
21
  repositoryUrl: string | undefined
25
- rules: import('../../../../index').SamplingRule[]
26
22
  sampler: {
27
23
  rateLimit: number
28
24
  rules: import('../../../../index').SamplingRule[]
@@ -60,7 +60,6 @@ setWarnInvalidValue(warnInvalidValue)
60
60
  const defaults = {
61
61
  instrumentationSource: 'manual',
62
62
  isServiceUserProvided: false,
63
- isServiceNameInferred: true,
64
63
  plugins: true,
65
64
  isCiVisibility: false,
66
65
  lookup: dns.lookup,
@@ -82,11 +81,8 @@ for (const [name, value] of Object.entries(defaults)) {
82
81
  * @param {string} optionName
83
82
  */
84
83
  function generateTelemetry (value = null, origin, optionName) {
85
- const { type, canonicalName = optionName } = configurationsTable[optionName] ?? { type: typeof value }
86
- // TODO: Consider adding a preParser hook to the parsers object.
87
- if (canonicalName === 'OTEL_RESOURCE_ATTRIBUTES') {
88
- value = telemetryTransformers.MAP(value)
89
- }
84
+ const tableEntry = configurationsTable[optionName]
85
+ const { type, canonicalName = optionName } = tableEntry ?? { type: typeof value }
90
86
  // TODO: Should we not send defaults to telemetry to reduce size?
91
87
  // TODO: How to handle aliases/actual names in the future? Optional fields? Normalize the name at intake?
92
88
  // TODO: Validate that space separated tags are parsed by the backend. Optimizations would be possible with that.
@@ -95,9 +91,12 @@ function generateTelemetry (value = null, origin, optionName) {
95
91
  if (telemetryTransformers[type]) {
96
92
  value = telemetryTransformers[type](value)
97
93
  } else if (typeof value === 'object' && value !== null) {
98
- value = value instanceof URL
99
- ? String(value)
100
- : JSON.stringify(value)
94
+ // Custom optionsTable entries (no `configurationsTable` row, e.g. `logger`)
95
+ // hold opaque user-supplied references that may carry cycles, so avoid
96
+ // traversing them via JSON.stringify.
97
+ value = tableEntry === undefined
98
+ ? util.inspect(value, { depth: -1 })
99
+ : value instanceof URL ? String(value) : JSON.stringify(value)
101
100
  } else if (typeof value === 'function') {
102
101
  value = value.name || 'function'
103
102
  }
@@ -251,7 +250,7 @@ for (const [canonicalName, entries] of Object.entries(supportedConfigurations))
251
250
  option.transformer = transformer
252
251
  }
253
252
  if (entry.configurationNames) {
254
- addOption(option, type, entry.configurationNames)
253
+ addOption(option, entry.configurationNames)
255
254
  }
256
255
  configurationsTable[canonicalName] = option
257
256
 
@@ -288,7 +287,7 @@ for (const [fullPropertyName, alias] of fallbackConfigurations) {
288
287
  }
289
288
  }
290
289
 
291
- function addOption (option, type, configurationNames) {
290
+ function addOption (option, configurationNames) {
292
291
  for (const name of configurationNames) {
293
292
  let index = -1
294
293
  let lastNestedProperties