dd-trace 5.55.0 → 5.57.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 (150) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/index.d.ts +44 -2
  3. package/init.js +4 -1
  4. package/package.json +24 -23
  5. package/packages/datadog-core/src/utils/src/set.js +8 -10
  6. package/packages/datadog-esbuild/index.js +22 -0
  7. package/packages/datadog-instrumentations/src/cassandra-driver.js +43 -60
  8. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +12 -12
  9. package/packages/datadog-instrumentations/src/cucumber.js +4 -6
  10. package/packages/datadog-instrumentations/src/elasticsearch.js +16 -19
  11. package/packages/datadog-instrumentations/src/fastify.js +91 -9
  12. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +20 -5
  13. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +2 -2
  14. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  15. package/packages/datadog-instrumentations/src/helpers/register.js +17 -5
  16. package/packages/datadog-instrumentations/src/ioredis.js +8 -13
  17. package/packages/datadog-instrumentations/src/iovalkey.js +10 -14
  18. package/packages/datadog-instrumentations/src/jest.js +423 -325
  19. package/packages/datadog-instrumentations/src/memcached.js +17 -24
  20. package/packages/datadog-instrumentations/src/mocha/main.js +7 -6
  21. package/packages/datadog-instrumentations/src/moleculer/client.js +9 -10
  22. package/packages/datadog-instrumentations/src/moleculer/server.js +12 -13
  23. package/packages/datadog-instrumentations/src/openai.js +30 -2
  24. package/packages/datadog-instrumentations/src/playwright.js +4 -1
  25. package/packages/datadog-instrumentations/src/prisma.js +116 -0
  26. package/packages/datadog-instrumentations/src/redis.js +32 -43
  27. package/packages/datadog-instrumentations/src/router.js +1 -1
  28. package/packages/datadog-instrumentations/src/sharedb.js +10 -16
  29. package/packages/datadog-instrumentations/src/vitest.js +4 -4
  30. package/packages/datadog-plugin-aws-sdk/src/base.js +6 -1
  31. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +9 -4
  32. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +3 -2
  33. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -1
  34. package/packages/datadog-plugin-aws-sdk/src/util.js +2 -2
  35. package/packages/datadog-plugin-azure-functions/src/index.js +5 -4
  36. package/packages/datadog-plugin-bunyan/src/index.js +2 -2
  37. package/packages/datadog-plugin-cassandra-driver/src/index.js +6 -2
  38. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/batch-consumer.js +1 -1
  39. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/consumer.js +1 -1
  40. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  41. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/producer.js +1 -1
  42. package/packages/datadog-plugin-cucumber/src/index.js +4 -2
  43. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +9 -5
  44. package/packages/datadog-plugin-elasticsearch/src/index.js +12 -4
  45. package/packages/datadog-plugin-http/src/client.js +1 -0
  46. package/packages/datadog-plugin-http/src/server.js +2 -1
  47. package/packages/datadog-plugin-http2/src/client.js +1 -0
  48. package/packages/datadog-plugin-http2/src/server.js +1 -0
  49. package/packages/datadog-plugin-jest/src/index.js +4 -3
  50. package/packages/datadog-plugin-memcached/src/index.js +6 -2
  51. package/packages/datadog-plugin-mocha/src/index.js +3 -2
  52. package/packages/datadog-plugin-moleculer/src/client.js +15 -9
  53. package/packages/datadog-plugin-moleculer/src/server.js +9 -5
  54. package/packages/datadog-plugin-next/src/index.js +2 -1
  55. package/packages/datadog-plugin-openai/src/tracing.js +127 -80
  56. package/packages/datadog-plugin-oracledb/src/index.js +2 -1
  57. package/packages/datadog-plugin-pino/src/index.js +2 -2
  58. package/packages/datadog-plugin-prisma/src/client.js +62 -0
  59. package/packages/datadog-plugin-prisma/src/engine.js +81 -0
  60. package/packages/datadog-plugin-prisma/src/index.js +22 -0
  61. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  62. package/packages/datadog-plugin-redis/src/index.js +9 -3
  63. package/packages/datadog-plugin-router/src/index.js +1 -0
  64. package/packages/datadog-plugin-sharedb/src/index.js +13 -5
  65. package/packages/datadog-plugin-winston/src/index.js +2 -2
  66. package/packages/dd-trace/src/appsec/channels.js +26 -21
  67. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +1 -1
  68. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +13 -20
  69. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  70. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +44 -1
  71. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -1
  72. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +7 -2
  73. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +0 -1
  74. package/packages/dd-trace/src/appsec/index.js +28 -2
  75. package/packages/dd-trace/src/appsec/rasp/utils.js +0 -5
  76. package/packages/dd-trace/src/appsec/reporter.js +6 -4
  77. package/packages/dd-trace/src/baggage.js +2 -2
  78. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +3 -3
  79. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  80. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  81. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  82. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  83. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -6
  84. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -3
  85. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +3 -3
  86. package/packages/dd-trace/src/config.js +334 -312
  87. package/packages/dd-trace/src/constants.js +2 -1
  88. package/packages/dd-trace/src/crashtracking/crashtracker.js +12 -14
  89. package/packages/dd-trace/src/datastreams/context.js +1 -1
  90. package/packages/dd-trace/src/datastreams/processor.js +1 -1
  91. package/packages/dd-trace/src/datastreams/writer.js +3 -3
  92. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +6 -3
  93. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  94. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -3
  95. package/packages/dd-trace/src/debugger/devtools_client/send.js +5 -1
  96. package/packages/dd-trace/src/debugger/devtools_client/state.js +7 -4
  97. package/packages/dd-trace/src/debugger/devtools_client/status.js +5 -1
  98. package/packages/dd-trace/src/dogstatsd.js +3 -3
  99. package/packages/dd-trace/src/exporters/agent/index.js +10 -5
  100. package/packages/dd-trace/src/exporters/agent/writer.js +4 -2
  101. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +2 -2
  102. package/packages/dd-trace/src/exporters/log/index.js +1 -1
  103. package/packages/dd-trace/src/exporters/span-stats/writer.js +2 -2
  104. package/packages/dd-trace/src/guardrails/index.js +3 -1
  105. package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
  106. package/packages/dd-trace/src/llmobs/index.js +11 -5
  107. package/packages/dd-trace/src/llmobs/plugins/base.js +2 -2
  108. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +1 -1
  109. package/packages/dd-trace/src/llmobs/tagger.js +13 -13
  110. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  111. package/packages/dd-trace/src/llmobs/writers/spans.js +2 -2
  112. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  113. package/packages/dd-trace/src/opentracing/propagation/text_map.js +22 -28
  114. package/packages/dd-trace/src/opentracing/span.js +1 -0
  115. package/packages/dd-trace/src/plugin_manager.js +3 -3
  116. package/packages/dd-trace/src/plugins/cache.js +2 -2
  117. package/packages/dd-trace/src/plugins/ci_plugin.js +11 -7
  118. package/packages/dd-trace/src/plugins/database.js +3 -1
  119. package/packages/dd-trace/src/plugins/index.js +1 -0
  120. package/packages/dd-trace/src/plugins/log_plugin.js +5 -1
  121. package/packages/dd-trace/src/plugins/outbound.js +8 -6
  122. package/packages/dd-trace/src/plugins/structured_log_plugin.js +9 -0
  123. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  124. package/packages/dd-trace/src/plugins/util/ci.js +83 -30
  125. package/packages/dd-trace/src/plugins/util/git.js +1 -0
  126. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +3 -2
  127. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -0
  128. package/packages/dd-trace/src/plugins/util/tags.js +4 -1
  129. package/packages/dd-trace/src/plugins/util/test.js +80 -10
  130. package/packages/dd-trace/src/plugins/util/web.js +1 -0
  131. package/packages/dd-trace/src/profiler.js +0 -2
  132. package/packages/dd-trace/src/profiling/exporter_cli.js +1 -3
  133. package/packages/dd-trace/src/profiling/profilers/events.js +10 -2
  134. package/packages/dd-trace/src/profiling/ssi-heuristics.js +18 -126
  135. package/packages/dd-trace/src/proxy.js +12 -27
  136. package/packages/dd-trace/src/runtime_metrics/index.js +1 -1
  137. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +14 -45
  138. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +2 -2
  139. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +4 -0
  140. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +2 -2
  141. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  142. package/packages/dd-trace/src/supported-configurations.json +13 -3
  143. package/packages/dd-trace/src/telemetry/telemetry.js +11 -4
  144. package/packages/dd-trace/src/tracer.js +11 -0
  145. package/packages/dd-trace/src/tracer_metadata.js +25 -0
  146. package/packages/dd-trace/src/util.js +11 -4
  147. package/version.js +3 -1
  148. package/packages/datadog-core/src/utils/src/get.js +0 -11
  149. package/packages/datadog-core/src/utils/src/has.js +0 -14
  150. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +0 -30
