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
@@ -10,6 +10,7 @@
10
10
  * @property {string[]} [aliases]
11
11
  * @property {string[]} [configurationNames]
12
12
  * @property {string} [internalPropertyName]
13
+ * @property {string} [namespace] Nests the canonical env name under this property path (e.g. `telemetry`).
13
14
  * @property {string} [transform]
14
15
  * @property {string} [allowed]
15
16
  * @property {string|boolean} [deprecated]
@@ -149,7 +150,140 @@ function validateAccess (name) {
149
150
  }
150
151
  }
151
152
 
153
+ let configurationsTable
154
+ let configDefaults
155
+
156
+ // Lazy require to keep the `config -> helper` import direction acyclic: helper
157
+ // must not pull `config/defaults` at module load. `config/defaults` defers its
158
+ // own instrumented `dns` require until after it exports, so by the time any
159
+ // caller resolves a value the table is fully populated.
160
+ function loadConfigurationsTable () {
161
+ if (configurationsTable === undefined) {
162
+ const defaultsModule = require('./defaults')
163
+ configurationsTable = defaultsModule.configurationsTable
164
+ configDefaults = defaultsModule.defaults
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Parses and transforms a raw environment value with the same parser and
170
+ * transformer Config applies when it reads environment sources, so callers
171
+ * receive the typed value instead of the raw string.
172
+ *
173
+ * @param {string} name Canonical or alias environment variable name.
174
+ * @param {string} value Raw value read from an environment source.
175
+ * @param {'env_var'|'fleet_stable_config'|'local_stable_config'} source Source the value was read from.
176
+ * @returns {string | number | boolean | object | undefined}
177
+ */
178
+ function parseConfigurationValue (name, value, source) {
179
+ loadConfigurationsTable()
180
+ const canonical = aliasToCanonical[name] ?? name
181
+ const entry = configurationsTable[canonical]
182
+ const parsed = entry.parser(value, canonical, source)
183
+ return parsed !== undefined && entry.transformer ? entry.transformer(parsed, canonical, source) : parsed
184
+ }
185
+
186
+ /**
187
+ * Returns the registered default for a configuration — the same value Config
188
+ * resolves when no environment source sets it.
189
+ *
190
+ * @param {string} name Canonical or alias environment variable name.
191
+ * @returns {string | number | boolean | object | undefined}
192
+ */
193
+ function getRegisteredDefault (name) {
194
+ loadConfigurationsTable()
195
+ const canonical = aliasToCanonical[name] ?? name
196
+ const entry = configurationsTable[canonical]
197
+ return configDefaults[entry.property ?? canonical]
198
+ }
199
+
200
+ /** @typedef {import('./generated-config-types').GeneratedEnvVarConfig} GeneratedEnvVarConfig */
201
+
202
+ /**
203
+ * Returns the value stored at the given name, assumed to be in environment variable format,
204
+ * from the supported env sources (process.env, local stable config, fleet stable config).
205
+ * Falls back to aliases if the canonical name is not set.
206
+ *
207
+ * The raw value is parsed and transformed exactly as Config does when it reads environment
208
+ * sources, so the returned value is typed (boolean, number, array, map, ...) rather than the
209
+ * raw string. A literal supported name resolves to its specific configured type.
210
+ *
211
+ * When the name is not set in any source, the registered default is returned, so callers can
212
+ * use the value directly. Callers that must distinguish an explicitly configured value from the
213
+ * default (e.g. an OTel fallback that only applies when the option is unset) pass `skipDefault`
214
+ * to receive `undefined` for an unset value instead. All sources (process.env, local and fleet
215
+ * stable config) are read in both modes.
216
+ *
217
+ * @template {keyof GeneratedEnvVarConfig} TName
218
+ * @overload
219
+ * @param {TName} name Environment variable name
220
+ * @returns {GeneratedEnvVarConfig[TName]}
221
+ */
222
+ /**
223
+ * @template {keyof GeneratedEnvVarConfig} TName
224
+ * @overload
225
+ * @param {TName} name Environment variable name
226
+ * @param {boolean} skipDefault Return `undefined` instead of the registered default when unset.
227
+ * @returns {GeneratedEnvVarConfig[TName] | undefined}
228
+ */
229
+ /**
230
+ * @overload
231
+ * @param {string} name Environment variable name
232
+ * @param {boolean} [skipDefault] Return `undefined` instead of the registered default when unset.
233
+ * @returns {string | number | boolean | object | undefined}
234
+ */
235
+ /**
236
+ * @param {string} name
237
+ * @param {boolean} [skipDefault]
238
+ * @throws {Error} if the configuration is not supported
239
+ */
240
+ function getValueFromEnvSources (name, skipDefault) {
241
+ validateAccess(name)
242
+
243
+ if (!stableConfigLoaded) {
244
+ loadStableConfig()
245
+ }
246
+
247
+ // Sources are read in priority order (fleet > env > local). A value the parser
248
+ // or transformer rejects resolves to `undefined` and is ignored, falling
249
+ // through to the next source and finally the registered default — mirroring
250
+ // how Config applies env sources (`setAndTrack` skips such values). This keeps
251
+ // a malformed higher-priority value (e.g. a fleet-stable `DD_TRACE_DEBUG=maybe`)
252
+ // from masking a valid `DD_TRACE_DEBUG=true`.
253
+ if (fleetStableConfig !== undefined) {
254
+ const fromFleet = getValueFromSource(name, fleetStableConfig)
255
+ if (fromFleet !== undefined) {
256
+ const parsed = parseConfigurationValue(name, fromFleet, 'fleet_stable_config')
257
+ if (parsed !== undefined) {
258
+ return parsed
259
+ }
260
+ }
261
+ }
262
+
263
+ const fromEnv = getValueFromSource(name, process.env)
264
+ if (fromEnv !== undefined) {
265
+ const parsed = parseConfigurationValue(name, fromEnv, 'env_var')
266
+ if (parsed !== undefined) {
267
+ return parsed
268
+ }
269
+ }
270
+
271
+ if (localStableConfig !== undefined) {
272
+ const fromLocal = getValueFromSource(name, localStableConfig)
273
+ if (fromLocal !== undefined) {
274
+ const parsed = parseConfigurationValue(name, fromLocal, 'local_stable_config')
275
+ if (parsed !== undefined) {
276
+ return parsed
277
+ }
278
+ }
279
+ }
280
+
281
+ return skipDefault ? undefined : getRegisteredDefault(name)
282
+ }
283
+
152
284
  module.exports = {
285
+ getValueFromEnvSources,
286
+
153
287
  /**
154
288
  * Expose raw stable config maps and warnings for consumers that need
155
289
  * per-source access (e.g. telemetry in Config).
@@ -209,39 +343,6 @@ module.exports = {
209
343
  return getValueFromSource(name, process.env)
210
344
  },
211
345
 
212
- /**
213
- * Returns the value stored at the given name, assumed to be in environment variable format,
214
- * from the supported env sources (process.env, local stable config, fleet stable config).
215
- * Falls back to aliases if the canonical name is not set.
216
- *
217
- * @param {string} name Environment variable name
218
- * @returns {string|undefined}
219
- * @throws {Error} if the configuration is not supported
220
- */
221
- getValueFromEnvSources (name) {
222
- validateAccess(name)
223
-
224
- if (!stableConfigLoaded) {
225
- loadStableConfig()
226
- }
227
-
228
- if (fleetStableConfig !== undefined) {
229
- const fromFleet = getValueFromSource(name, fleetStableConfig)
230
- if (fromFleet !== undefined) {
231
- return fromFleet
232
- }
233
- }
234
-
235
- const fromEnv = getValueFromSource(name, process.env)
236
- if (fromEnv !== undefined) {
237
- return fromEnv
238
- }
239
-
240
- if (localStableConfig !== undefined) {
241
- return getValueFromSource(name, localStableConfig)
242
- }
243
- },
244
-
245
346
  /**
246
347
  * Returns the actual environment variable name used for a supported configuration
247
348
  * from a specific environment-based source.
@@ -7,7 +7,7 @@ const { URL, format } = require('node:url')
7
7
  const rfdc = require('../../../../vendor/dist/rfdc')({ proto: false, circles: false })
8
8
  const uuid = require('../../../../vendor/dist/crypto-randomuuid') // we need to keep the old uuid dep because of cypress
9
9
  const set = require('../../../datadog-core/src/utils/src/set')
10
- const { DD_MAJOR } = require('../../../../version')
10
+ const { DD_MAJOR, NODE_MAJOR } = require('../../../../version')
11
11
  const log = require('../log')
12
12
  const pkg = require('../pkg')
13
13
  const { isTrue } = require('../util')
@@ -25,6 +25,7 @@ const {
25
25
  getEnvironmentVariable,
26
26
  getEnvironmentVariables,
27
27
  getStableConfigSources,
28
+ getValueFromEnvSources,
28
29
  } = require('./helper')
29
30
  const {
30
31
  defaults,
@@ -245,12 +246,12 @@ class Config extends ConfigBase {
245
246
  let entry = optionsTable[fullName]
246
247
  if (!entry) {
247
248
  // TODO: Fix this by by changing remote config to use env styles.
248
- if (name !== 'tracing' || source !== 'remote_config') {
249
+ if (name !== 'DD_TRACE_ENABLED' || source !== 'remote_config') {
249
250
  log.warn('Unknown option %s with value %o', fullName, value)
250
251
  continue
251
252
  }
252
253
  // @ts-expect-error - The entry is defined in the configurationsTable.
253
- entry = configurationsTable.tracing
254
+ entry = configurationsTable.DD_TRACE_ENABLED
254
255
  }
255
256
 
256
257
  if (entry.nestedProperties) {
@@ -286,7 +287,7 @@ class Config extends ConfigBase {
286
287
  }
287
288
  // TODO: Coerce mismatched types to the expected type, if possible. E.g., strings <> numbers
288
289
  const transformed = value !== undefined && entry.transformer ? entry.transformer(value, fullName, source) : value
289
- setAndTrack(this, entry.property, transformed, value, source)
290
+ setAndTrack(this, entry.property ?? name, transformed, value, source)
290
291
  }
291
292
  }
292
293
 
@@ -358,18 +359,22 @@ class Config extends ConfigBase {
358
359
  setAndTrack(this, 'OTEL_TRACES_EXPORTER', 'none')
359
360
  }
360
361
 
361
- if (this.telemetry.heartbeatInterval) {
362
- setAndTrack(this, 'telemetry.heartbeatInterval', Math.floor(this.telemetry.heartbeatInterval * 1000))
362
+ if (this.telemetry.DD_TELEMETRY_HEARTBEAT_INTERVAL) {
363
+ setAndTrack(this, 'telemetry.DD_TELEMETRY_HEARTBEAT_INTERVAL',
364
+ Math.floor(this.telemetry.DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000))
363
365
  }
364
- if (this.telemetry.extendedHeartbeatInterval) {
365
- setAndTrack(this, 'telemetry.extendedHeartbeatInterval',
366
- Math.floor(this.telemetry.extendedHeartbeatInterval * 1000))
366
+
367
+ // Allocation profiling needs a sampling hook only available on Node.js 26+.
368
+ setAndTrack(this, 'DD_PROFILING_ALLOCATION_ENABLED', NODE_MAJOR >= 26 && this.DD_PROFILING_ALLOCATION_ENABLED)
369
+ if (this.telemetry.DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL) {
370
+ setAndTrack(this, 'telemetry.DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL',
371
+ Math.floor(this.telemetry.DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL * 1000))
367
372
  }
368
373
 
369
- // Enable resourceRenamingEnabled when appsec is enabled and only
374
+ // Enable resource renaming when appsec is enabled and only
370
375
  // if DD_TRACE_RESOURCE_RENAMING_ENABLED is not explicitly set
371
- if (!trackedConfigOrigins.has('resourceRenamingEnabled')) {
372
- setAndTrack(this, 'resourceRenamingEnabled', this.appsec.enabled ?? false)
376
+ if (!trackedConfigOrigins.has('DD_TRACE_RESOURCE_RENAMING_ENABLED')) {
377
+ setAndTrack(this, 'DD_TRACE_RESOURCE_RENAMING_ENABLED', this.appsec.enabled ?? false)
373
378
  }
374
379
 
375
380
  if (!trackedConfigOrigins.has('spanComputePeerService') && this.spanAttributeSchema !== 'v0') {
@@ -377,9 +382,9 @@ class Config extends ConfigBase {
377
382
  }
378
383
 
379
384
  if (!this.apmTracingEnabled) {
380
- setAndTrack(this, 'stats.enabled', false)
381
- } else if (!trackedConfigOrigins.has('stats.enabled')) {
382
- setAndTrack(this, 'stats.enabled', getIsGCPFunction() || getIsAzureFunction())
385
+ setAndTrack(this, 'stats.DD_TRACE_STATS_COMPUTATION_ENABLED', false)
386
+ } else if (!trackedConfigOrigins.has('stats.DD_TRACE_STATS_COMPUTATION_ENABLED')) {
387
+ setAndTrack(this, 'stats.DD_TRACE_STATS_COMPUTATION_ENABLED', getIsGCPFunction() || getIsAzureFunction())
383
388
  }
384
389
 
385
390
  // TODO: Remove the experimental env vars as a major or deprecate the option?
@@ -451,11 +456,11 @@ class Config extends ConfigBase {
451
456
  }
452
457
 
453
458
  // For LLMObs, we want to auto enable it when other llmobs options are defined.
454
- if (!this.llmobs.enabled &&
455
- !trackedConfigOrigins.has('llmobs.enabled') &&
459
+ if (!this.llmobs.DD_LLMOBS_ENABLED &&
460
+ !trackedConfigOrigins.has('llmobs.DD_LLMOBS_ENABLED') &&
456
461
  (trackedConfigOrigins.has('llmobs.agentlessEnabled') ||
457
462
  trackedConfigOrigins.has('llmobs.mlApp'))) {
458
- setAndTrack(this, 'llmobs.enabled', true)
463
+ setAndTrack(this, 'llmobs.DD_LLMOBS_ENABLED', true)
459
464
  }
460
465
 
461
466
  if (this.OTEL_RESOURCE_ATTRIBUTES) {
@@ -548,14 +553,15 @@ class Config extends ConfigBase {
548
553
  this.tags['runtime-id'] = RUNTIME_ID
549
554
 
550
555
  if (IS_SERVERLESS) {
551
- setAndTrack(this, 'telemetry.enabled', false)
556
+ setAndTrack(this, 'telemetry.DD_INSTRUMENTATION_TELEMETRY_ENABLED', false)
552
557
  setAndTrack(this, 'DD_CRASHTRACKING_ENABLED', false)
553
- setAndTrack(this, 'remoteConfig.enabled', false)
558
+ setAndTrack(this, 'remoteConfig.DD_REMOTE_CONFIGURATION_ENABLED', false)
554
559
  }
555
560
 
556
561
  // TODO: Should this unconditionally be disabled?
557
- if (getEnvironmentVariable('JEST_WORKER_ID') && !trackedConfigOrigins.has('telemetry.enabled')) {
558
- setAndTrack(this, 'telemetry.enabled', false)
562
+ if (getEnvironmentVariable('JEST_WORKER_ID') &&
563
+ !trackedConfigOrigins.has('telemetry.DD_INSTRUMENTATION_TELEMETRY_ENABLED')) {
564
+ setAndTrack(this, 'telemetry.DD_INSTRUMENTATION_TELEMETRY_ENABLED', false)
559
565
  }
560
566
 
561
567
  // Experimental agentless APM span intake
@@ -565,7 +571,7 @@ class Config extends ConfigBase {
565
571
  if (agentlessEnabled) {
566
572
  setAndTrack(this, 'experimental.exporter', 'agentless')
567
573
  // Disable client-side stats computation
568
- setAndTrack(this, 'stats.enabled', false)
574
+ setAndTrack(this, 'stats.DD_TRACE_STATS_COMPUTATION_ENABLED', false)
569
575
  // Enable hostname reporting
570
576
  setAndTrack(this, 'reportHostname', true)
571
577
  // Disable rate limiting - server-side sampling will be used
@@ -599,6 +605,16 @@ class Config extends ConfigBase {
599
605
  setAndTrack(this, 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', `${defaultOtlpBase}/v1/traces`)
600
606
  }
601
607
 
608
+ const autoTraceMetrics = this.OTEL_TRACES_EXPORTER === 'otlp' && this.DD_METRICS_OTEL_ENABLED === true
609
+ setAndTrack(this, 'OTEL_TRACES_SPAN_METRICS_ENABLED', this.OTEL_TRACES_SPAN_METRICS_ENABLED ?? autoTraceMetrics)
610
+
611
+ if (this.OTEL_TRACES_SPAN_METRICS_ENABLED) {
612
+ this.stats = { ...this.stats, DD_TRACE_STATS_COMPUTATION_ENABLED: true }
613
+ }
614
+
615
+ const flushInterval = getValueFromEnvSources('_DD_TRACE_METRICS_OTEL_FLUSH_INTERVAL')
616
+ setAndTrack(this, '_DD_TRACE_METRICS_OTEL_FLUSH_INTERVAL', flushInterval)
617
+
602
618
  if (process.platform === 'win32') {
603
619
  // OOM monitoring does not work properly on Windows, so it will be disabled.
604
620
  deactivateIfEnabledAndWarnOnWindows(this, 'DD_PROFILING_EXPERIMENTAL_OOM_MONITORING_ENABLED')
@@ -72,11 +72,13 @@ function applyV5Overrides (supportedConfigurations) {
72
72
  const iastEntry = supportedConfigurations.DD_IAST_SECURITY_CONTROLS_CONFIGURATION?.[0]
73
73
  if (!iastEntry) return
74
74
 
75
+ // v5 kept this configurable through the (experimental) iast.* programmatic API. The entry
76
+ // still carries `namespace: "iast"`, so these names route to iast.DD_IAST_SECURITY_CONTROLS_CONFIGURATION
77
+ // and the property path stays canonical across majors.
75
78
  iastEntry.configurationNames = [
76
- iastEntry.internalPropertyName || iastEntry.configurationNames?.[0],
79
+ 'iast.securityControlsConfiguration',
77
80
  `${EXPERIMENTAL_IAST_PREFIX}.securityControlsConfiguration`,
78
81
  ]
79
- delete iastEntry.internalPropertyName
80
82
  }
81
83
 
82
84
  /**
@@ -2,7 +2,7 @@
2
2
 
3
3
  const fs = require('fs')
4
4
 
5
- const { DD_MAJOR } = require('../../../../version')
5
+ const { DD_MAJOR, NODE_MAJOR } = require('../../../../version')
6
6
  const tagger = require('../tagger')
7
7
 
8
8
  let warnInvalidValue
@@ -100,6 +100,24 @@ const transformers = {
100
100
  }
101
101
  return configValue
102
102
  },
103
+ /**
104
+ * Parses DD_PROFILING_DEBUG_UPLOAD_COMPRESSION ('on' | 'off' | 'gzip[-1..9]' | 'zstd[-1..22]')
105
+ * into the codec and level the profiler uploads with. The value's shape is already range-checked
106
+ * by the `allowed` pattern, so no validation is needed here.
107
+ *
108
+ * @param {string} value
109
+ * @returns {{ method: string, level: number | undefined }}
110
+ */
111
+ normalizeProfilingUploadCompression (value) {
112
+ let [method, level] = value.toLowerCase().split('-')
113
+ // Default "on" to zstd on Node.js 24+ and gzip earlier. zstd ships everywhere via a Rust
114
+ // compressor, but 24+ has a built-in that runs on libuv worker threads just as gzip does, so it
115
+ // is the least disruptive default.
116
+ if (method === 'on') {
117
+ method = NODE_MAJOR >= 24 ? 'zstd' : 'gzip'
118
+ }
119
+ return { method, level: level ? Number.parseInt(level, 10) : undefined }
120
+ },
103
121
  sampleRate (value, optionName, source) {
104
122
  const number = Number(value)
105
123
  if (Number.isNaN(number) || value === null) {
@@ -228,7 +228,7 @@ const optionLookupTable = {
228
228
  code_origin_enabled: 'codeOriginForSpans.enabled',
229
229
  tracing_sampling_rate: 'sampleRate',
230
230
  log_injection_enabled: 'logInjection',
231
- tracing_enabled: 'tracing',
231
+ tracing_enabled: 'DD_TRACE_ENABLED',
232
232
  tracing_sampling_rules: 'samplingRules',
233
233
  tracing_header_tags: 'headerTags',
234
234
  tracing_tags: 'tags',