dd-trace 5.54.0 → 5.56.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 (191) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/initialize.mjs +2 -2
  6. package/package.json +10 -9
  7. package/packages/datadog-code-origin/index.js +22 -4
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +3 -3
  9. package/packages/datadog-core/src/utils/src/set.js +8 -10
  10. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -6
  11. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +2 -3
  12. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  13. package/packages/datadog-instrumentations/src/couchbase.js +3 -6
  14. package/packages/datadog-instrumentations/src/cucumber.js +21 -28
  15. package/packages/datadog-instrumentations/src/dns.js +4 -4
  16. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  17. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  18. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +14 -16
  19. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  20. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  21. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -2
  22. package/packages/datadog-instrumentations/src/helpers/register.js +6 -5
  23. package/packages/datadog-instrumentations/src/jest.js +421 -376
  24. package/packages/datadog-instrumentations/src/koa.js +2 -3
  25. package/packages/datadog-instrumentations/src/mariadb.js +11 -4
  26. package/packages/datadog-instrumentations/src/mocha/main.js +79 -75
  27. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  28. package/packages/datadog-instrumentations/src/mysql.js +11 -2
  29. package/packages/datadog-instrumentations/src/nyc.js +2 -1
  30. package/packages/datadog-instrumentations/src/openai.js +2 -2
  31. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  32. package/packages/datadog-instrumentations/src/pg.js +2 -3
  33. package/packages/datadog-instrumentations/src/playwright.js +19 -22
  34. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  35. package/packages/datadog-instrumentations/src/redis.js +1 -1
  36. package/packages/datadog-instrumentations/src/restify.js +9 -13
  37. package/packages/datadog-instrumentations/src/router.js +12 -11
  38. package/packages/datadog-instrumentations/src/tedious.js +1 -2
  39. package/packages/datadog-instrumentations/src/vitest.js +15 -29
  40. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  41. package/packages/datadog-plugin-aws-sdk/src/base.js +12 -8
  42. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  43. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +12 -20
  44. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -5
  45. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +3 -5
  46. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  47. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  48. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
  49. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -10
  50. package/packages/datadog-plugin-azure-functions/src/index.js +5 -4
  51. package/packages/datadog-plugin-cucumber/src/index.js +3 -2
  52. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -1
  53. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  54. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  55. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +1 -1
  56. package/packages/datadog-plugin-graphql/src/index.js +3 -2
  57. package/packages/datadog-plugin-graphql/src/resolve.js +17 -10
  58. package/packages/datadog-plugin-http/src/client.js +5 -6
  59. package/packages/datadog-plugin-http2/src/client.js +7 -8
  60. package/packages/datadog-plugin-jest/src/index.js +3 -2
  61. package/packages/datadog-plugin-mocha/src/index.js +6 -1
  62. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
  63. package/packages/datadog-plugin-mysql/src/index.js +11 -0
  64. package/packages/datadog-plugin-next/src/index.js +1 -1
  65. package/packages/datadog-plugin-openai/src/tracing.js +2 -4
  66. package/packages/datadog-plugin-oracledb/src/index.js +2 -1
  67. package/packages/datadog-plugin-playwright/src/index.js +3 -2
  68. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  69. package/packages/datadog-plugin-redis/src/index.js +1 -3
  70. package/packages/datadog-plugin-vitest/src/index.js +5 -4
  71. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  72. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  73. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  74. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  75. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +1 -2
  76. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +1 -1
  77. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +12 -13
  78. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +44 -1
  79. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -1
  80. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -3
  81. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -1
  82. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
  83. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -2
  84. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  85. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +0 -4
  86. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  87. package/packages/dd-trace/src/appsec/index.js +16 -5
  88. package/packages/dd-trace/src/appsec/reporter.js +11 -11
  89. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  90. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  91. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  92. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -2
  93. package/packages/dd-trace/src/azure_metadata.js +8 -3
  94. package/packages/dd-trace/src/baggage.js +2 -2
  95. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +8 -7
  96. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -1
  97. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -1
  98. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -1
  99. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -1
  100. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +4 -3
  101. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  102. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  103. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -3
  104. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -3
  105. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -1
  106. package/packages/dd-trace/src/config-helper.js +89 -0
  107. package/packages/dd-trace/src/config.js +120 -115
  108. package/packages/dd-trace/src/config_stable.js +7 -4
  109. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  110. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +6 -6
  111. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +1 -2
  112. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -2
  113. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -1
  114. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -3
  115. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  116. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +3 -4
  117. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +1 -1
  118. package/packages/dd-trace/src/debugger/devtools_client/status.js +5 -1
  119. package/packages/dd-trace/src/debugger/index.js +1 -0
  120. package/packages/dd-trace/src/dogstatsd.js +2 -2
  121. package/packages/dd-trace/src/encode/0.4.js +5 -2
  122. package/packages/dd-trace/src/encode/0.5.js +3 -5
  123. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +5 -5
  124. package/packages/dd-trace/src/exporter.js +2 -1
  125. package/packages/dd-trace/src/exporters/agent/writer.js +3 -1
  126. package/packages/dd-trace/src/exporters/common/docker.js +3 -2
  127. package/packages/dd-trace/src/exporters/common/request.js +4 -1
  128. package/packages/dd-trace/src/exporters/common/util.js +3 -1
  129. package/packages/dd-trace/src/id.js +3 -3
  130. package/packages/dd-trace/src/index.js +4 -3
  131. package/packages/dd-trace/src/lambda/handler.js +2 -1
  132. package/packages/dd-trace/src/lambda/index.js +2 -1
  133. package/packages/dd-trace/src/lambda/runtime/patch.js +3 -2
  134. package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -2
  135. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  136. package/packages/dd-trace/src/llmobs/index.js +21 -5
  137. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  138. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  139. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -2
  140. package/packages/dd-trace/src/llmobs/sdk.js +2 -1
  141. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  142. package/packages/dd-trace/src/llmobs/tagger.js +19 -6
  143. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  144. package/packages/dd-trace/src/log/index.js +5 -4
  145. package/packages/dd-trace/src/log/writer.js +1 -2
  146. package/packages/dd-trace/src/msgpack/encoder.js +3 -3
  147. package/packages/dd-trace/src/noop/span.js +1 -1
  148. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  149. package/packages/dd-trace/src/opentracing/propagation/log.js +4 -5
  150. package/packages/dd-trace/src/opentracing/propagation/text_map.js +35 -42
  151. package/packages/dd-trace/src/opentracing/span.js +7 -6
  152. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  153. package/packages/dd-trace/src/plugin_manager.js +4 -3
  154. package/packages/dd-trace/src/plugins/ci_plugin.js +25 -1
  155. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  156. package/packages/dd-trace/src/plugins/util/ci.js +7 -7
  157. package/packages/dd-trace/src/plugins/util/git.js +1 -1
  158. package/packages/dd-trace/src/plugins/util/llm.js +2 -2
  159. package/packages/dd-trace/src/plugins/util/stacktrace.js +8 -1
  160. package/packages/dd-trace/src/plugins/util/test.js +4 -3
  161. package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -1
  162. package/packages/dd-trace/src/plugins/util/web.js +3 -4
  163. package/packages/dd-trace/src/priority_sampler.js +46 -35
  164. package/packages/dd-trace/src/profiling/config.js +12 -32
  165. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  166. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  167. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +2 -1
  168. package/packages/dd-trace/src/profiling/index.js +2 -1
  169. package/packages/dd-trace/src/profiling/profiler.js +7 -4
  170. package/packages/dd-trace/src/profiling/profilers/events.js +10 -2
  171. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  172. package/packages/dd-trace/src/profiling/tagger.js +22 -12
  173. package/packages/dd-trace/src/proxy.js +2 -1
  174. package/packages/dd-trace/src/ritm.js +4 -4
  175. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -2
  176. package/packages/dd-trace/src/sampler.js +10 -2
  177. package/packages/dd-trace/src/serverless.js +11 -4
  178. package/packages/dd-trace/src/span_processor.js +2 -1
  179. package/packages/dd-trace/src/standalone/tracesource.js +1 -2
  180. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  181. package/packages/dd-trace/src/startup-log.js +5 -17
  182. package/packages/dd-trace/src/supported-configurations.json +440 -0
  183. package/packages/dd-trace/src/telemetry/dependencies.js +62 -57
  184. package/packages/dd-trace/src/telemetry/send-data.js +7 -6
  185. package/packages/dd-trace/src/telemetry/telemetry.js +16 -26
  186. package/packages/dd-trace/src/tracer.js +3 -7
  187. package/packages/dd-trace/src/util.js +0 -5
  188. package/packages/datadog-core/src/utils/src/get.js +0 -11
  189. package/packages/datadog-core/src/utils/src/has.js +0 -14
  190. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -120
  191. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -8,8 +8,6 @@ const log = require('./log')