@@ -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')
@@ -17,12 +15,16 @@ const { getGitMetadataFromGitProperties, removeUserSensitiveInfo } = require('./
17
15
  const { updateConfig } = require('./telemetry')
18
16
  const telemetryMetrics = require('./telemetry/metrics')
19
17
  const { isInServerlessEnvironment, getIsGCPFunction, getIsAzureFunction } = require('./serverless')
20
- const { ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES } = require('./constants')
18
+ const {
19
+ ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES, INSTRUMENTED_BY_SSI
20
+ } = require('./constants')
21
21
  const { appendRules } = require('./payload-tagging/config')
22
22
  const { getEnvironmentVariable, getEnvironmentVariables } = require('./config-helper')
23
23
 
24
24
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
25
25
 
26
+ const changeTracker = {}
27
+
26
28
  const telemetryCounters = {
27
29
  'otel.env.hiding': {},
28
30
  'otel.env.invalid': {}
@@ -121,12 +123,12 @@ function validateEnvVarType (envVar) {
121
123
  function checkIfBothOtelAndDdEnvVarSet () {
122
124
  for (const [otelEnvVar, ddEnvVar] of Object.entries(otelDdEnvMapping)) {
123
125
  if (ddEnvVar && getEnvironmentVariable(ddEnvVar) && getEnvironmentVariable(otelEnvVar)) {
124
- log.warn(`both ${ddEnvVar} and ${otelEnvVar} environment variables are set`)
126
+ log.warn('both %s and %s environment variables are set', ddEnvVar, otelEnvVar)
125
127
  getCounter('otel.env.hiding', ddEnvVar, otelEnvVar).inc()
126
128
  }
127
129
 
128
130
  if (getEnvironmentVariable(otelEnvVar) && !validateEnvVarType(otelEnvVar)) {
129
- log.warn(`unexpected value for ${otelEnvVar} environment variable`)
131
+ log.warn('unexpected value for %s environment variable', otelEnvVar)
130
132
  getCounter('otel.env.invalid', ddEnvVar, otelEnvVar).inc()
131
133
  }
132
134
  }
@@ -149,6 +151,16 @@ function maybeFile (filepath) {
149
151
  }
150
152
  }
151
153
 
154
+ function maybeJsonFile (filepath) {
155
+ const file = maybeFile(filepath)
156
+ if (!file) return
157
+ try {
158
+ return JSON.parse(file)
159
+ } catch (e) {
160
+ log.error('Error parsing JSON file %s', filepath, e)
161
+ }
162
+ }
163
+
152
164
  function safeJsonParse (input) {
153
165
  try {
154
166
  return JSON.parse(input)
@@ -163,9 +175,7 @@ function validateNamingVersion (versionString) {
163
175
  return defaultNamingVersion
164
176
  }
165
177
  if (!namingVersions.has(versionString)) {
166
- log.warn(
167
- `Unexpected input for config.spanAttributeSchema, picked default ${defaultNamingVersion}`
168
- )
178
+ log.warn('Unexpected input for config.spanAttributeSchema, picked default', defaultNamingVersion)
169
179
  return defaultNamingVersion
170
180
  }
171
181
  return versionString
@@ -231,6 +241,16 @@ function reformatSpanSamplingRules (rules) {
231
241
  })
232
242
  }
233
243
 
244
+ const sourcesOrder = [
245
+ { containerProperty: '_remote', origin: 'remote_config', unprocessedProperty: '_remoteUnprocessed' },
246
+ { containerProperty: '_options', origin: 'code', unprocessedProperty: '_optsUnprocessed' },
247
+ { containerProperty: '_fleetStableConfig', origin: 'fleet_stable_config' },
248
+ { containerProperty: '_env', origin: 'env_var', unprocessedProperty: '_envUnprocessed' },
249
+ { containerProperty: '_localStableConfig', origin: 'local_stable_config' },
250
+ { containerProperty: '_calculated', origin: 'calculated' },
251
+ { containerProperty: '_defaults', origin: 'default' }
252
+ ]
253
+
234
254
  class Config {
235
255
  constructor (options = {}) {
236
256
  if (!isInServerlessEnvironment()) {
@@ -274,9 +294,8 @@ class Config {
274
294
  getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_EXTRACT')
275
295
  )) {
276
296
  log.warn(
277
- 'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate ' +
278
- 'DD_TRACE_PROPAGATION_STYLE_INJECT and DD_TRACE_PROPAGATION_STYLE_EXTRACT ' +
279
- 'environment variables'
297
+ // eslint-disable-next-line @stylistic/max-len
298
+ 'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate DD_TRACE_PROPAGATION_STYLE_INJECT and DD_TRACE_PROPAGATION_STYLE_EXTRACT environment variables'
280
299
  )
281
300
  }
282
301
  const PROPAGATION_STYLE_INJECT = propagationStyle(
@@ -292,6 +311,18 @@ class Config {
292
311
  }
293
312
  }
294
313
 
314
+ if (typeof options.runtimeMetrics === 'boolean') {
315
+ options.runtimeMetrics = {
316
+ enabled: options.runtimeMetrics
317
+ }
318
+ }
319
+
320
+ if (typeof options.runtimeMetrics?.gc === 'boolean') {
321
+ options.runtimeMetrics.gc = {
322
+ enabled: options.runtimeMetrics.gc
323
+ }
324
+ }
325
+
295
326
  const DD_INSTRUMENTATION_INSTALL_ID = coalesce(
296
327
  getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID'),
297
328
  null
@@ -449,150 +480,155 @@ class Config {
449
480
 
450
481
  const defaults = setHiddenProperty(this, '_defaults', {})
451
482
 
452
- this._setBoolean(defaults, 'apmTracingEnabled', true)
453
- this._setValue(defaults, 'appsec.apiSecurity.enabled', true)
454
- this._setValue(defaults, 'appsec.apiSecurity.sampleDelay', 30)
455
- this._setValue(defaults, 'appsec.blockedTemplateGraphql')
456
- this._setValue(defaults, 'appsec.blockedTemplateHtml')
457
- this._setValue(defaults, 'appsec.blockedTemplateJson')
458
- this._setValue(defaults, 'appsec.enabled')
459
- this._setValue(defaults, 'appsec.eventTracking.mode', 'identification')
460
- this._setValue(defaults, 'appsec.extendedHeadersCollection.enabled', false)
461
- this._setValue(defaults, 'appsec.extendedHeadersCollection.redaction', true)
462
- this._setValue(defaults, 'appsec.extendedHeadersCollection.maxHeaders', 50)
463
- this._setValue(defaults, 'appsec.obfuscatorKeyRegex', defaultWafObfuscatorKeyRegex)
464
- this._setValue(defaults, 'appsec.obfuscatorValueRegex', defaultWafObfuscatorValueRegex)
465
- this._setValue(defaults, 'appsec.rasp.enabled', true)
466
- this._setValue(defaults, 'appsec.rasp.bodyCollection', false)
467
- this._setValue(defaults, 'appsec.rateLimit', 100)
468
- this._setValue(defaults, 'appsec.rules')
469
- this._setValue(defaults, 'appsec.sca.enabled', null)
470
- this._setValue(defaults, 'appsec.stackTrace.enabled', true)
471
- this._setValue(defaults, 'appsec.stackTrace.maxDepth', 32)
472
- this._setValue(defaults, 'appsec.stackTrace.maxStackTraces', 2)
473
- this._setValue(defaults, 'appsec.wafTimeout', 5e3) // µs
474
- this._setValue(defaults, 'baggageMaxBytes', 8192)
475
- this._setValue(defaults, 'baggageMaxItems', 64)
476
- this._setValue(defaults, 'baggageTagKeys', 'user.id,session.id,account.id')
477
- this._setValue(defaults, 'ciVisibilityTestSessionName', '')
478
- this._setValue(defaults, 'clientIpEnabled', false)
479
- this._setValue(defaults, 'clientIpHeader', null)
480
- this._setValue(defaults, 'crashtracking.enabled', true)
481
- this._setValue(defaults, 'codeOriginForSpans.enabled', true)
482
- this._setValue(defaults, 'codeOriginForSpans.experimental.exit_spans.enabled', false)
483
- this._setValue(defaults, 'dbmPropagationMode', 'disabled')
484
- this._setValue(defaults, 'dogstatsd.hostname', '127.0.0.1')
485
- this._setValue(defaults, 'dogstatsd.port', '8125')
486
- this._setValue(defaults, 'dsmEnabled', false)
487
- this._setValue(defaults, 'dynamicInstrumentation.enabled', false)
488
- this._setValue(defaults, 'dynamicInstrumentation.redactedIdentifiers', [])
489
- this._setValue(defaults, 'dynamicInstrumentation.redactionExcludedIdentifiers', [])
490
- this._setValue(defaults, 'env')
491
- this._setValue(defaults, 'experimental.enableGetRumData', false)
492
- this._setValue(defaults, 'experimental.exporter')
493
- this._setValue(defaults, 'experimental.runtimeId', false)
494
- this._setValue(defaults, 'flushInterval', 2000)
495
- this._setValue(defaults, 'flushMinSpans', 1000)
496
- this._setValue(defaults, 'gitMetadataEnabled', true)
497
- this._setValue(defaults, 'graphqlErrorExtensions', [])
498
- this._setValue(defaults, 'grpc.client.error.statuses', GRPC_CLIENT_ERROR_STATUSES)
499
- this._setValue(defaults, 'grpc.server.error.statuses', GRPC_SERVER_ERROR_STATUSES)
500
- this._setValue(defaults, 'headerTags', [])
501
- this._setValue(defaults, 'hostname', '127.0.0.1')
502
- this._setValue(defaults, 'iast.dbRowsToTaint', 1)
503
- this._setValue(defaults, 'iast.deduplicationEnabled', true)
504
- this._setValue(defaults, 'iast.enabled', false)
505
- this._setValue(defaults, 'iast.maxConcurrentRequests', 2)
506
- this._setValue(defaults, 'iast.maxContextOperations', 2)
507
- this._setValue(defaults, 'iast.redactionEnabled', true)
508
- this._setValue(defaults, 'iast.redactionNamePattern', null)
509
- this._setValue(defaults, 'iast.redactionValuePattern', null)
510
- this._setValue(defaults, 'iast.requestSampling', 30)
511
- this._setValue(defaults, 'iast.securityControlsConfiguration', null)
512
- this._setValue(defaults, 'iast.telemetryVerbosity', 'INFORMATION')
513
- this._setValue(defaults, 'iast.stackTrace.enabled', true)
514
- this._setValue(defaults, 'injectionEnabled', [])
515
- this._setValue(defaults, 'isAzureFunction', false)
516
- this._setValue(defaults, 'isCiVisibility', false)
517
- this._setValue(defaults, 'isEarlyFlakeDetectionEnabled', false)
518
- this._setValue(defaults, 'isFlakyTestRetriesEnabled', false)
519
- this._setValue(defaults, 'flakyTestRetriesCount', 5)
520
- this._setValue(defaults, 'isGCPFunction', false)
521
- this._setValue(defaults, 'isGitUploadEnabled', false)
522
- this._setValue(defaults, 'isIntelligentTestRunnerEnabled', false)
523
- this._setValue(defaults, 'isManualApiEnabled', false)
524
- this._setValue(defaults, 'langchain.spanCharLimit', 128)
525
- this._setValue(defaults, 'langchain.spanPromptCompletionSampleRate', 1)
526
- this._setValue(defaults, 'llmobs.agentlessEnabled')
527
- this._setValue(defaults, 'llmobs.enabled', false)
528
- this._setValue(defaults, 'llmobs.mlApp')
529
- this._setValue(defaults, 'ciVisibilityTestSessionName', '')
530
- this._setValue(defaults, 'ciVisAgentlessLogSubmissionEnabled', false)
531
- this._setValue(defaults, 'legacyBaggageEnabled', true)
532
- this._setValue(defaults, 'isTestDynamicInstrumentationEnabled', false)
533
- this._setValue(defaults, 'isServiceUserProvided', false)
534
- this._setValue(defaults, 'testManagementAttemptToFixRetries', 20)
535
- this._setValue(defaults, 'isTestManagementEnabled', false)
536
- this._setValue(defaults, 'isImpactedTestsEnabled', false)
537
- this._setValue(defaults, 'logInjection', false)
538
- this._setValue(defaults, 'lookup')
539
- this._setValue(defaults, 'inferredProxyServicesEnabled', false)
540
- this._setValue(defaults, 'memcachedCommandEnabled', false)
541
- this._setValue(defaults, 'middlewareTracingEnabled', true)
542
- this._setValue(defaults, 'openAiLogsEnabled', false)
543
- this._setValue(defaults, 'openai.spanCharLimit', 128)
544
- this._setValue(defaults, 'peerServiceMapping', {})
545
- this._setValue(defaults, 'plugins', true)
546
- this._setValue(defaults, 'port', '8126')
547
- this._setValue(defaults, 'profiling.enabled')
548
- this._setValue(defaults, 'profiling.exporters', 'agent')
549
- this._setValue(defaults, 'profiling.sourceMap', true)
550
- this._setValue(defaults, 'profiling.longLivedThreshold')
551
- this._setValue(defaults, 'protocolVersion', '0.4')
552
- this._setValue(defaults, 'queryStringObfuscation', qsRegex)
553
- this._setValue(defaults, 'remoteConfig.enabled', true)
554
- this._setValue(defaults, 'remoteConfig.pollInterval', 5) // seconds
555
- this._setValue(defaults, 'reportHostname', false)
556
- this._setValue(defaults, 'runtimeMetrics', false)
557
- this._setValue(defaults, 'sampleRate')
558
- this._setValue(defaults, 'sampler.rateLimit', 100)
559
- this._setValue(defaults, 'sampler.rules', [])
560
- this._setValue(defaults, 'sampler.spanSamplingRules', [])
561
- this._setValue(defaults, 'scope')
562
- this._setValue(defaults, 'service', service)
563
- this._setValue(defaults, 'serviceMapping', {})
564
- this._setValue(defaults, 'site', 'datadoghq.com')
565
- this._setValue(defaults, 'spanAttributeSchema', 'v0')
566
- this._setValue(defaults, 'spanComputePeerService', false)
567
- this._setValue(defaults, 'spanLeakDebug', 0)
568
- this._setValue(defaults, 'spanRemoveIntegrationFromService', false)
569
- this._setValue(defaults, 'startupLogs', false)
570
- this._setValue(defaults, 'stats.enabled', false)
571
- this._setValue(defaults, 'tags', {})
572
- this._setValue(defaults, 'tagsHeaderMaxLength', 512)
573
- this._setValue(defaults, 'telemetry.debug', false)
574
- this._setValue(defaults, 'telemetry.dependencyCollection', true)
575
- this._setValue(defaults, 'telemetry.enabled', true)
576
- this._setValue(defaults, 'telemetry.heartbeatInterval', 60_000)
577
- this._setValue(defaults, 'telemetry.logCollection', true)
578
- this._setValue(defaults, 'telemetry.metrics', true)
579
- this._setValue(defaults, 'traceEnabled', true)
580
- this._setValue(defaults, 'traceId128BitGenerationEnabled', true)
581
- this._setValue(defaults, 'traceId128BitLoggingEnabled', true)
582
- this._setValue(defaults, 'tracePropagationExtractFirst', false)
583
- this._setValue(defaults, 'tracePropagationBehaviorExtract', 'continue')
584
- this._setValue(defaults, 'tracePropagationStyle.inject', ['datadog', 'tracecontext', 'baggage'])
585
- this._setValue(defaults, 'tracePropagationStyle.extract', ['datadog', 'tracecontext', 'baggage'])
586
- this._setValue(defaults, 'tracePropagationStyle.otelPropagators', false)
587
- this._setValue(defaults, 'tracing', true)
588
- this._setValue(defaults, 'url')
589
- this._setValue(defaults, 'version', pkg.version)
590
- this._setValue(defaults, 'instrumentation_config_id')
591
- this._setValue(defaults, 'vertexai.spanCharLimit', 128)
592
- this._setValue(defaults, 'vertexai.spanPromptCompletionSampleRate', 1)
593
- this._setValue(defaults, 'trace.aws.addSpanPointers', true)
594
- this._setValue(defaults, 'trace.dynamoDb.tablePrimaryKeys')
595
- this._setValue(defaults, 'trace.nativeSpanEvents', false)
483
+ defaults.apmTracingEnabled = true
484
+ defaults['appsec.apiSecurity.enabled'] = true
485
+ defaults['appsec.apiSecurity.sampleDelay'] = 30
486
+ defaults['appsec.blockedTemplateGraphql'] = undefined
487
+ defaults['appsec.blockedTemplateHtml'] = undefined
488
+ defaults['appsec.blockedTemplateJson'] = undefined
489
+ defaults['appsec.enabled'] = undefined
490
+ defaults['appsec.eventTracking.mode'] = 'identification'
491
+ defaults['appsec.extendedHeadersCollection.enabled'] = false
492
+ defaults['appsec.extendedHeadersCollection.redaction'] = true
493
+ defaults['appsec.extendedHeadersCollection.maxHeaders'] = 50
494
+ defaults['appsec.obfuscatorKeyRegex'] = defaultWafObfuscatorKeyRegex
495
+ defaults['appsec.obfuscatorValueRegex'] = defaultWafObfuscatorValueRegex
496
+ defaults['appsec.rasp.enabled'] = true
497
+ defaults['appsec.rasp.bodyCollection'] = false
498
+ defaults['appsec.rateLimit'] = 100
499
+ defaults['appsec.rules'] = undefined
500
+ defaults['appsec.sca.enabled'] = null
501
+ defaults['appsec.stackTrace.enabled'] = true
502
+ defaults['appsec.stackTrace.maxDepth'] = 32
503
+ defaults['appsec.stackTrace.maxStackTraces'] = 2
504
+ defaults['appsec.wafTimeout'] = 5e3 // µs
505
+ defaults.baggageMaxBytes = 8192
506
+ defaults.baggageMaxItems = 64
507
+ defaults.baggageTagKeys = 'user.id,session.id,account.id'
508
+ defaults.ciVisibilityTestSessionName = ''
509
+ defaults.clientIpEnabled = false
510
+ defaults.clientIpHeader = null
511
+ defaults['crashtracking.enabled'] = true
512
+ defaults['codeOriginForSpans.enabled'] = true
513
+ defaults['codeOriginForSpans.experimental.exit_spans.enabled'] = false
514
+ defaults.dbmPropagationMode = 'disabled'
515
+ defaults['dogstatsd.hostname'] = '127.0.0.1'
516
+ defaults['dogstatsd.port'] = '8125'
517
+ defaults.dsmEnabled = false
518
+ defaults['dynamicInstrumentation.enabled'] = false
519
+ defaults['dynamicInstrumentation.redactedIdentifiers'] = []
520
+ defaults['dynamicInstrumentation.redactionExcludedIdentifiers'] = []
521
+ defaults['dynamicInstrumentation.uploadIntervalSeconds'] = 1
522
+ defaults.env = undefined
523
+ defaults['experimental.enableGetRumData'] = false
524
+ defaults['experimental.exporter'] = undefined
525
+ defaults.flushInterval = 2000
526
+ defaults.flushMinSpans = 1000
527
+ defaults.gitMetadataEnabled = true
528
+ defaults.graphqlErrorExtensions = []
529
+ defaults['grpc.client.error.statuses'] = GRPC_CLIENT_ERROR_STATUSES
530
+ defaults['grpc.server.error.statuses'] = GRPC_SERVER_ERROR_STATUSES
531
+ defaults.headerTags = []
532
+ defaults.hostname = '127.0.0.1'
533
+ defaults['iast.dbRowsToTaint'] = 1
534
+ defaults['iast.deduplicationEnabled'] = true
535
+ defaults['iast.enabled'] = false
536
+ defaults['iast.maxConcurrentRequests'] = 2
537
+ defaults['iast.maxContextOperations'] = 2
538
+ defaults['iast.redactionEnabled'] = true
539
+ defaults['iast.redactionNamePattern'] = null
540
+ defaults['iast.redactionValuePattern'] = null
541
+ defaults['iast.requestSampling'] = 30
542
+ defaults['iast.securityControlsConfiguration'] = null
543
+ defaults['iast.telemetryVerbosity'] = 'INFORMATION'
544
+ defaults['iast.stackTrace.enabled'] = true
545
+ defaults.injectionEnabled = []
546
+ defaults.instrumentationSource = 'manual'
547
+ defaults.injectForce = null
548
+ defaults.isAzureFunction = false
549
+ defaults.isCiVisibility = false
550
+ defaults.isEarlyFlakeDetectionEnabled = false
551
+ defaults.isFlakyTestRetriesEnabled = false
552
+ defaults.flakyTestRetriesCount = 5
553
+ defaults.isGCPFunction = false
554
+ defaults.isGitUploadEnabled = false
555
+ defaults.isIntelligentTestRunnerEnabled = false
556
+ defaults.isManualApiEnabled = false
557
+ defaults['langchain.spanCharLimit'] = 128
558
+ defaults['langchain.spanPromptCompletionSampleRate'] = 1
559
+ defaults['llmobs.agentlessEnabled'] = undefined
560
+ defaults['llmobs.enabled'] = false
561
+ defaults['llmobs.mlApp'] = undefined
562
+ defaults.ciVisibilityTestSessionName = ''
563
+ defaults.ciVisAgentlessLogSubmissionEnabled = false
564
+ defaults.legacyBaggageEnabled = true
565
+ defaults.isTestDynamicInstrumentationEnabled = false
566
+ defaults.isServiceUserProvided = false
567
+ defaults.testManagementAttemptToFixRetries = 20
568
+ defaults.isTestManagementEnabled = false
569
+ defaults.isImpactedTestsEnabled = false
570
+ defaults.logInjection = 'structured'
571
+ defaults.lookup = undefined
572
+ defaults.inferredProxyServicesEnabled = false
573
+ defaults.memcachedCommandEnabled = false
574
+ defaults.middlewareTracingEnabled = true
575
+ defaults.openAiLogsEnabled = false
576
+ defaults['openai.spanCharLimit'] = 128
577
+ defaults.peerServiceMapping = {}
578
+ defaults.plugins = true
579
+ defaults.port = '8126'
580
+ defaults['profiling.enabled'] = undefined
581
+ defaults['profiling.exporters'] = 'agent'
582
+ defaults['profiling.sourceMap'] = true
583
+ defaults['profiling.longLivedThreshold'] = undefined
584
+ defaults.protocolVersion = '0.4'
585
+ defaults.queryStringObfuscation = qsRegex
586
+ defaults['remoteConfig.enabled'] = true
587
+ defaults['remoteConfig.pollInterval'] = 5 // seconds
588
+ defaults.reportHostname = false
589
+ defaults['runtimeMetrics.enabled'] = false
590
+ defaults['runtimeMetrics.eventLoop'] = true
591
+ defaults['runtimeMetrics.gc'] = true
592
+ defaults.runtimeMetricsRuntimeId = false
593
+ defaults.sampleRate = undefined
594
+ defaults['sampler.rateLimit'] = 100
595
+ defaults['sampler.rules'] = []
596
+ defaults['sampler.spanSamplingRules'] = []
597
+ defaults.scope = undefined
598
+ defaults.service = service
599
+ defaults.serviceMapping = {}
600
+ defaults.site = 'datadoghq.com'
601
+ defaults.spanAttributeSchema = 'v0'
602
+ defaults.spanComputePeerService = false
603
+ defaults.spanLeakDebug = 0
604
+ defaults.spanRemoveIntegrationFromService = false
605
+ defaults.startupLogs = false
606
+ defaults['stats.enabled'] = false
607
+ defaults.tags = {}
608
+ defaults.tagsHeaderMaxLength = 512
609
+ defaults['telemetry.debug'] = false
610
+ defaults['telemetry.dependencyCollection'] = true
611
+ defaults['telemetry.enabled'] = true
612
+ defaults['telemetry.heartbeatInterval'] = 60_000
613
+ defaults['telemetry.logCollection'] = true
614
+ defaults['telemetry.metrics'] = true
615
+ defaults.traceEnabled = true
616
+ defaults.traceId128BitGenerationEnabled = true
617
+ defaults.traceId128BitLoggingEnabled = true
618
+ defaults.tracePropagationExtractFirst = false
619
+ defaults.tracePropagationBehaviorExtract = 'continue'
620
+ defaults['tracePropagationStyle.inject'] = ['datadog', 'tracecontext', 'baggage']
621
+ defaults['tracePropagationStyle.extract'] = ['datadog', 'tracecontext', 'baggage']
622
+ defaults['tracePropagationStyle.otelPropagators'] = false
623
+ defaults.tracing = true
624
+ defaults.url = undefined
625
+ defaults.version = pkg.version
626
+ defaults.instrumentation_config_id = undefined
627
+ defaults['vertexai.spanCharLimit'] = 128
628
+ defaults['vertexai.spanPromptCompletionSampleRate'] = 1
629
+ defaults['trace.aws.addSpanPointers'] = true
630
+ defaults['trace.dynamoDb.tablePrimaryKeys'] = undefined
631
+ defaults['trace.nativeSpanEvents'] = false
596
632
  }
597
633
 
598
634
  _applyLocalStableConfig () {
@@ -629,7 +665,7 @@ class Config {
629
665
  this._setBoolean(obj, 'logInjection', DD_LOGS_INJECTION)
630
666
  const profilingEnabled = normalizeProfilingEnabledValue(DD_PROFILING_ENABLED)
631
667
  this._setString(obj, 'profiling.enabled', profilingEnabled)
632
- this._setBoolean(obj, 'runtimeMetrics', DD_RUNTIME_METRICS_ENABLED)
668
+ this._setBoolean(obj, 'runtimeMetrics.enabled', DD_RUNTIME_METRICS_ENABLED)
633
669
  this._setString(obj, 'service', DD_SERVICE)
634
670
  this._setString(obj, 'version', DD_VERSION)
635
671
  }
@@ -670,6 +706,7 @@ class Config {
670
706
  DD_DYNAMIC_INSTRUMENTATION_ENABLED,
671
707
  DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS,
672
708
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS,
709
+ DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS,
673
710
  DD_ENV,
674
711
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED,
675
712
  DD_PROFILING_ENABLED,
@@ -689,6 +726,7 @@ class Config {
689
726
  DD_IAST_TELEMETRY_VERBOSITY,
690
727
  DD_IAST_STACK_TRACE_ENABLED,
691
728
  DD_INJECTION_ENABLED,
729
+ DD_INJECT_FORCE,
692
730
  DD_INSTRUMENTATION_TELEMETRY_ENABLED,
693
731
  DD_INSTRUMENTATION_CONFIG_ID,
694
732
  DD_LOGS_INJECTION,
@@ -705,6 +743,8 @@ class Config {
705
743
  DD_REMOTE_CONFIGURATION_ENABLED,
706
744
  DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS,
707
745
  DD_RUNTIME_METRICS_ENABLED,
746
+ DD_RUNTIME_METRICS_EVENT_LOOP_ENABLED,
747
+ DD_RUNTIME_METRICS_GC_ENABLED,
708
748
  DD_SERVICE,
709
749
  DD_SERVICE_MAPPING,
710
750
  DD_SITE,
@@ -730,7 +770,7 @@ class Config {
730
770
  DD_TRACE_ENABLED,
731
771
  DD_TRACE_EXPERIMENTAL_EXPORTER,
732
772
  DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED,
733
- DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED,
773
+ DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED,
734
774
  DD_TRACE_GIT_METADATA_ENABLED,
735
775
  DD_TRACE_GLOBAL_TAGS,
736
776
  DD_TRACE_GRAPHQL_ERROR_EXTENSIONS,
@@ -785,11 +825,11 @@ class Config {
785
825
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED)
786
826
  ))
787
827
  this._setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
788
- this._setValue(env, 'appsec.apiSecurity.sampleDelay', maybeFloat(DD_API_SECURITY_SAMPLE_DELAY))
789
- this._setValue(env, 'appsec.blockedTemplateGraphql', maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON))
790
- this._setValue(env, 'appsec.blockedTemplateHtml', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML))
828
+ env['appsec.apiSecurity.sampleDelay'] = maybeFloat(DD_API_SECURITY_SAMPLE_DELAY)
829
+ env['appsec.blockedTemplateGraphql'] = maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON)
830
+ env['appsec.blockedTemplateHtml'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML)
791
831
  this._envUnprocessed['appsec.blockedTemplateHtml'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML
792
- this._setValue(env, 'appsec.blockedTemplateJson', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON))
832
+ env['appsec.blockedTemplateJson'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON)
793
833
  this._envUnprocessed['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
794
834
  this._setBoolean(env, 'appsec.enabled', DD_APPSEC_ENABLED)
795
835
  this._setString(env, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
@@ -799,27 +839,27 @@ class Config {
799
839
  'appsec.extendedHeadersCollection.redaction',
800
840
  DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED
801
841
  )
802
- this._setValue(env, 'appsec.extendedHeadersCollection.maxHeaders', maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS))
842
+ env['appsec.extendedHeadersCollection.maxHeaders'] = maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS)
803
843
  this._envUnprocessed['appsec.extendedHeadersCollection.maxHeaders'] = DD_APPSEC_MAX_COLLECTED_HEADERS
804
844
  this._setString(env, 'appsec.obfuscatorKeyRegex', DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP)
805
845
  this._setString(env, 'appsec.obfuscatorValueRegex', DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP)
806
846
  this._setBoolean(env, 'appsec.rasp.enabled', DD_APPSEC_RASP_ENABLED)
807
847
  this._setBoolean(env, 'appsec.rasp.bodyCollection', DD_APPSEC_RASP_COLLECT_REQUEST_BODY)
808
- this._setValue(env, 'appsec.rateLimit', maybeInt(DD_APPSEC_TRACE_RATE_LIMIT))
848
+ env['appsec.rateLimit'] = maybeInt(DD_APPSEC_TRACE_RATE_LIMIT)
809
849
  this._envUnprocessed['appsec.rateLimit'] = DD_APPSEC_TRACE_RATE_LIMIT
810
850
  this._setString(env, 'appsec.rules', DD_APPSEC_RULES)
811
851
  // DD_APPSEC_SCA_ENABLED is never used locally, but only sent to the backend
812
852
  this._setBoolean(env, 'appsec.sca.enabled', DD_APPSEC_SCA_ENABLED)
813
853
  this._setBoolean(env, 'appsec.stackTrace.enabled', DD_APPSEC_STACK_TRACE_ENABLED)
814
- this._setValue(env, 'appsec.stackTrace.maxDepth', maybeInt(DD_APPSEC_MAX_STACK_TRACE_DEPTH))
854
+ env['appsec.stackTrace.maxDepth'] = maybeInt(DD_APPSEC_MAX_STACK_TRACE_DEPTH)
815
855
  this._envUnprocessed['appsec.stackTrace.maxDepth'] = DD_APPSEC_MAX_STACK_TRACE_DEPTH
816
- this._setValue(env, 'appsec.stackTrace.maxStackTraces', maybeInt(DD_APPSEC_MAX_STACK_TRACES))
856
+ env['appsec.stackTrace.maxStackTraces'] = maybeInt(DD_APPSEC_MAX_STACK_TRACES)
817
857
  this._envUnprocessed['appsec.stackTrace.maxStackTraces'] = DD_APPSEC_MAX_STACK_TRACES
818
- this._setValue(env, 'appsec.wafTimeout', maybeInt(DD_APPSEC_WAF_TIMEOUT))
858
+ env['appsec.wafTimeout'] = maybeInt(DD_APPSEC_WAF_TIMEOUT)
819
859
  this._envUnprocessed['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
820
- this._setValue(env, 'baggageMaxBytes', DD_TRACE_BAGGAGE_MAX_BYTES)
821
- this._setValue(env, 'baggageMaxItems', DD_TRACE_BAGGAGE_MAX_ITEMS)
822
- this._setValue(env, 'baggageTagKeys', DD_TRACE_BAGGAGE_TAG_KEYS)
860
+ env.baggageMaxBytes = DD_TRACE_BAGGAGE_MAX_BYTES
861
+ env.baggageMaxItems = DD_TRACE_BAGGAGE_MAX_ITEMS
862
+ env.baggageTagKeys = DD_TRACE_BAGGAGE_TAG_KEYS
823
863
  this._setBoolean(env, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
824
864
  this._setString(env, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
825
865
  this._setBoolean(env, 'crashtracking.enabled', coalesce(
@@ -843,44 +883,44 @@ class Config {
843
883
  'dynamicInstrumentation.redactionExcludedIdentifiers',
844
884
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS
845
885
  )
886
+ env['dynamicInstrumentation.uploadIntervalSeconds'] = maybeFloat(DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS)
887
+ this._envUnprocessed['dynamicInstrumentation.uploadInterval'] = DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS
846
888
  this._setString(env, 'env', DD_ENV || tags.env)
847
889
  this._setBoolean(env, 'traceEnabled', DD_TRACE_ENABLED)
848
890
  this._setBoolean(env, 'experimental.enableGetRumData', DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED)
849
891
  this._setString(env, 'experimental.exporter', DD_TRACE_EXPERIMENTAL_EXPORTER)
850
- this._setBoolean(env, 'experimental.runtimeId', DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED)
851
- if (AWS_LAMBDA_FUNCTION_NAME) this._setValue(env, 'flushInterval', 0)
852
- this._setValue(env, 'flushMinSpans', maybeInt(DD_TRACE_PARTIAL_FLUSH_MIN_SPANS))
892
+ if (AWS_LAMBDA_FUNCTION_NAME) env.flushInterval = 0
893
+ env.flushMinSpans = maybeInt(DD_TRACE_PARTIAL_FLUSH_MIN_SPANS)
853
894
  this._envUnprocessed.flushMinSpans = DD_TRACE_PARTIAL_FLUSH_MIN_SPANS
854
895
  this._setBoolean(env, 'gitMetadataEnabled', DD_TRACE_GIT_METADATA_ENABLED)
855
896
  this._setIntegerRangeSet(env, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
856
897
  this._setIntegerRangeSet(env, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
857
898
  this._setArray(env, 'headerTags', DD_TRACE_HEADER_TAGS)
858
899
  this._setString(env, 'hostname', DD_AGENT_HOST)
859
- this._setValue(env, 'iast.dbRowsToTaint', maybeInt(DD_IAST_DB_ROWS_TO_TAINT))
900
+ env['iast.dbRowsToTaint'] = maybeInt(DD_IAST_DB_ROWS_TO_TAINT)
860
901
  this._setBoolean(env, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
861
902
  this._setBoolean(env, 'iast.enabled', DD_IAST_ENABLED)
862
- this._setValue(env, 'iast.maxConcurrentRequests', maybeInt(DD_IAST_MAX_CONCURRENT_REQUESTS))
903
+ env['iast.maxConcurrentRequests'] = maybeInt(DD_IAST_MAX_CONCURRENT_REQUESTS)
863
904
  this._envUnprocessed['iast.maxConcurrentRequests'] = DD_IAST_MAX_CONCURRENT_REQUESTS
864
- this._setValue(env, 'iast.maxContextOperations', maybeInt(DD_IAST_MAX_CONTEXT_OPERATIONS))
905
+ env['iast.maxContextOperations'] = maybeInt(DD_IAST_MAX_CONTEXT_OPERATIONS)
865
906
  this._envUnprocessed['iast.maxContextOperations'] = DD_IAST_MAX_CONTEXT_OPERATIONS
866
907
  this._setBoolean(env, 'iast.redactionEnabled', DD_IAST_REDACTION_ENABLED && !isFalse(DD_IAST_REDACTION_ENABLED))
867
908
  this._setString(env, 'iast.redactionNamePattern', DD_IAST_REDACTION_NAME_PATTERN)
868
909
  this._setString(env, 'iast.redactionValuePattern', DD_IAST_REDACTION_VALUE_PATTERN)
869
910
  const iastRequestSampling = maybeInt(DD_IAST_REQUEST_SAMPLING)
870
911
  if (iastRequestSampling > -1 && iastRequestSampling < 101) {
871
- this._setValue(env, 'iast.requestSampling', iastRequestSampling)
912
+ env['iast.requestSampling'] = iastRequestSampling
872
913
  }
873
914
  this._envUnprocessed['iast.requestSampling'] = DD_IAST_REQUEST_SAMPLING
874
915
  this._setString(env, 'iast.securityControlsConfiguration', DD_IAST_SECURITY_CONTROLS_CONFIGURATION)
875
916
  this._setString(env, 'iast.telemetryVerbosity', DD_IAST_TELEMETRY_VERBOSITY)
876
917
  this._setBoolean(env, 'iast.stackTrace.enabled', DD_IAST_STACK_TRACE_ENABLED)
877
918
  this._setArray(env, 'injectionEnabled', DD_INJECTION_ENABLED)
919
+ this._setBoolean(env, 'injectForce', DD_INJECT_FORCE)
878
920
  this._setBoolean(env, 'isAzureFunction', getIsAzureFunction())
879
921
  this._setBoolean(env, 'isGCPFunction', getIsGCPFunction())
880
- this._setValue(env, 'langchain.spanCharLimit', maybeInt(DD_LANGCHAIN_SPAN_CHAR_LIMIT))
881
- this._setValue(
882
- env, 'langchain.spanPromptCompletionSampleRate', maybeFloat(DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
883
- )
922
+ env['langchain.spanCharLimit'] = maybeInt(DD_LANGCHAIN_SPAN_CHAR_LIMIT)
923
+ env['langchain.spanPromptCompletionSampleRate'] = maybeFloat(DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
884
924
  this._setBoolean(env, 'legacyBaggageEnabled', DD_TRACE_LEGACY_BAGGAGE_ENABLED)
885
925
  this._setBoolean(env, 'llmobs.agentlessEnabled', DD_LLMOBS_AGENTLESS_ENABLED)
886
926
  this._setBoolean(env, 'llmobs.enabled', DD_LLMOBS_ENABLED)
@@ -890,12 +930,12 @@ class Config {
890
930
  this._setBoolean(env, 'memcachedCommandEnabled', DD_TRACE_MEMCACHED_COMMAND_ENABLED)
891
931
  this._setBoolean(env, 'middlewareTracingEnabled', DD_TRACE_MIDDLEWARE_TRACING_ENABLED)
892
932
  this._setBoolean(env, 'openAiLogsEnabled', DD_OPENAI_LOGS_ENABLED)
893
- this._setValue(env, 'openai.spanCharLimit', maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT))
933
+ env['openai.spanCharLimit'] = maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT)
894
934
  this._envUnprocessed.openaiSpanCharLimit = DD_OPENAI_SPAN_CHAR_LIMIT
895
935
  if (DD_TRACE_PEER_SERVICE_MAPPING) {
896
- this._setValue(env, 'peerServiceMapping', Object.fromEntries(
936
+ env.peerServiceMapping = Object.fromEntries(
897
937
  DD_TRACE_PEER_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
898
- ))
938
+ )
899
939
  this._envUnprocessed.peerServiceMapping = DD_TRACE_PEER_SERVICE_MAPPING
900
940
  }
901
941
  this._setString(env, 'port', DD_TRACE_AGENT_PORT)
@@ -910,7 +950,7 @@ class Config {
910
950
  this._setBoolean(env, 'profiling.sourceMap', DD_PROFILING_SOURCE_MAP && !isFalse(DD_PROFILING_SOURCE_MAP))
911
951
  if (DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD) {
912
952
  // This is only used in testing to not have to wait 30s
913
- this._setValue(env, 'profiling.longLivedThreshold', Number(DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD))
953
+ env['profiling.longLivedThreshold'] = Number(DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD)
914
954
  }
915
955
 
916
956
  this._setString(env, 'protocolVersion', DD_TRACE_AGENT_PROTOCOL_VERSION)
@@ -919,30 +959,33 @@ class Config {
919
959
  DD_REMOTE_CONFIGURATION_ENABLED,
920
960
  !this._isInServerlessEnvironment()
921
961
  ))
922
- this._setValue(env, 'remoteConfig.pollInterval', maybeFloat(DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS))
962
+ env['remoteConfig.pollInterval'] = maybeFloat(DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS)
923
963
  this._envUnprocessed['remoteConfig.pollInterval'] = DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS
924
964
  this._setBoolean(env, 'reportHostname', DD_TRACE_REPORT_HOSTNAME)
925
965
  // only used to explicitly set runtimeMetrics to false
926
966
  const otelSetRuntimeMetrics = String(OTEL_METRICS_EXPORTER).toLowerCase() === 'none'
927
967
  ? false
928
968
  : undefined
929
- this._setBoolean(env, 'runtimeMetrics', DD_RUNTIME_METRICS_ENABLED ||
969
+ this._setBoolean(env, 'runtimeMetrics.enabled', DD_RUNTIME_METRICS_ENABLED ||
930
970
  otelSetRuntimeMetrics)
971
+ this._setBoolean(env, 'runtimeMetrics.eventLoop', DD_RUNTIME_METRICS_EVENT_LOOP_ENABLED)
972
+ this._setBoolean(env, 'runtimeMetrics.gc', DD_RUNTIME_METRICS_GC_ENABLED)
973
+ this._setBoolean(env, 'runtimeMetricsRuntimeId', DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED)
931
974
  this._setArray(env, 'sampler.spanSamplingRules', reformatSpanSamplingRules(coalesce(
932
- safeJsonParse(maybeFile(DD_SPAN_SAMPLING_RULES_FILE)),
975
+ maybeJsonFile(DD_SPAN_SAMPLING_RULES_FILE),
933
976
  safeJsonParse(DD_SPAN_SAMPLING_RULES)
934
977
  )))
935
978
  this._setUnit(env, 'sampleRate', DD_TRACE_SAMPLE_RATE ||
936
979
  getFromOtelSamplerMap(OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG))
937
- this._setValue(env, 'sampler.rateLimit', DD_TRACE_RATE_LIMIT)
980
+ env['sampler.rateLimit'] = DD_TRACE_RATE_LIMIT
938
981
  this._setSamplingRule(env, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
939
982
  this._envUnprocessed['sampler.rules'] = DD_TRACE_SAMPLING_RULES
940
983
  this._setString(env, 'scope', DD_TRACE_SCOPE)
941
984
  this._setString(env, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
942
985
  if (DD_SERVICE_MAPPING) {
943
- this._setValue(env, 'serviceMapping', Object.fromEntries(
986
+ env.serviceMapping = Object.fromEntries(
944
987
  DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
945
- ))
988
+ )
946
989
  }
947
990
  this._setString(env, 'site', DD_SITE)
948
991
  if (DD_TRACE_SPAN_ATTRIBUTE_SCHEMA) {
@@ -950,11 +993,11 @@ class Config {
950
993
  this._envUnprocessed.spanAttributeSchema = DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
951
994
  }
952
995
  // 0: disabled, 1: logging, 2: garbage collection + logging
953
- this._setValue(env, 'spanLeakDebug', maybeInt(DD_TRACE_SPAN_LEAK_DEBUG))
996
+ env.spanLeakDebug = maybeInt(DD_TRACE_SPAN_LEAK_DEBUG)
954
997
  this._setBoolean(env, 'spanRemoveIntegrationFromService', DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED)
955
998
  this._setBoolean(env, 'startupLogs', DD_TRACE_STARTUP_LOGS)
956
999
  this._setTags(env, 'tags', tags)
957
- this._setValue(env, 'tagsHeaderMaxLength', DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH)
1000
+ env.tagsHeaderMaxLength = DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH
958
1001
  this._setBoolean(env, 'telemetry.enabled', coalesce(
959
1002
  DD_INSTRUMENTATION_TELEMETRY_ENABLED,
960
1003
  !(this._isInServerlessEnvironment() || JEST_WORKER_ID)
@@ -962,7 +1005,7 @@ class Config {
962
1005
  this._setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
963
1006
  this._setBoolean(env, 'telemetry.debug', DD_TELEMETRY_DEBUG)
964
1007
  this._setBoolean(env, 'telemetry.dependencyCollection', DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED)
965
- this._setValue(env, 'telemetry.heartbeatInterval', maybeInt(Math.floor(DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000)))
1008
+ env['telemetry.heartbeatInterval'] = maybeInt(Math.floor(DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000))
966
1009
  this._envUnprocessed['telemetry.heartbeatInterval'] = DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000
967
1010
  this._setBoolean(env, 'telemetry.logCollection', DD_TELEMETRY_LOG_COLLECTION_ENABLED)
968
1011
  this._setBoolean(env, 'telemetry.metrics', DD_TELEMETRY_METRICS_ENABLED)
@@ -970,10 +1013,10 @@ class Config {
970
1013
  this._setBoolean(env, 'traceId128BitLoggingEnabled', DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED)
971
1014
  this._setBoolean(env, 'tracePropagationExtractFirst', DD_TRACE_PROPAGATION_EXTRACT_FIRST)
972
1015
  const stringPropagationBehaviorExtract = String(DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT)
973
- this._setValue(env, 'tracePropagationBehaviorExtract',
1016
+ env.tracePropagationBehaviorExtract =
974
1017
  VALID_PROPAGATION_BEHAVIOR_EXTRACT.has(stringPropagationBehaviorExtract)
975
1018
  ? stringPropagationBehaviorExtract
976
- : 'continue')
1019
+ : 'continue'
977
1020
  this._setBoolean(env, 'tracePropagationStyle.otelPropagators',
978
1021
  DD_TRACE_PROPAGATION_STYLE ||
979
1022
  DD_TRACE_PROPAGATION_STYLE_INJECT ||
@@ -987,12 +1030,8 @@ class Config {
987
1030
  this._setString(env, 'trace.dynamoDb.tablePrimaryKeys', DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS)
988
1031
  this._setArray(env, 'graphqlErrorExtensions', DD_TRACE_GRAPHQL_ERROR_EXTENSIONS)
989
1032
  this._setBoolean(env, 'trace.nativeSpanEvents', DD_TRACE_NATIVE_SPAN_EVENTS)
990
- this._setValue(
991
- env,
992
- 'vertexai.spanPromptCompletionSampleRate',
993
- maybeFloat(DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
994
- )
995
- this._setValue(env, 'vertexai.spanCharLimit', maybeInt(DD_VERTEXAI_SPAN_CHAR_LIMIT))
1033
+ env['vertexai.spanPromptCompletionSampleRate'] = maybeFloat(DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
1034
+ env['vertexai.spanCharLimit'] = maybeInt(DD_VERTEXAI_SPAN_CHAR_LIMIT)
996
1035
  }
997
1036
 
998
1037
  _applyOptions (options) {
@@ -1009,10 +1048,10 @@ class Config {
1009
1048
  options.experimental?.appsec?.standalone && !options.experimental.appsec.standalone.enabled
1010
1049
  ))
1011
1050
  this._setBoolean(opts, 'appsec.apiSecurity.enabled', options.appsec?.apiSecurity?.enabled)
1012
- this._setValue(opts, 'appsec.blockedTemplateGraphql', maybeFile(options.appsec?.blockedTemplateGraphql))
1013
- this._setValue(opts, 'appsec.blockedTemplateHtml', maybeFile(options.appsec?.blockedTemplateHtml))
1051
+ opts['appsec.blockedTemplateGraphql'] = maybeFile(options.appsec?.blockedTemplateGraphql)
1052
+ opts['appsec.blockedTemplateHtml'] = maybeFile(options.appsec?.blockedTemplateHtml)
1014
1053
  this._optsUnprocessed['appsec.blockedTemplateHtml'] = options.appsec?.blockedTemplateHtml
1015
- this._setValue(opts, 'appsec.blockedTemplateJson', maybeFile(options.appsec?.blockedTemplateJson))
1054
+ opts['appsec.blockedTemplateJson'] = maybeFile(options.appsec?.blockedTemplateJson)
1016
1055
  this._optsUnprocessed['appsec.blockedTemplateJson'] = options.appsec?.blockedTemplateJson
1017
1056
  this._setBoolean(opts, 'appsec.enabled', options.appsec?.enabled)
1018
1057
  this._setString(opts, 'appsec.eventTracking.mode', options.appsec?.eventTracking?.mode)
@@ -1026,29 +1065,26 @@ class Config {
1026
1065
  'appsec.extendedHeadersCollection.redaction',
1027
1066
  options.appsec?.extendedHeadersCollection?.redaction
1028
1067
  )
1029
- this._setValue(opts,
1030
- 'appsec.extendedHeadersCollection.maxHeaders',
1031
- options.appsec?.extendedHeadersCollection?.maxHeaders
1032
- )
1068
+ opts['appsec.extendedHeadersCollection.maxHeaders'] = options.appsec?.extendedHeadersCollection?.maxHeaders
1033
1069
  this._setString(opts, 'appsec.obfuscatorKeyRegex', options.appsec?.obfuscatorKeyRegex)
1034
1070
  this._setString(opts, 'appsec.obfuscatorValueRegex', options.appsec?.obfuscatorValueRegex)
1035
1071
  this._setBoolean(opts, 'appsec.rasp.enabled', options.appsec?.rasp?.enabled)
1036
1072
  this._setBoolean(opts, 'appsec.rasp.bodyCollection', options.appsec?.rasp?.bodyCollection)
1037
- this._setValue(opts, 'appsec.rateLimit', maybeInt(options.appsec?.rateLimit))
1073
+ opts['appsec.rateLimit'] = maybeInt(options.appsec?.rateLimit)
1038
1074
  this._optsUnprocessed['appsec.rateLimit'] = options.appsec?.rateLimit
1039
1075
  this._setString(opts, 'appsec.rules', options.appsec?.rules)
1040
1076
  this._setBoolean(opts, 'appsec.stackTrace.enabled', options.appsec?.stackTrace?.enabled)
1041
- this._setValue(opts, 'appsec.stackTrace.maxDepth', maybeInt(options.appsec?.stackTrace?.maxDepth))
1077
+ opts['appsec.stackTrace.maxDepth'] = maybeInt(options.appsec?.stackTrace?.maxDepth)
1042
1078
  this._optsUnprocessed['appsec.stackTrace.maxDepth'] = options.appsec?.stackTrace?.maxDepth
1043
- this._setValue(opts, 'appsec.stackTrace.maxStackTraces', maybeInt(options.appsec?.stackTrace?.maxStackTraces))
1079
+ opts['appsec.stackTrace.maxStackTraces'] = maybeInt(options.appsec?.stackTrace?.maxStackTraces)
1044
1080
  this._optsUnprocessed['appsec.stackTrace.maxStackTraces'] = options.appsec?.stackTrace?.maxStackTraces
1045
- this._setValue(opts, 'appsec.wafTimeout', maybeInt(options.appsec?.wafTimeout))
1081
+ opts['appsec.wafTimeout'] = maybeInt(options.appsec?.wafTimeout)
1046
1082
  this._optsUnprocessed['appsec.wafTimeout'] = options.appsec?.wafTimeout
1047
1083
  this._setBoolean(opts, 'clientIpEnabled', options.clientIpEnabled)
1048
1084
  this._setString(opts, 'clientIpHeader', options.clientIpHeader?.toLowerCase())
1049
- this._setValue(opts, 'baggageMaxBytes', options.baggageMaxBytes)
1050
- this._setValue(opts, 'baggageMaxItems', options.baggageMaxItems)
1051
- this._setValue(opts, 'baggageTagKeys', options.baggageTagKeys)
1085
+ opts.baggageMaxBytes = options.baggageMaxBytes
1086
+ opts.baggageMaxItems = options.baggageMaxItems
1087
+ opts.baggageTagKeys = options.baggageTagKeys
1052
1088
  this._setBoolean(opts, 'codeOriginForSpans.enabled', options.codeOriginForSpans?.enabled)
1053
1089
  this._setBoolean(
1054
1090
  opts,
@@ -1072,45 +1108,51 @@ class Config {
1072
1108
  'dynamicInstrumentation.redactionExcludedIdentifiers',
1073
1109
  options.dynamicInstrumentation?.redactionExcludedIdentifiers
1074
1110
  )
1111
+ opts['dynamicInstrumentation.uploadIntervalSeconds'] =
1112
+ maybeFloat(options.dynamicInstrumentation?.uploadIntervalSeconds)
1113
+ this._optsUnprocessed['dynamicInstrumentation.uploadIntervalSeconds'] =
1114
+ options.dynamicInstrumentation?.uploadIntervalSeconds
1075
1115
  this._setString(opts, 'env', options.env || tags.env)
1076
1116
  this._setBoolean(opts, 'experimental.enableGetRumData', options.experimental?.enableGetRumData)
1077
1117
  this._setString(opts, 'experimental.exporter', options.experimental?.exporter)
1078
- this._setBoolean(opts, 'experimental.runtimeId', options.experimental?.runtimeId)
1079
- this._setValue(opts, 'flushInterval', maybeInt(options.flushInterval))
1118
+ this._setBoolean(opts, 'runtimeMetricsRuntimeId', options.runtimeMetricsRuntimeId)
1119
+ opts.flushInterval = maybeInt(options.flushInterval)
1080
1120
  this._optsUnprocessed.flushInterval = options.flushInterval
1081
- this._setValue(opts, 'flushMinSpans', maybeInt(options.flushMinSpans))
1121
+ opts.flushMinSpans = maybeInt(options.flushMinSpans)
1082
1122
  this._optsUnprocessed.flushMinSpans = options.flushMinSpans
1083
1123
  this._setArray(opts, 'headerTags', options.headerTags)
1084
1124
  this._setString(opts, 'hostname', options.hostname)
1085
- this._setValue(opts, 'iast.dbRowsToTaint', maybeInt(options.iast?.dbRowsToTaint))
1125
+ opts['iast.dbRowsToTaint'] = maybeInt(options.iast?.dbRowsToTaint)
1086
1126
  this._setBoolean(opts, 'iast.deduplicationEnabled', options.iast && options.iast.deduplicationEnabled)
1087
1127
  this._setBoolean(opts, 'iast.enabled',
1088
1128
  options.iast && (options.iast === true || options.iast.enabled === true))
1089
- this._setValue(opts, 'iast.maxConcurrentRequests',
1090
- maybeInt(options.iast?.maxConcurrentRequests))
1129
+ opts['iast.maxConcurrentRequests'] = maybeInt(options.iast?.maxConcurrentRequests)
1091
1130
  this._optsUnprocessed['iast.maxConcurrentRequests'] = options.iast?.maxConcurrentRequests
1092
- this._setValue(opts, 'iast.maxContextOperations', maybeInt(options.iast?.maxContextOperations))
1131
+ opts['iast.maxContextOperations'] = maybeInt(options.iast?.maxContextOperations)
1093
1132
  this._optsUnprocessed['iast.maxContextOperations'] = options.iast?.maxContextOperations
1094
1133
  this._setBoolean(opts, 'iast.redactionEnabled', options.iast?.redactionEnabled)
1095
1134
  this._setString(opts, 'iast.redactionNamePattern', options.iast?.redactionNamePattern)
1096
1135
  this._setString(opts, 'iast.redactionValuePattern', options.iast?.redactionValuePattern)
1097
1136
  const iastRequestSampling = maybeInt(options.iast?.requestSampling)
1098
1137
  if (iastRequestSampling > -1 && iastRequestSampling < 101) {
1099
- this._setValue(opts, 'iast.requestSampling', iastRequestSampling)
1138
+ opts['iast.requestSampling'] = iastRequestSampling
1100
1139
  this._optsUnprocessed['iast.requestSampling'] = options.iast?.requestSampling
1101
1140
  }
1102
- this._setValue(opts, 'iast.securityControlsConfiguration', options.iast?.securityControlsConfiguration)
1141
+ opts['iast.securityControlsConfiguration'] = options.iast?.securityControlsConfiguration
1103
1142
  this._setBoolean(opts, 'iast.stackTrace.enabled', options.iast?.stackTrace?.enabled)
1104
1143
  this._setString(opts, 'iast.telemetryVerbosity', options.iast && options.iast.telemetryVerbosity)
1144
+ if (options[INSTRUMENTED_BY_SSI]) {
1145
+ this._setString(opts, 'instrumentationSource', options[INSTRUMENTED_BY_SSI])
1146
+ }
1105
1147
  this._setBoolean(opts, 'isCiVisibility', options.isCiVisibility)
1106
1148
  this._setBoolean(opts, 'legacyBaggageEnabled', options.legacyBaggageEnabled)
1107
1149
  this._setBoolean(opts, 'llmobs.agentlessEnabled', options.llmobs?.agentlessEnabled)
1108
1150
  this._setString(opts, 'llmobs.mlApp', options.llmobs?.mlApp)
1109
1151
  this._setBoolean(opts, 'logInjection', options.logInjection)
1110
- this._setValue(opts, 'lookup', options.lookup)
1152
+ opts.lookup = options.lookup
1111
1153
  this._setBoolean(opts, 'middlewareTracingEnabled', options.middlewareTracingEnabled)
1112
1154
  this._setBoolean(opts, 'openAiLogsEnabled', options.openAiLogsEnabled)
1113
- this._setValue(opts, 'peerServiceMapping', options.peerServiceMapping)
1155
+ opts.peerServiceMapping = options.peerServiceMapping
1114
1156
  this._setBoolean(opts, 'plugins', options.plugins)
1115
1157
  this._setString(opts, 'port', options.port)
1116
1158
  const strProfiling = String(options.profiling)
@@ -1119,18 +1161,21 @@ class Config {
1119
1161
  }
1120
1162
  this._setString(opts, 'protocolVersion', options.protocolVersion)
1121
1163
  if (options.remoteConfig) {
1122
- this._setValue(opts, 'remoteConfig.pollInterval', maybeFloat(options.remoteConfig.pollInterval))
1164
+ opts['remoteConfig.pollInterval'] = maybeFloat(options.remoteConfig.pollInterval)
1123
1165
  this._optsUnprocessed['remoteConfig.pollInterval'] = options.remoteConfig.pollInterval
1124
1166
  }
1125
1167
  this._setBoolean(opts, 'reportHostname', options.reportHostname)
1126
- this._setBoolean(opts, 'runtimeMetrics', options.runtimeMetrics)
1168
+ this._setBoolean(opts, 'runtimeMetrics.enabled', options.runtimeMetrics?.enabled)
1169
+ this._setBoolean(opts, 'runtimeMetrics.eventLoop', options.runtimeMetrics?.eventLoop)
1170
+ this._setBoolean(opts, 'runtimeMetrics.gc', options.runtimeMetrics?.gc?.enabled)
1171
+ this._setBoolean(opts, 'runtimeMetricsRuntimeId', options.runtimeMetricsRuntimeId)
1127
1172
  this._setArray(opts, 'sampler.spanSamplingRules', reformatSpanSamplingRules(options.spanSamplingRules))
1128
1173
  this._setUnit(opts, 'sampleRate', coalesce(options.sampleRate, options.ingestion.sampleRate))
1129
1174
  const ingestion = options.ingestion || {}
1130
- this._setValue(opts, 'sampler.rateLimit', coalesce(options.rateLimit, ingestion.rateLimit))
1175
+ opts['sampler.rateLimit'] = coalesce(options.rateLimit, ingestion.rateLimit)
1131
1176
  this._setSamplingRule(opts, 'sampler.rules', options.samplingRules)
1132
1177
  this._setString(opts, 'service', options.service || tags.service)
1133
- this._setValue(opts, 'serviceMapping', options.serviceMapping)
1178
+ opts.serviceMapping = options.serviceMapping
1134
1179
  this._setString(opts, 'site', options.site)
1135
1180
  if (options.spanAttributeSchema) {
1136
1181
  this._setString(opts, 'spanAttributeSchema', validateNamingVersion(options.spanAttributeSchema))
@@ -1261,17 +1306,15 @@ class Config {
1261
1306
  DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED
1262
1307
  } = getEnvironmentVariables()
1263
1308
 
1264
- if (DD_CIVISIBILITY_AGENTLESS_URL) {
1265
- this._setValue(calc, 'url', new URL(DD_CIVISIBILITY_AGENTLESS_URL))
1266
- } else {
1267
- this._setValue(calc, 'url', getAgentUrl(this._getTraceAgentUrl(), this._optionsArg))
1268
- }
1309
+ calc.url = DD_CIVISIBILITY_AGENTLESS_URL
1310
+ ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1311
+ : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1269
1312
  if (this._isCiVisibility()) {
1270
1313
  this._setBoolean(calc, 'isEarlyFlakeDetectionEnabled',
1271
1314
  coalesce(DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED, true))
1272
1315
  this._setBoolean(calc, 'isFlakyTestRetriesEnabled',
1273
1316
  coalesce(DD_CIVISIBILITY_FLAKY_RETRY_ENABLED, true))
1274
- this._setValue(calc, 'flakyTestRetriesCount', coalesce(maybeInt(DD_CIVISIBILITY_FLAKY_RETRY_COUNT), 5))
1317
+ calc.flakyTestRetriesCount = coalesce(maybeInt(DD_CIVISIBILITY_FLAKY_RETRY_COUNT), 5)
1275
1318
  this._setBoolean(calc, 'isIntelligentTestRunnerEnabled', isTrue(this._isCiVisibilityItrEnabled()))
1276
1319
  this._setBoolean(calc, 'isManualApiEnabled', !isFalse(this._isCiVisibilityManualApiEnabled()))
1277
1320
  this._setString(calc, 'ciVisibilityTestSessionName', DD_TEST_SESSION_NAME)
@@ -1279,26 +1322,23 @@ class Config {
1279
1322
  this._setBoolean(calc, 'isTestDynamicInstrumentationEnabled', !isFalse(DD_TEST_FAILED_TEST_REPLAY_ENABLED))
1280
1323
  this._setBoolean(calc, 'isServiceUserProvided', !!this._env.service)
1281
1324
  this._setBoolean(calc, 'isTestManagementEnabled', !isFalse(DD_TEST_MANAGEMENT_ENABLED))
1282
- this._setValue(calc,
1283
- 'testManagementAttemptToFixRetries',
1284
- coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20)
1285
- )
1325
+ calc.testManagementAttemptToFixRetries = coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20)
1286
1326
  this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED))
1287
1327
  }
1288
- this._setString(calc, 'dogstatsd.hostname', this._getHostname())
1328
+ calc['dogstatsd.hostname'] = this._getHostname()
1289
1329
  this._setBoolean(calc, 'isGitUploadEnabled',
1290
1330
  calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled()))
1291
1331
  this._setBoolean(calc, 'spanComputePeerService', this._getSpanComputePeerService())
1292
1332
  this._setBoolean(calc, 'stats.enabled', this._isTraceStatsComputationEnabled())
1293
1333
  const defaultPropagationStyle = this._getDefaultPropagationStyle(this._optionsArg)
1294
- this._setValue(calc, 'tracePropagationStyle.inject', propagationStyle(
1334
+ calc['tracePropagationStyle.inject'] = propagationStyle(
1295
1335
  'inject',
1296
1336
  this._optionsArg.tracePropagationStyle
1297
- ))
1298
- this._setValue(calc, 'tracePropagationStyle.extract', propagationStyle(
1337
+ )
1338
+ calc['tracePropagationStyle.extract'] = propagationStyle(
1299
1339
  'extract',
1300
1340
  this._optionsArg.tracePropagationStyle
1301
- ))
1341
+ )
1302
1342
  if (defaultPropagationStyle.length > 2) {
1303
1343
  calc['tracePropagationStyle.inject'] = calc['tracePropagationStyle.inject'] || defaultPropagationStyle
1304
1344
  calc['tracePropagationStyle.extract'] = calc['tracePropagationStyle.extract'] || defaultPropagationStyle
@@ -1320,7 +1360,7 @@ class Config {
1320
1360
 
1321
1361
  this._setUnit(opts, 'sampleRate', options.tracing_sampling_rate)
1322
1362
  this._setBoolean(opts, 'logInjection', options.log_injection_enabled)
1323
- this._setArray(opts, 'headerTags', headerTags)
1363
+ opts.headerTags = headerTags
1324
1364
  this._setTags(opts, 'tags', tags)
1325
1365
  this._setBoolean(opts, 'tracing', options.tracing_enabled)
1326
1366
  this._remoteUnprocessed['sampler.rules'] = options.tracing_sampling_rules
@@ -1342,30 +1382,32 @@ class Config {
1342
1382
 
1343
1383
  _setBoolean (obj, name, value) {
1344
1384
  if (value === undefined || value === null) {
1345
- this._setValue(obj, name, value)
1385
+ obj[name] = value
1346
1386
  } else if (isTrue(value)) {
1347
- this._setValue(obj, name, true)
1387
+ obj[name] = true
1348
1388
  } else if (isFalse(value)) {
1349
- this._setValue(obj, name, false)
1389
+ obj[name] = false
1350
1390
  }
1351
1391
  }
1352
1392
 
1353
1393
  _setUnit (obj, name, value) {
1354
1394
  if (value === null || value === undefined) {
1355
- return this._setValue(obj, name, value)
1395
+ obj[name] = value
1396
+ return
1356
1397
  }
1357
1398
 
1358
1399
  value = Number.parseFloat(value)
1359
1400
 
1360
1401
  if (!Number.isNaN(value)) {
1361
1402
  // TODO: Ignore out of range values instead of normalizing them.
1362
- this._setValue(obj, name, Math.min(Math.max(value, 0), 1))
1403
+ obj[name] = Math.min(Math.max(value, 0), 1)
1363
1404
  }
1364
1405
  }
1365
1406
 
1366
1407
  _setArray (obj, name, value) {
1367
1408
  if (value == null) {
1368
- return this._setValue(obj, name, null)
1409
+ obj[name] = null
1410
+ return
1369
1411
  }
1370
1412
 
1371
1413
  if (typeof value === 'string') {
@@ -1377,13 +1419,14 @@ class Config {
1377
1419
  }
1378
1420
 
1379
1421
  if (Array.isArray(value)) {
1380
- this._setValue(obj, name, value)
1422
+ obj[name] = value
1381
1423
  }
1382
1424
  }
1383
1425
 
1384
1426
  _setIntegerRangeSet (obj, name, value) {
1385
1427
  if (value == null) {
1386
- return this._setValue(obj, name, null)
1428
+ obj[name] = null
1429
+ return
1387
1430
  }
1388
1431
  value = value.split(',')
1389
1432
  const result = []
@@ -1398,12 +1441,13 @@ class Config {
1398
1441
  result.push(Number(val))
1399
1442
  }
1400
1443
  })
1401
- this._setValue(obj, name, result)
1444
+ obj[name] = result
1402
1445
  }
1403
1446
 
1404
1447
  _setSamplingRule (obj, name, value) {
1405
1448
  if (value == null) {
1406
- return this._setValue(obj, name, null)
1449
+ obj[name] = null
1450
+ return
1407
1451
  }
1408
1452
 
1409
1453
  if (typeof value === 'string') {
@@ -1416,7 +1460,7 @@ class Config {
1416
1460
  sample_rate: 'sampleRate'
1417
1461
  })
1418
1462
  })
1419
- this._setValue(obj, name, value)
1463
+ obj[name] = value
1420
1464
  }
1421
1465
  }
1422
1466
 
@@ -1426,37 +1470,31 @@ class Config {
1426
1470
 
1427
1471
  _setTags (obj, name, value) {
1428
1472
  if (!value || Object.keys(value).length === 0) {
1429
- return this._setValue(obj, name, null)
1473
+ obj[name] = null
1474
+ return
1430
1475
  }
1431
1476
 
1432
- this._setValue(obj, name, value)
1433
- }
1434
-
1435
- _setValue (obj, name, value) {
1436
1477
  obj[name] = value
1437
1478
  }
1438
1479
 
1439
- _getContainersAndOriginsOrdered () {
1440
- const containers = [
1441
- this._remote,
1442
- this._options,
1443
- this._fleetStableConfig,
1444
- this._env,
1445
- this._localStableConfig,
1446
- this._calculated,
1447
- this._defaults
1448
- ]
1449
- const origins = [
1450
- 'remote_config',
1451
- 'code',
1452
- 'fleet_stable_config',
1453
- 'env_var',
1454
- 'local_stable_config',
1455
- 'calculated',
1456
- 'default'
1457
- ]
1458
-
1459
- return { containers, origins }
1480
+ _setAndTrackChange ({ name, value, origin, unprocessedValue, changes }) {
1481
+ set(this, name, value)
1482
+
1483
+ if (!changeTracker[name]) {
1484
+ changeTracker[name] = {}
1485
+ }
1486
+
1487
+ const originExists = origin in changeTracker[name]
1488
+ const oldValue = changeTracker[name][origin]
1489
+
1490
+ if (!originExists || oldValue !== value) {
1491
+ changeTracker[name][origin] = value
1492
+ changes.push({
1493
+ name,
1494
+ value: unprocessedValue || value,
1495
+ origin
1496
+ })
1497
+ }
1460
1498
  }
1461
1499
 
1462
1500
  // TODO: Report origin changes and errors to telemetry.
@@ -1465,51 +1503,35 @@ class Config {
1465
1503
  // for telemetry reporting, `name`s in `containers` need to be keys from:
1466
1504
  // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1467
1505
  _merge () {
1468
- const { containers, origins } = this._getContainersAndOriginsOrdered()
1469
- const unprocessedValues = [
1470
- this._remoteUnprocessed,
1471
- this._optsUnprocessed,
1472
- {},
1473
- this._envUnprocessed,
1474
- {},
1475
- {},
1476
- {}
1477
- ]
1478
1506
  const changes = []
1479
1507
 
1480
1508
  for (const name in this._defaults) {
1481
- for (let i = 0; i < containers.length; i++) {
1482
- const container = containers[i]
1509
+ // Use reverse order for merge (lowest priority first)
1510
+ for (let i = sourcesOrder.length - 1; i >= 0; i--) {
1511
+ const { containerProperty, origin, unprocessedProperty } = sourcesOrder[i]
1512
+ const container = this[containerProperty]
1483
1513
  const value = container[name]
1484
-
1485
- if ((value !== null && value !== undefined) || container === this._defaults) {
1486
- if (get(this, name) === value && has(this, name)) break
1487
-
1488
- set(this, name, value)
1489
-
1490
- changes.push({
1514
+ if (value != null || container === this._defaults) {
1515
+ this._setAndTrackChange({
1491
1516
  name,
1492
- value: unprocessedValues[i][name] || value,
1493
- origin: origins[i]
1517
+ value,
1518
+ origin,
1519
+ unprocessedValue: unprocessedProperty === undefined ? undefined : this[unprocessedProperty][name],
1520
+ changes
1494
1521
  })
1495
-
1496
- break
1497
1522
  }
1498
1523
  }
1499
1524
  }
1500
-
1501
1525
  this.sampler.sampleRate = this.sampleRate
1502
1526
  updateConfig(changes, this)
1503
1527
  }
1504
1528
 
1505
1529
  getOrigin (name) {
1506
- const { containers, origins } = this._getContainersAndOriginsOrdered()
1507
-
1508
- for (let i = 0; i < containers.length; i++) {
1509
- const container = containers[i]
1530
+ for (const { containerProperty, origin } of sourcesOrder) {
1531
+ const container = this[containerProperty]
1510
1532
  const value = container[name]
1511
1533
  if (value != null || container === this._defaults) {
1512
- return origins[i]
1534
+ return origin
1513
1535
  }
1514
1536
  }
1515
1537
  }