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.
- package/README.md +13 -8
- package/ci/init.js +25 -5
- package/ci/vitest-no-worker-init-setup.mjs +430 -0
- package/ext/tags.js +2 -0
- package/index.d.ts +79 -24
- package/initialize.mjs +5 -6
- package/loader-hook.mjs +154 -47
- package/package.json +20 -16
- package/packages/datadog-esbuild/index.js +26 -0
- package/packages/datadog-esbuild/src/utils.js +46 -3
- package/packages/datadog-instrumentations/src/connect.js +4 -3
- package/packages/datadog-instrumentations/src/fastify.js +4 -12
- package/packages/datadog-instrumentations/src/fs.js +8 -6
- package/packages/datadog-instrumentations/src/graphql.js +26 -484
- package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +81 -8
- package/packages/datadog-instrumentations/src/helpers/instrument.js +27 -2
- package/packages/datadog-instrumentations/src/helpers/optional-peer-bundler.js +65 -0
- package/packages/datadog-instrumentations/src/helpers/register.js +6 -4
- package/packages/datadog-instrumentations/src/helpers/require-optional-peer.js +17 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql.js +201 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +18 -2
- package/packages/datadog-instrumentations/src/koa.js +3 -2
- package/packages/datadog-instrumentations/src/mariadb.js +4 -2
- package/packages/datadog-instrumentations/src/mocha/main.js +3 -3
- package/packages/datadog-instrumentations/src/mongoose.js +14 -2
- package/packages/datadog-instrumentations/src/next.js +10 -10
- package/packages/datadog-instrumentations/src/otel-sdk-trace.js +7 -6
- package/packages/datadog-instrumentations/src/playwright.js +1 -1
- package/packages/datadog-instrumentations/src/restify.js +4 -3
- package/packages/datadog-instrumentations/src/router.js +18 -5
- package/packages/datadog-instrumentations/src/selenium.js +1 -2
- package/packages/datadog-instrumentations/src/tedious.js +28 -0
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +1293 -0
- package/packages/datadog-instrumentations/src/vitest-main.js +1567 -0
- package/packages/datadog-instrumentations/src/vitest-util.js +249 -0
- package/packages/datadog-instrumentations/src/vitest-worker.js +753 -0
- package/packages/datadog-instrumentations/src/vitest.js +11 -1598
- package/packages/datadog-plugin-avsc/src/schema_iterator.js +2 -2
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/client.js +2 -2
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/context.js +18 -10
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +47 -11
- package/packages/datadog-plugin-aws-sdk/src/base.js +13 -9
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +43 -6
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +83 -91
- package/packages/datadog-plugin-cucumber/src/index.js +1 -1
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +19 -5
- package/packages/datadog-plugin-cypress/src/support.js +45 -1
- package/packages/datadog-plugin-express/src/code_origin.js +1 -1
- package/packages/datadog-plugin-fastify/src/code_origin.js +1 -1
- package/packages/datadog-plugin-graphql/src/execute.js +627 -11
- package/packages/datadog-plugin-graphql/src/index.js +20 -8
- package/packages/datadog-plugin-graphql/src/parse.js +24 -4
- package/packages/datadog-plugin-graphql/src/validate.js +16 -5
- package/packages/datadog-plugin-http/src/client.js +8 -3
- package/packages/datadog-plugin-http/src/index.js +6 -8
- package/packages/datadog-plugin-http2/src/client.js +5 -2
- package/packages/datadog-plugin-jest/src/index.js +1 -1
- package/packages/datadog-plugin-mocha/src/index.js +1 -1
- package/packages/datadog-plugin-mysql/src/index.js +7 -2
- package/packages/datadog-plugin-openai/src/services.js +2 -2
- package/packages/datadog-plugin-playwright/src/index.js +1 -1
- package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +2 -2
- package/packages/datadog-plugin-undici/src/index.js +5 -2
- package/packages/datadog-plugin-vitest/src/index.js +76 -64
- package/packages/datadog-shimmer/src/shimmer.js +37 -16
- package/packages/datadog-webpack/index.js +17 -1
- package/packages/datadog-webpack/src/optional-peer-loader.js +17 -0
- package/packages/dd-trace/src/aiguard/sdk.js +15 -3
- package/packages/dd-trace/src/appsec/api_security/index.js +55 -0
- package/packages/dd-trace/src/appsec/api_security/sampler.js +147 -0
- package/packages/dd-trace/src/appsec/channels.js +3 -1
- package/packages/dd-trace/src/appsec/downstream_requests.js +4 -4
- package/packages/dd-trace/src/appsec/graphql.js +5 -5
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +26 -19
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +2 -2
- package/packages/dd-trace/src/appsec/iast/telemetry/index.js +2 -1
- package/packages/dd-trace/src/appsec/index.js +20 -7
- package/packages/dd-trace/src/appsec/lambda.js +135 -0
- package/packages/dd-trace/src/appsec/reporter.js +50 -10
- package/packages/dd-trace/src/appsec/telemetry/api_security.js +34 -0
- package/packages/dd-trace/src/appsec/telemetry/index.js +27 -1
- package/packages/dd-trace/src/appsec/waf/index.js +16 -4
- package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +4 -4
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +21 -6
- package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +3 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +55 -13
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +17 -0
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +47 -26
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +2 -2
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +64 -53
- package/packages/dd-trace/src/ci-visibility/requests/request.js +1 -17
- package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +3 -3
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +23 -5
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache-schema.js +128 -0
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +287 -0
- package/packages/dd-trace/src/config/defaults.js +25 -5
- package/packages/dd-trace/src/config/generated-config-types.d.ts +596 -58
- package/packages/dd-trace/src/config/helper.js +134 -33
- package/packages/dd-trace/src/config/index.js +39 -23
- package/packages/dd-trace/src/config/major-overrides.js +4 -2
- package/packages/dd-trace/src/config/parsers.js +19 -1
- package/packages/dd-trace/src/config/remote_config.js +1 -1
- package/packages/dd-trace/src/config/supported-configurations.json +109 -57
- package/packages/dd-trace/src/constants.js +7 -0
- package/packages/dd-trace/src/datastreams/processor.js +11 -3
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +47 -35
- package/packages/dd-trace/src/debugger/devtools_client/index.js +31 -66
- package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +83 -0
- package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -0
- package/packages/dd-trace/src/debugger/index.js +5 -0
- package/packages/dd-trace/src/debugger/probe_sampler.js +112 -0
- package/packages/dd-trace/src/debugger/probe_sampler_constants.js +19 -0
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +77 -26
- package/packages/dd-trace/src/exporters/agent/index.js +1 -1
- package/packages/dd-trace/src/exporters/agentless/writer.js +4 -4
- package/packages/dd-trace/src/exporters/common/request.js +1 -20
- package/packages/dd-trace/src/exporters/common/url.js +34 -0
- package/packages/dd-trace/src/exporters/span-stats/writer.js +1 -3
- package/packages/dd-trace/src/guardrails/index.js +8 -5
- package/packages/dd-trace/src/index.js +6 -4
- package/packages/dd-trace/src/llmobs/constants/tags.js +6 -0
- package/packages/dd-trace/src/llmobs/index.js +17 -6
- package/packages/dd-trace/src/llmobs/plugins/base.js +4 -4
- package/packages/dd-trace/src/llmobs/plugins/genai/util.js +3 -3
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +5 -1
- package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +8 -6
- package/packages/dd-trace/src/llmobs/span_processor.js +5 -1
- package/packages/dd-trace/src/llmobs/tagger.js +58 -3
- package/packages/dd-trace/src/llmobs/telemetry.js +1 -0
- package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
- package/packages/dd-trace/src/log/index.js +18 -20
- package/packages/dd-trace/src/openfeature/flagging_provider.js +2 -7
- package/packages/dd-trace/src/opentelemetry/bridge-span-base.js +5 -4
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +54 -5
- package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +2 -1
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +40 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +169 -0
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +4 -3
- package/packages/dd-trace/src/opentelemetry/metrics/time.js +19 -0
- package/packages/dd-trace/src/opentelemetry/otlp/common.proto +2 -2
- package/packages/dd-trace/src/opentelemetry/otlp/logs.proto +1 -1
- package/packages/dd-trace/src/opentelemetry/otlp/logs_service.proto +1 -1
- package/packages/dd-trace/src/opentelemetry/otlp/metrics.proto +1 -1
- package/packages/dd-trace/src/opentelemetry/otlp/metrics_service.proto +1 -1
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +44 -38
- package/packages/dd-trace/src/opentelemetry/span-helpers.js +29 -13
- package/packages/dd-trace/src/opentelemetry/span.js +14 -3
- package/packages/dd-trace/src/opentelemetry/span_context.js +1 -0
- package/packages/dd-trace/src/opentelemetry/trace/index.js +6 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +3 -2
- package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +26 -13
- package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +3 -3
- package/packages/dd-trace/src/opentracing/span_context.js +17 -0
- package/packages/dd-trace/src/opentracing/tracer.js +6 -1
- package/packages/dd-trace/src/plugin_manager.js +14 -8
- package/packages/dd-trace/src/plugins/ci_plugin.js +21 -4
- package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +276 -0
- package/packages/dd-trace/src/plugins/util/llm.js +6 -1
- package/packages/dd-trace/src/plugins/util/test.js +91 -9
- package/packages/dd-trace/src/plugins/util/url.js +68 -1
- package/packages/dd-trace/src/plugins/util/web.js +19 -36
- package/packages/dd-trace/src/priority_sampler.js +1 -13
- package/packages/dd-trace/src/profiling/config.js +129 -198
- package/packages/dd-trace/src/profiling/constants.js +4 -7
- package/packages/dd-trace/src/profiling/exporter_cli.js +10 -10
- package/packages/dd-trace/src/profiling/exporters/agent.js +23 -16
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +45 -14
- package/packages/dd-trace/src/profiling/exporters/file.js +16 -5
- package/packages/dd-trace/src/profiling/oom.js +71 -0
- package/packages/dd-trace/src/profiling/profiler.js +35 -23
- package/packages/dd-trace/src/profiling/profilers/events.js +14 -7
- package/packages/dd-trace/src/profiling/profilers/space.js +27 -18
- package/packages/dd-trace/src/profiling/profilers/wall.js +35 -25
- package/packages/dd-trace/src/proxy.js +8 -8
- package/packages/dd-trace/src/ritm.js +4 -2
- package/packages/dd-trace/src/serverless.js +1 -2
- package/packages/dd-trace/src/service-naming/schemas/util.js +36 -5
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +5 -3
- package/packages/dd-trace/src/span_format.js +2 -1
- package/packages/dd-trace/src/span_processor.js +11 -6
- package/packages/dd-trace/src/span_stats.js +96 -78
- package/packages/dd-trace/src/startup-log.js +2 -1
- package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
- package/packages/dd-trace/src/telemetry/endpoints.js +6 -4
- package/packages/dd-trace/src/telemetry/index.js +2 -2
- package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
- package/packages/dd-trace/src/telemetry/send-data.js +20 -18
- package/packages/dd-trace/src/telemetry/session-propagation.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +9 -9
- package/packages/dd-trace/src/tracer.js +15 -1
- package/packages/dd-trace/src/util.js +14 -0
- package/register.js +58 -1
- package/vendor/dist/@apm-js-collab/code-transformer/index.js +1 -1
- package/vendor/dist/@datadog/sketches-js/index.js +1 -1
- package/vendor/dist/pprof-format/index.js +1 -1
- package/vendor/dist/protobufjs/index.js +1 -1
- package/vendor/dist/protobufjs/minimal/index.js +1 -1
- package/vendor/dist/shell-quote/index.js +1 -1
- package/packages/datadog-plugin-graphql/src/resolve.js +0 -170
- 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 !== '
|
|
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.
|
|
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.
|
|
362
|
-
setAndTrack(this, 'telemetry.
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
|
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('
|
|
372
|
-
setAndTrack(this, '
|
|
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.
|
|
381
|
-
} else if (!trackedConfigOrigins.has('stats.
|
|
382
|
-
setAndTrack(this, 'stats.
|
|
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.
|
|
455
|
-
!trackedConfigOrigins.has('llmobs.
|
|
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.
|
|
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.
|
|
556
|
+
setAndTrack(this, 'telemetry.DD_INSTRUMENTATION_TELEMETRY_ENABLED', false)
|
|
552
557
|
setAndTrack(this, 'DD_CRASHTRACKING_ENABLED', false)
|
|
553
|
-
setAndTrack(this, 'remoteConfig.
|
|
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') &&
|
|
558
|
-
|
|
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.
|
|
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
|
-
|
|
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: '
|
|
231
|
+
tracing_enabled: 'DD_TRACE_ENABLED',
|
|
232
232
|
tracing_sampling_rules: 'samplingRules',
|
|
233
233
|
tracing_header_tags: 'headerTags',
|
|
234
234
|
tracing_tags: 'tags',
|