8
8
  const pkg = require('./pkg')
9
9
  const coalesce = require('koalas')
10
10
  const tagger = require('./tagger')
11
- const get = require('../../datadog-core/src/utils/src/get')
12
- const has = require('../../datadog-core/src/utils/src/has')
13
11
  const set = require('../../datadog-core/src/utils/src/set')
14
12
  const { isTrue, isFalse, normalizeProfilingEnabledValue } = require('./util')
15
13
  const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('./plugins/util/tags')
@@ -19,9 +17,12 @@ const telemetryMetrics = require('./telemetry/metrics')
19
17
  const { isInServerlessEnvironment, getIsGCPFunction, getIsAzureFunction } = require('./serverless')
20
18
  const { ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES } = require('./constants')
21
19
  const { appendRules } = require('./payload-tagging/config')
20
+ const { getEnvironmentVariable, getEnvironmentVariables } = require('./config-helper')
22
21
 
23
22
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
24
23
 
24
+ const changeTracker = {}
25
+
25
26
  const telemetryCounters = {
26
27
  'otel.env.hiding': {},
27
28
  'otel.env.invalid': {}
@@ -80,10 +81,10 @@ function getFromOtelSamplerMap (otelTracesSampler, otelTracesSamplerArg) {
80
81
  }
81
82
 
82
83
  function validateOtelPropagators (propagators) {
83
- if (!process.env.PROPAGATION_STYLE_EXTRACT &&
84
- !process.env.PROPAGATION_STYLE_INJECT &&
85
- !process.env.DD_TRACE_PROPAGATION_STYLE &&
86
- process.env.OTEL_PROPAGATORS) {
84
+ if (!getEnvironmentVariable('PROPAGATION_STYLE_EXTRACT') &&
85
+ !getEnvironmentVariable('PROPAGATION_STYLE_INJECT') &&
86
+ !getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') &&
87
+ getEnvironmentVariable('OTEL_PROPAGATORS')) {
87
88
  for (const style in propagators) {
88
89
  if (!VALID_PROPAGATION_STYLES.has(style)) {
89
90
  log.warn('unexpected value for OTEL_PROPAGATORS environment variable')
@@ -94,7 +95,7 @@ function validateOtelPropagators (propagators) {
94
95
  }
95
96
 
96
97
  function validateEnvVarType (envVar) {
97
- const value = process.env[envVar]
98
+ const value = getEnvironmentVariable(envVar)
98
99
  switch (envVar) {
99
100
  case 'OTEL_LOG_LEVEL':
100
101
  return VALID_LOG_LEVELS.has(value)
@@ -103,7 +104,7 @@ function validateEnvVarType (envVar) {
103
104
  case 'OTEL_SERVICE_NAME':
104
105
  return typeof value === 'string'
105
106
  case 'OTEL_TRACES_SAMPLER':
106
- return getFromOtelSamplerMap(value, process.env.OTEL_TRACES_SAMPLER_ARG) !== undefined
107
+ return getFromOtelSamplerMap(value, getEnvironmentVariable('OTEL_TRACES_SAMPLER_ARG')) !== undefined
107
108
  case 'OTEL_TRACES_SAMPLER_ARG':
108
109
  return !Number.isNaN(Number.parseFloat(value))
109
110
  case 'OTEL_SDK_DISABLED':
@@ -119,12 +120,12 @@ function validateEnvVarType (envVar) {
119
120
 
120
121
  function checkIfBothOtelAndDdEnvVarSet () {
121
122
  for (const [otelEnvVar, ddEnvVar] of Object.entries(otelDdEnvMapping)) {
122
- if (ddEnvVar && process.env[ddEnvVar] && process.env[otelEnvVar]) {
123
+ if (ddEnvVar && getEnvironmentVariable(ddEnvVar) && getEnvironmentVariable(otelEnvVar)) {
123
124
  log.warn(`both ${ddEnvVar} and ${otelEnvVar} environment variables are set`)
124
125
  getCounter('otel.env.hiding', ddEnvVar, otelEnvVar).inc()
125
126
  }
126
127
 
127
- if (process.env[otelEnvVar] && !validateEnvVarType(otelEnvVar)) {
128
+ if (getEnvironmentVariable(otelEnvVar) && !validateEnvVarType(otelEnvVar)) {
128
129
  log.warn(`unexpected value for ${otelEnvVar} environment variable`)
129
130
  getCounter('otel.env.invalid', ddEnvVar, otelEnvVar).inc()
130
131
  }
@@ -178,7 +179,7 @@ function validateNamingVersion (versionString) {
178
179
  * @param {string | string[]} input
179
180
  */
180
181
  function splitJSONPathRules (input) {
181
- if (!input) return null
182
+ if (!input) return
182
183
  if (Array.isArray(input)) return input
183
184
  if (input === 'all') return []
184
185
  return input.split(',')
@@ -211,7 +212,8 @@ function propagationStyle (key, option) {
211
212
  // Otherwise, fallback to env var parsing
212
213
  const envKey = `DD_TRACE_PROPAGATION_STYLE_${key.toUpperCase()}`
213
214
 
214
- const envVar = coalesce(process.env[envKey], process.env.DD_TRACE_PROPAGATION_STYLE, process.env.OTEL_PROPAGATORS)
215
+ const envVar = coalesce(getEnvironmentVariable(envKey),
216
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE'), getEnvironmentVariable('OTEL_PROPAGATORS'))
215
217
  if (envVar !== undefined) {
216
218
  return envVar.split(',')
217
219
  .filter(v => v !== '')
@@ -229,6 +231,16 @@ function reformatSpanSamplingRules (rules) {
229
231
  })
230
232
  }
231
233
 
234
+ const sourcesOrder = [
235
+ { containerProperty: '_remote', origin: 'remote_config', unprocessedProperty: '_remoteUnprocessed' },
236
+ { containerProperty: '_options', origin: 'code', unprocessedProperty: '_optsUnprocessed' },
237
+ { containerProperty: '_fleetStableConfig', origin: 'fleet_stable_config' },
238
+ { containerProperty: '_env', origin: 'env_var', unprocessedProperty: '_envUnprocessed' },
239
+ { containerProperty: '_localStableConfig', origin: 'local_stable_config' },
240
+ { containerProperty: '_calculated', origin: 'calculated' },
241
+ { containerProperty: '_defaults', origin: 'default' }
242
+ ]
243
+
232
244
  class Config {
233
245
  constructor (options = {}) {
234
246
  if (!isInServerlessEnvironment()) {
@@ -265,14 +277,11 @@ class Config {
265
277
 
266
278
  checkIfBothOtelAndDdEnvVarSet()
267
279
 
268
- const DD_API_KEY = coalesce(
269
- process.env.DATADOG_API_KEY,
270
- process.env.DD_API_KEY
271
- )
280
+ const DD_API_KEY = getEnvironmentVariable('DD_API_KEY')
272
281
 
273
- if (process.env.DD_TRACE_PROPAGATION_STYLE && (
274
- process.env.DD_TRACE_PROPAGATION_STYLE_INJECT ||
275
- process.env.DD_TRACE_PROPAGATION_STYLE_EXTRACT
282
+ if (getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') && (
283
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_INJECT') ||
284
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_EXTRACT')
276
285
  )) {
277
286
  log.warn(
278
287
  'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate ' +
@@ -294,34 +303,34 @@ class Config {
294
303
  }
295
304
 
296
305
  const DD_INSTRUMENTATION_INSTALL_ID = coalesce(
297
- process.env.DD_INSTRUMENTATION_INSTALL_ID,
306
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID'),
298
307
  null
299
308
  )
300
309
  const DD_INSTRUMENTATION_INSTALL_TIME = coalesce(
301
- process.env.DD_INSTRUMENTATION_INSTALL_TIME,
310
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TIME'),
302
311
  null
303
312
  )
304
313
  const DD_INSTRUMENTATION_INSTALL_TYPE = coalesce(
305
- process.env.DD_INSTRUMENTATION_INSTALL_TYPE,
314
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TYPE'),
306
315
  null
307
316
  )
308
317
 
309
318
  const DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING = splitJSONPathRules(
310
319
  coalesce(
311
- process.env.DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING,
320
+ getEnvironmentVariable('DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING'),
312
321
  options.cloudPayloadTagging?.request,
313
322
  ''
314
323
  ))
315
324
 
316
325
  const DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING = splitJSONPathRules(
317
326
  coalesce(
318
- process.env.DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING,
327
+ getEnvironmentVariable('DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING'),
319
328
  options.cloudPayloadTagging?.response,
320
329
  ''
321
330
  ))
322
331
 
323
332
  const DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH = coalesce(
324
- process.env.DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH,
333
+ getEnvironmentVariable('DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH'),
325
334
  options.cloudPayloadTagging?.maxDepth,
326
335
  10
327
336
  )
@@ -370,17 +379,17 @@ class Config {
370
379
  if (this.gitMetadataEnabled) {
371
380
  this.repositoryUrl = removeUserSensitiveInfo(
372
381
  coalesce(
373
- process.env.DD_GIT_REPOSITORY_URL,
382
+ getEnvironmentVariable('DD_GIT_REPOSITORY_URL'),
374
383
  this.tags[GIT_REPOSITORY_URL]
375
384
  )
376
385
  )
377
386
  this.commitSHA = coalesce(
378
- process.env.DD_GIT_COMMIT_SHA,
387
+ getEnvironmentVariable('DD_GIT_COMMIT_SHA'),
379
388
  this.tags[GIT_COMMIT_SHA]
380
389
  )
381
390
  if (!this.repositoryUrl || !this.commitSHA) {
382
391
  const DD_GIT_PROPERTIES_FILE = coalesce(
383
- process.env.DD_GIT_PROPERTIES_FILE,
392
+ getEnvironmentVariable('DD_GIT_PROPERTIES_FILE'),
384
393
  `${process.cwd()}/git.properties`
385
394
  )
386
395
  let gitPropertiesString
@@ -388,7 +397,7 @@ class Config {
388
397
  gitPropertiesString = fs.readFileSync(DD_GIT_PROPERTIES_FILE, 'utf8')
389
398
  } catch (e) {
390
399
  // Only log error if the user has set a git.properties path
391
- if (process.env.DD_GIT_PROPERTIES_FILE) {
400
+ if (getEnvironmentVariable('DD_GIT_PROPERTIES_FILE')) {
392
401
  log.error('Error reading DD_GIT_PROPERTIES_FILE: %s', DD_GIT_PROPERTIES_FILE, e)
393
402
  }
394
403
  }
@@ -418,7 +427,7 @@ class Config {
418
427
  // TODO: Remove the experimental env vars as a major?
419
428
  const DD_TRACE_B3_ENABLED = coalesce(
420
429
  options.experimental && options.experimental.b3,
421
- process.env.DD_TRACE_EXPERIMENTAL_B3_ENABLED,
430
+ getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_B3_ENABLED'),
422
431
  false
423
432
  )
424
433
  const defaultPropagationStyle = ['datadog', 'tracecontext']
@@ -439,7 +448,7 @@ class Config {
439
448
  FUNCTION_NAME,
440
449
  K_SERVICE,
441
450
  WEBSITE_SITE_NAME
442
- } = process.env
451
+ } = getEnvironmentVariables()
443
452
 
444
453
  const service = AWS_LAMBDA_FUNCTION_NAME ||
445
454
  FUNCTION_NAME || // Google Cloud Function Name set by deprecated runtimes
@@ -488,6 +497,7 @@ class Config {
488
497
  this._setValue(defaults, 'dynamicInstrumentation.enabled', false)
489
498
  this._setValue(defaults, 'dynamicInstrumentation.redactedIdentifiers', [])
490
499
  this._setValue(defaults, 'dynamicInstrumentation.redactionExcludedIdentifiers', [])
500
+ this._setValue(defaults, 'dynamicInstrumentation.uploadIntervalSeconds', 1)
491
501
  this._setValue(defaults, 'env')
492
502
  this._setValue(defaults, 'experimental.enableGetRumData', false)
493
503
  this._setValue(defaults, 'experimental.exporter')
@@ -643,7 +653,6 @@ class Config {
643
653
  DD_API_SECURITY_SAMPLE_DELAY,
644
654
  DD_APM_TRACING_ENABLED,
645
655
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
646
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING,
647
656
  DD_APPSEC_COLLECT_ALL_HEADERS,
648
657
  DD_APPSEC_ENABLED,
649
658
  DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON,
@@ -667,16 +676,15 @@ class Config {
667
676
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED,
668
677
  DD_DATA_STREAMS_ENABLED,
669
678
  DD_DBM_PROPAGATION_MODE,
670
- DD_DOGSTATSD_HOSTNAME,
671
679
  DD_DOGSTATSD_HOST,
672
680
  DD_DOGSTATSD_PORT,
673
681
  DD_DYNAMIC_INSTRUMENTATION_ENABLED,
674
682
  DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS,
675
683
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS,
684
+ DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS,
676
685
  DD_ENV,
677
- DD_EXPERIMENTAL_API_SECURITY_ENABLED,
678
686
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED,
679
- DD_EXPERIMENTAL_PROFILING_ENABLED,
687
+ DD_PROFILING_ENABLED,
680
688
  DD_GRPC_CLIENT_ERROR_STATUSES,
681
689
  DD_GRPC_SERVER_ERROR_STATUSES,
682
690
  JEST_WORKER_ID,
@@ -703,7 +711,6 @@ class Config {
703
711
  DD_LLMOBS_ML_APP,
704
712
  DD_OPENAI_LOGS_ENABLED,
705
713
  DD_OPENAI_SPAN_CHAR_LIMIT,
706
- DD_PROFILING_ENABLED,
707
714
  DD_PROFILING_EXPORTERS,
708
715
  DD_PROFILING_SOURCE_MAP,
709
716
  DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD,
@@ -712,7 +719,6 @@ class Config {
712
719
  DD_RUNTIME_METRICS_ENABLED,
713
720
  DD_SERVICE,
714
721
  DD_SERVICE_MAPPING,
715
- DD_SERVICE_NAME,
716
722
  DD_SITE,
717
723
  DD_SPAN_SAMPLING_RULES,
718
724
  DD_SPAN_SAMPLING_RULES_FILE,
@@ -724,7 +730,6 @@ class Config {
724
730
  DD_TELEMETRY_METRICS_ENABLED,
725
731
  DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED,
726
732
  DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED,
727
- DD_TRACE_AGENT_HOSTNAME,
728
733
  DD_TRACE_AGENT_PORT,
729
734
  DD_TRACE_AGENT_PROTOCOL_VERSION,
730
735
  DD_TRACE_AWS_ADD_SPAN_POINTERS,
@@ -763,7 +768,6 @@ class Config {
763
768
  DD_TRACE_SPAN_LEAK_DEBUG,
764
769
  DD_TRACE_STARTUP_LOGS,
765
770
  DD_TRACE_TAGS,
766
- DD_TRACE_TELEMETRY_ENABLED,
767
771
  DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH,
768
772
  DD_TRACING_ENABLED,
769
773
  DD_VERSION,
@@ -777,7 +781,7 @@ class Config {
777
781
  OTEL_SERVICE_NAME,
778
782
  OTEL_TRACES_SAMPLER,
779
783
  OTEL_TRACES_SAMPLER_ARG
780
- } = process.env
784
+ } = getEnvironmentVariables()
781
785
 
782
786
  const tags = {}
783
787
  const env = setHiddenProperty(this, '_env', {})
@@ -792,10 +796,7 @@ class Config {
792
796
  DD_APM_TRACING_ENABLED,
793
797
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED)
794
798
  ))
795
- this._setBoolean(env, 'appsec.apiSecurity.enabled', coalesce(
796
- DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED),
797
- DD_EXPERIMENTAL_API_SECURITY_ENABLED && isTrue(DD_EXPERIMENTAL_API_SECURITY_ENABLED)
798
- ))
799
+ this._setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
799
800
  this._setValue(env, 'appsec.apiSecurity.sampleDelay', maybeFloat(DD_API_SECURITY_SAMPLE_DELAY))
800
801
  this._setValue(env, 'appsec.blockedTemplateGraphql', maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON))
801
802
  this._setValue(env, 'appsec.blockedTemplateHtml', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML))
@@ -803,10 +804,7 @@ class Config {
803
804
  this._setValue(env, 'appsec.blockedTemplateJson', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON))
804
805
  this._envUnprocessed['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
805
806
  this._setBoolean(env, 'appsec.enabled', DD_APPSEC_ENABLED)
806
- this._setString(env, 'appsec.eventTracking.mode', coalesce(
807
- DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
808
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING // TODO: remove in next major
809
- ))
807
+ this._setString(env, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
810
808
  this._setBoolean(env, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
811
809
  this._setBoolean(
812
810
  env,
@@ -847,7 +845,7 @@ class Config {
847
845
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED
848
846
  )
849
847
  this._setString(env, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
850
- this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST || DD_DOGSTATSD_HOSTNAME)
848
+ this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
851
849
  this._setString(env, 'dogstatsd.port', DD_DOGSTATSD_PORT)
852
850
  this._setBoolean(env, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
853
851
  this._setBoolean(env, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
@@ -857,6 +855,12 @@ class Config {
857
855
  'dynamicInstrumentation.redactionExcludedIdentifiers',
858
856
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS
859
857
  )
858
+ this._setValue(
859
+ env,
860
+ 'dynamicInstrumentation.uploadIntervalSeconds',
861
+ maybeFloat(DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS)
862
+ )
863
+ this._envUnprocessed['dynamicInstrumentation.uploadInterval'] = DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS
860
864
  this._setString(env, 'env', DD_ENV || tags.env)
861
865
  this._setBoolean(env, 'traceEnabled', DD_TRACE_ENABLED)
862
866
  this._setBoolean(env, 'experimental.enableGetRumData', DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED)
@@ -869,7 +873,7 @@ class Config {
869
873
  this._setIntegerRangeSet(env, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
870
874
  this._setIntegerRangeSet(env, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
871
875
  this._setArray(env, 'headerTags', DD_TRACE_HEADER_TAGS)
872
- this._setString(env, 'hostname', coalesce(DD_AGENT_HOST, DD_TRACE_AGENT_HOSTNAME))
876
+ this._setString(env, 'hostname', DD_AGENT_HOST)
873
877
  this._setValue(env, 'iast.dbRowsToTaint', maybeInt(DD_IAST_DB_ROWS_TO_TAINT))
874
878
  this._setBoolean(env, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
875
879
  this._setBoolean(env, 'iast.enabled', DD_IAST_ENABLED)
@@ -915,7 +919,6 @@ class Config {
915
919
  this._setString(env, 'port', DD_TRACE_AGENT_PORT)
916
920
  const profilingEnabled = normalizeProfilingEnabledValue(
917
921
  coalesce(
918
- DD_EXPERIMENTAL_PROFILING_ENABLED,
919
922
  DD_PROFILING_ENABLED,
920
923
  this._isInServerlessEnvironment() ? 'false' : undefined
921
924
  )
@@ -953,10 +956,10 @@ class Config {
953
956
  this._setSamplingRule(env, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
954
957
  this._envUnprocessed['sampler.rules'] = DD_TRACE_SAMPLING_RULES
955
958
  this._setString(env, 'scope', DD_TRACE_SCOPE)
956
- this._setString(env, 'service', DD_SERVICE || DD_SERVICE_NAME || tags.service || OTEL_SERVICE_NAME)
959
+ this._setString(env, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
957
960
  if (DD_SERVICE_MAPPING) {
958
961
  this._setValue(env, 'serviceMapping', Object.fromEntries(
959
- process.env.DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
962
+ DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
960
963
  ))
961
964
  }
962
965
  this._setString(env, 'site', DD_SITE)
@@ -971,8 +974,7 @@ class Config {
971
974
  this._setTags(env, 'tags', tags)
972
975
  this._setValue(env, 'tagsHeaderMaxLength', DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH)
973
976
  this._setBoolean(env, 'telemetry.enabled', coalesce(
974
- DD_TRACE_TELEMETRY_ENABLED, // for backward compatibility
975
- DD_INSTRUMENTATION_TELEMETRY_ENABLED, // to comply with instrumentation telemetry specs
977
+ DD_INSTRUMENTATION_TELEMETRY_ENABLED,
976
978
  !(this._isInServerlessEnvironment() || JEST_WORKER_ID)
977
979
  ))
978
980
  this._setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
@@ -1016,7 +1018,7 @@ class Config {
1016
1018
  const tags = {}
1017
1019
  setHiddenProperty(this, '_optsUnprocessed', {})
1018
1020
 
1019
- options = setHiddenProperty(this, '_optionsArg', Object.assign({ ingestion: {} }, options, opts))
1021
+ options = setHiddenProperty(this, '_optionsArg', { ingestion: {}, ...options, ...opts })
1020
1022
 
1021
1023
  tagger.add(tags, options.tags)
1022
1024
 
@@ -1088,6 +1090,13 @@ class Config {
1088
1090
  'dynamicInstrumentation.redactionExcludedIdentifiers',
1089
1091
  options.dynamicInstrumentation?.redactionExcludedIdentifiers
1090
1092
  )
1093
+ this._setValue(
1094
+ opts,
1095
+ 'dynamicInstrumentation.uploadIntervalSeconds',
1096
+ maybeFloat(options.dynamicInstrumentation?.uploadIntervalSeconds)
1097
+ )
1098
+ this._optsUnprocessed['dynamicInstrumentation.uploadIntervalSeconds'] =
1099
+ options.dynamicInstrumentation?.uploadIntervalSeconds
1091
1100
  this._setString(opts, 'env', options.env || tags.env)
1092
1101
  this._setBoolean(opts, 'experimental.enableGetRumData', options.experimental?.enableGetRumData)
1093
1102
  this._setString(opts, 'experimental.exporter', options.experimental?.exporter)
@@ -1181,20 +1190,19 @@ class Config {
1181
1190
 
1182
1191
  _isCiVisibilityItrEnabled () {
1183
1192
  return coalesce(
1184
- process.env.DD_CIVISIBILITY_ITR_ENABLED,
1193
+ getEnvironmentVariable('DD_CIVISIBILITY_ITR_ENABLED'),
1185
1194
  true
1186
1195
  )
1187
1196
  }
1188
1197
 
1189
1198
  _getHostname () {
1190
- const DD_CIVISIBILITY_AGENTLESS_URL = process.env.DD_CIVISIBILITY_AGENTLESS_URL
1199
+ const DD_CIVISIBILITY_AGENTLESS_URL = getEnvironmentVariable('DD_CIVISIBILITY_AGENTLESS_URL')
1191
1200
  const url = DD_CIVISIBILITY_AGENTLESS_URL
1192
1201
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1193
1202
  : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1194
1203
  const DD_AGENT_HOST = coalesce(
1195
1204
  this._optionsArg.hostname,
1196
- process.env.DD_AGENT_HOST,
1197
- process.env.DD_TRACE_AGENT_HOSTNAME,
1205
+ getEnvironmentVariable('DD_AGENT_HOST'),
1198
1206
  '127.0.0.1'
1199
1207
  )
1200
1208
  return DD_AGENT_HOST || (url && url.hostname)
@@ -1204,17 +1212,17 @@ class Config {
1204
1212
  const DD_TRACE_SPAN_ATTRIBUTE_SCHEMA = validateNamingVersion(
1205
1213
  coalesce(
1206
1214
  this._optionsArg.spanAttributeSchema,
1207
- process.env.DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
1215
+ getEnvironmentVariable('DD_TRACE_SPAN_ATTRIBUTE_SCHEMA')
1208
1216
  )
1209
1217
  )
1210
1218
 
1211
1219
  const peerServiceSet = (
1212
1220
  this._optionsArg.hasOwnProperty('spanComputePeerService') ||
1213
- process.env.hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1221
+ getEnvironmentVariables().hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1214
1222
  )
1215
1223
  const peerServiceValue = coalesce(
1216
1224
  this._optionsArg.spanComputePeerService,
1217
- process.env.DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED
1225
+ getEnvironmentVariable('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1218
1226
  )
1219
1227
 
1220
1228
  const spanComputePeerService = (
@@ -1230,14 +1238,14 @@ class Config {
1230
1238
 
1231
1239
  _isCiVisibilityGitUploadEnabled () {
1232
1240
  return coalesce(
1233
- process.env.DD_CIVISIBILITY_GIT_UPLOAD_ENABLED,
1241
+ getEnvironmentVariable('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED'),
1234
1242
  true
1235
1243
  )
1236
1244
  }
1237
1245
 
1238
1246
  _isCiVisibilityManualApiEnabled () {
1239
1247
  return coalesce(
1240
- process.env.DD_CIVISIBILITY_MANUAL_API_ENABLED,
1248
+ getEnvironmentVariable('DD_CIVISIBILITY_MANUAL_API_ENABLED'),
1241
1249
  true
1242
1250
  )
1243
1251
  }
@@ -1248,7 +1256,7 @@ class Config {
1248
1256
 
1249
1257
  return apmTracingEnabled && coalesce(
1250
1258
  this._optionsArg.stats,
1251
- process.env.DD_TRACE_STATS_COMPUTATION_ENABLED,
1259
+ getEnvironmentVariable('DD_TRACE_STATS_COMPUTATION_ENABLED'),
1252
1260
  getIsGCPFunction() || getIsAzureFunction()
1253
1261
  )
1254
1262
  }
@@ -1256,8 +1264,7 @@ class Config {
1256
1264
  _getTraceAgentUrl () {
1257
1265
  return coalesce(
1258
1266
  this._optionsArg.url,
1259
- process.env.DD_TRACE_AGENT_URL,
1260
- process.env.DD_TRACE_URL,
1267
+ getEnvironmentVariable('DD_TRACE_AGENT_URL'),
1261
1268
  null
1262
1269
  )
1263
1270
  }
@@ -1277,7 +1284,7 @@ class Config {
1277
1284
  DD_TEST_MANAGEMENT_ENABLED,
1278
1285
  DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
1279
1286
  DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED
1280
- } = process.env
1287
+ } = getEnvironmentVariables()
1281
1288
 
1282
1289
  if (DD_CIVISIBILITY_AGENTLESS_URL) {
1283
1290
  this._setValue(calc, 'url', new URL(DD_CIVISIBILITY_AGENTLESS_URL))
@@ -1454,66 +1461,65 @@ class Config {
1454
1461
  obj[name] = value
1455
1462
  }
1456
1463
 
1464
+ _setAndTrackChange ({ name, value, origin, unprocessedValue, changes }) {
1465
+ set(this, name, value)
1466
+
1467
+ if (!changeTracker[name]) {
1468
+ changeTracker[name] = {}
1469
+ }
1470
+
1471
+ const originExists = origin in changeTracker[name]
1472
+ const oldValue = changeTracker[name][origin]
1473
+
1474
+ if (!originExists || oldValue !== value) {
1475
+ changeTracker[name][origin] = value
1476
+ changes.push({
1477
+ name,
1478
+ value: unprocessedValue || value,
1479
+ origin
1480
+ })
1481
+ }
1482
+ }
1483
+
1457
1484
  // TODO: Report origin changes and errors to telemetry.
1458
1485
  // TODO: Deeply merge configurations.
1459
1486
  // TODO: Move change tracking to telemetry.
1460
1487
  // for telemetry reporting, `name`s in `containers` need to be keys from:
1461
1488
  // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1462
1489
  _merge () {
1463
- const containers = [
1464
- this._remote,
1465
- this._options,
1466
- this._fleetStableConfig,
1467
- this._env,
1468
- this._localStableConfig,
1469
- this._calculated,
1470
- this._defaults
1471
- ]
1472
- const origins = [
1473
- 'remote_config',
1474
- 'code',
1475
- 'fleet_stable_config',
1476
- 'env_var',
1477
- 'local_stable_config',
1478
- 'calculated',
1479
- 'default'
1480
- ]
1481
- const unprocessedValues = [
1482
- this._remoteUnprocessed,
1483
- this._optsUnprocessed,
1484
- {},
1485
- this._envUnprocessed,
1486
- {},
1487
- {},
1488
- {}
1489
- ]
1490
1490
  const changes = []
1491
1491
 
1492
1492
  for (const name in this._defaults) {
1493
- for (let i = 0; i < containers.length; i++) {
1494
- const container = containers[i]
1493
+ // Use reverse order for merge (lowest priority first)
1494
+ for (let i = sourcesOrder.length - 1; i >= 0; i--) {
1495
+ const { containerProperty, origin, unprocessedProperty } = sourcesOrder[i]
1496
+ const container = this[containerProperty]
1495
1497
  const value = container[name]
1496
-
1497
- if ((value !== null && value !== undefined) || container === this._defaults) {
1498
- if (get(this, name) === value && has(this, name)) break
1499
-
1500
- set(this, name, value)
1501
-
1502
- changes.push({
1498
+ if (value != null || container === this._defaults) {
1499
+ this._setAndTrackChange({
1503
1500
  name,
1504
- value: unprocessedValues[i][name] || value,
1505
- origin: origins[i]
1501
+ value,
1502
+ origin,
1503
+ unprocessedValue: unprocessedProperty === undefined ? undefined : this[unprocessedProperty][name],
1504
+ changes
1506
1505
  })
1507
-
1508
- break
1509
1506
  }
1510
1507
  }
1511
1508
  }
1512
-
1513
1509
  this.sampler.sampleRate = this.sampleRate
1514
1510
  updateConfig(changes, this)
1515
1511
  }
1516
1512
 
1513
+ getOrigin (name) {
1514
+ for (const { containerProperty, origin } of sourcesOrder) {
1515
+ const container = this[containerProperty]
1516
+ const value = container[name]
1517
+ if (value != null || container === this._defaults) {
1518
+ return origin
1519
+ }
1520
+ }
1521
+ }
1522
+
1517
1523
  // TODO: Refactor the Config class so it never produces any config objects that are incompatible with MessageChannel
1518
1524
  /**
1519
1525
  * Serializes the config object so it can be passed over a Worker Thread MessageChannel.
@@ -1536,12 +1542,12 @@ function handleOtel (tagString) {
1536
1542
  ?.replace(/(^|,)deployment\.environment=/, '$1env:')
1537
1543
  .replace(/(^|,)service\.name=/, '$1service:')
1538
1544
  .replace(/(^|,)service\.version=/, '$1version:')
1539
- .replace(/=/g, ':')
1545
+ .replaceAll('=', ':')
1540
1546
  }
1541
1547
 
1542
1548
  function parseSpaceSeparatedTags (tagString) {
1543
1549
  if (tagString && !tagString.includes(',')) {
1544
- tagString = tagString.replace(/\s+/g, ',')
1550
+ tagString = tagString.replaceAll(/\s+/g, ',')
1545
1551
  }
1546
1552
  return tagString
1547
1553
  }
@@ -1564,9 +1570,8 @@ function getAgentUrl (url, options) {
1564
1570
  if (
1565
1571
  !options.hostname &&
1566
1572
  !options.port &&
1567
- !process.env.DD_AGENT_HOST &&
1568
- !process.env.DD_TRACE_AGENT_HOSTNAME &&
1569
- !process.env.DD_TRACE_AGENT_PORT &&
1573
+ !getEnvironmentVariable('DD_AGENT_HOST') &&
1574
+ !getEnvironmentVariable('DD_TRACE_AGENT_PORT') &&
1570
1575
  fs.existsSync('/var/run/datadog/apm.socket')
1571
1576
  ) {
1572
1577
  return new URL('unix:///var/run/datadog/apm.socket')
@@ -1,5 +1,6 @@
1
1
  const os = require('os')
2
2
  const fs = require('fs')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  class StableConfig {
5
6
  constructor () {
@@ -40,6 +41,8 @@ class StableConfig {
40
41
 
41
42
  try {
42
43
  const configurator = new libconfig.JsConfigurator()
44
+ // Intentionally pass through the raw environment variables for reporting.
45
+ // eslint-disable-next-line eslint-rules/eslint-process-env
43
46
  configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`))
44
47
  configurator.set_args(process.argv)
45
48
  configurator.get_configuration(localConfig.toString(), fleetConfig.toString()).forEach((entry) => {
@@ -86,11 +89,11 @@ class StableConfig {
86
89
  }
87
90
 
88
91
  // Allow overriding the paths for testing
89
- if (process.env.DD_TEST_LOCAL_CONFIG_PATH !== undefined) {
90
- localConfigPath = process.env.DD_TEST_LOCAL_CONFIG_PATH
92
+ if (getEnvironmentVariable('DD_TEST_LOCAL_CONFIG_PATH') !== undefined) {
93
+ localConfigPath = getEnvironmentVariable('DD_TEST_LOCAL_CONFIG_PATH')
91
94
  }
92
- if (process.env.DD_TEST_FLEET_CONFIG_PATH !== undefined) {
93
- fleetConfigPath = process.env.DD_TEST_FLEET_CONFIG_PATH
95
+ if (getEnvironmentVariable('DD_TEST_FLEET_CONFIG_PATH') !== undefined) {
96
+ fleetConfigPath = getEnvironmentVariable('DD_TEST_FLEET_CONFIG_PATH')
94
97
  }
95
98
 
96
99
  return { localConfigPath, fleetConfigPath }
@@ -5,7 +5,7 @@ function fnv (data, hvalInit, fnvPrime, fnvSize) {
5
5
  let hval = hvalInit
6
6
  for (const byte of data) {
7
7
  hval = (hval * fnvPrime) % fnvSize
8
- hval = hval ^ BigInt(byte)
8
+ hval ^= BigInt(byte)
9
9
  }
10
10
  return hval
11
11
  }
@@ -117,12 +117,12 @@ function convertKey (key) {
117
117
  function jsonStringify (obj, indent = 2) {
118
118
  // made to stringify json exactly similar to python / java in order for hashing to be the same
119
119
  const jsonString = JSON.stringify(obj, (_, value) => value, indent)
120
- return jsonString.replace(/^ +/gm, ' ') // Replace leading spaces with single space
121
- .replace(/\n/g, '') // Remove newlines
122
- .replace(/{ /g, '{') // Remove space after '{'
123
- .replace(/ }/g, '}') // Remove space before '}'
124
- .replace(/\[ /g, '[') // Remove space after '['
125
- .replace(/ \]/g, ']') // Remove space before ']'
120
+ return jsonString.replaceAll(/^ +/gm, ' ') // Replace leading spaces with single space
121
+ .replaceAll('\n', '') // Remove newlines
122
+ .replaceAll('{ ', '{') // Remove space after '{'
123
+ .replaceAll(' }', '}') // Remove space before '}'
124
+ .replaceAll('[ ', '[') // Remove space after '['
125
+ .replaceAll(' ]', ']') // Remove space before ']'
126
126
  }
127
127
 
128
128
  module.exports = {