dd-trace 5.74.0 → 5.76.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 (38) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/ci/init.js +1 -0
  3. package/index.d.ts +11 -7
  4. package/loader-hook.mjs +52 -1
  5. package/package.json +7 -18
  6. package/packages/datadog-esbuild/index.js +1 -0
  7. package/packages/datadog-instrumentations/src/cookie-parser.js +0 -2
  8. package/packages/datadog-instrumentations/src/cucumber.js +2 -2
  9. package/packages/datadog-instrumentations/src/express-session.js +0 -1
  10. package/packages/datadog-instrumentations/src/mariadb.js +9 -7
  11. package/packages/datadog-instrumentations/src/openai.js +8 -0
  12. package/packages/datadog-instrumentations/src/playwright.js +163 -37
  13. package/packages/datadog-instrumentations/src/vitest.js +138 -20
  14. package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
  15. package/packages/datadog-plugin-openai/src/stream-helpers.js +26 -1
  16. package/packages/datadog-plugin-openai/src/tracing.js +46 -1
  17. package/packages/datadog-plugin-playwright/src/index.js +74 -31
  18. package/packages/datadog-plugin-vitest/src/index.js +5 -1
  19. package/packages/datadog-shimmer/src/shimmer.js +2 -0
  20. package/packages/dd-trace/src/aiguard/sdk.js +25 -3
  21. package/packages/dd-trace/src/aiguard/tags.js +4 -1
  22. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +6 -0
  23. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +30 -7
  24. package/packages/dd-trace/src/config-helper.js +1 -0
  25. package/packages/dd-trace/src/config.js +345 -329
  26. package/packages/dd-trace/src/config_defaults.js +9 -0
  27. package/packages/dd-trace/src/llmobs/plugins/openai.js +216 -12
  28. package/packages/dd-trace/src/llmobs/span_processor.js +2 -1
  29. package/packages/dd-trace/src/llmobs/tagger.js +9 -3
  30. package/packages/dd-trace/src/plugins/ci_plugin.js +3 -1
  31. package/packages/dd-trace/src/plugins/util/test.js +6 -0
  32. package/packages/dd-trace/src/profiling/config.js +32 -10
  33. package/packages/dd-trace/src/proxy.js +1 -1
  34. package/packages/dd-trace/src/remote_config/capabilities.js +2 -0
  35. package/packages/dd-trace/src/remote_config/index.js +4 -0
  36. package/packages/dd-trace/src/supported-configurations.json +1 -0
  37. package/packages/dd-trace/src/telemetry/logs/log-collector.js +5 -3
  38. package/register.js +1 -11
@@ -19,6 +19,7 @@ const { appendRules } = require('./payload-tagging/config')
19
19
  const { getEnvironmentVariable: getEnv, getEnvironmentVariables } = require('./config-helper')
20
20
  const defaults = require('./config_defaults')
21
21
  const path = require('path')
22
+ const { DD_MAJOR } = require('../../../version')
22
23
 
23
24
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
24
25
 
@@ -83,20 +84,6 @@ function getFromOtelSamplerMap (otelTracesSampler, otelTracesSamplerArg) {
83
84
  return OTEL_TRACES_SAMPLER_MAPPING[otelTracesSampler]
84
85
  }
85
86
 
86
- function validateOtelPropagators (propagators) {
87
- if (!getEnv('PROPAGATION_STYLE_EXTRACT') &&
88
- !getEnv('PROPAGATION_STYLE_INJECT') &&
89
- !getEnv('DD_TRACE_PROPAGATION_STYLE') &&
90
- getEnv('OTEL_PROPAGATORS')) {
91
- for (const style in propagators) {
92
- if (!VALID_PROPAGATION_STYLES.has(style)) {
93
- log.warn('unexpected value for OTEL_PROPAGATORS environment variable')
94
- getCounter('otel.env.invalid', 'DD_TRACE_PROPAGATION_STYLE', 'OTEL_PROPAGATORS').inc()
95
- }
96
- }
97
- }
98
- }
99
-
100
87
  /**
101
88
  * Validate the type of an environment variable
102
89
  * @param {string} envVar - The name of the environment variable
@@ -210,30 +197,33 @@ function remapify (input, mappings) {
210
197
  return output
211
198
  }
212
199
 
213
- function propagationStyle (key, option) {
214
- // Extract by key if in object-form value
215
- if (option !== null && typeof option === 'object' && !Array.isArray(option)) {
216
- option = option[key]
200
+ /**
201
+ * Normalizes propagation style values to a lowercase array.
202
+ * Handles both string (comma-separated) and array inputs.
203
+ */
204
+ function normalizePropagationStyle (value) {
205
+ if (Array.isArray(value)) {
206
+ return value.map(v => v.toLowerCase())
217
207
  }
218
-
219
- // Should be an array at this point
220
- if (Array.isArray(option)) return option.map(v => v.toLowerCase())
221
-
222
- // If it's not an array but not undefined there's something wrong with the input
223
- if (option !== undefined) {
208
+ if (typeof value === 'string') {
209
+ return value.split(',')
210
+ .filter(v => v !== '')
211
+ .map(v => v.trim().toLowerCase())
212
+ }
213
+ if (value !== undefined) {
224
214
  log.warn('Unexpected input for config.tracePropagationStyle')
225
215
  }
216
+ }
226
217
 
227
- // Otherwise, fallback to env var parsing
228
- const envKey = `DD_TRACE_PROPAGATION_STYLE_${key.toUpperCase()}`
229
-
230
- const envVar = getEnv(envKey) ??
231
- getEnv('DD_TRACE_PROPAGATION_STYLE') ??
232
- getEnv('OTEL_PROPAGATORS')
233
- if (envVar !== undefined) {
234
- return envVar.split(',')
235
- .filter(v => v !== '')
236
- .map(v => v.trim().toLowerCase())
218
+ /**
219
+ * Warns if both DD_TRACE_PROPAGATION_STYLE and specific inject/extract vars are set.
220
+ */
221
+ function warnIfPropagationStyleConflict (general, inject, extract) {
222
+ if (general && (inject || extract)) {
223
+ log.warn(
224
+ // eslint-disable-next-line @stylistic/max-len
225
+ 'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate DD_TRACE_PROPAGATION_STYLE_INJECT and DD_TRACE_PROPAGATION_STYLE_EXTRACT environment variables'
226
+ )
237
227
  }
238
228
  }
239
229
 
@@ -315,36 +305,6 @@ class Config {
315
305
 
316
306
  checkIfBothOtelAndDdEnvVarSet()
317
307
 
318
- const {
319
- DD_API_KEY,
320
- DD_APP_KEY,
321
- DD_INSTRUMENTATION_INSTALL_ID = null,
322
- DD_INSTRUMENTATION_INSTALL_TIME = null,
323
- DD_INSTRUMENTATION_INSTALL_TYPE = null,
324
- DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH,
325
- DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING,
326
- DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING,
327
- DD_TRACE_PROPAGATION_STYLE_EXTRACT,
328
- DD_TRACE_PROPAGATION_STYLE_INJECT,
329
- DD_TRACE_PROPAGATION_STYLE,
330
- } = envs
331
-
332
- if (DD_TRACE_PROPAGATION_STYLE && (
333
- DD_TRACE_PROPAGATION_STYLE_INJECT ||
334
- DD_TRACE_PROPAGATION_STYLE_EXTRACT
335
- )) {
336
- log.warn(
337
- // eslint-disable-next-line @stylistic/max-len
338
- 'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate DD_TRACE_PROPAGATION_STYLE_INJECT and DD_TRACE_PROPAGATION_STYLE_EXTRACT environment variables'
339
- )
340
- }
341
- const PROPAGATION_STYLE_INJECT = propagationStyle(
342
- 'inject',
343
- options.tracePropagationStyle
344
- )
345
-
346
- validateOtelPropagators(PROPAGATION_STYLE_INJECT)
347
-
348
308
  if (typeof options.appsec === 'boolean') {
349
309
  options.appsec = {
350
310
  enabled: options.appsec
@@ -357,42 +317,8 @@ class Config {
357
317
  }
358
318
  }
359
319
 
360
- const cloudPayloadTaggingRequestRules = splitJSONPathRules(
361
- DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING ??
362
- options.cloudPayloadTagging?.request ??
363
- ''
364
- )
365
-
366
- const cloudPayloadTaggingResponseRules = splitJSONPathRules(
367
- DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING ??
368
- options.cloudPayloadTagging?.response ??
369
- ''
370
- )
371
-
372
- const cloudPayloadTaggingMaxDepth = maybeInt(
373
- DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH ??
374
- options.cloudPayloadTagging?.maxDepth
375
- ) ?? 10
376
-
377
- // TODO: refactor
378
- this.apiKey = DD_API_KEY
379
- this.appKey = DD_APP_KEY
380
-
381
- // sent in telemetry event app-started
382
- this.installSignature = {
383
- id: DD_INSTRUMENTATION_INSTALL_ID,
384
- time: DD_INSTRUMENTATION_INSTALL_TIME,
385
- type: DD_INSTRUMENTATION_INSTALL_TYPE
386
- }
387
-
388
- this.cloudPayloadTagging = {
389
- requestsEnabled: !!cloudPayloadTaggingRequestRules,
390
- responsesEnabled: !!cloudPayloadTaggingResponseRules,
391
- maxDepth: cloudPayloadTaggingMaxDepth,
392
- rules: appendRules(cloudPayloadTaggingRequestRules, cloudPayloadTaggingResponseRules)
393
- }
394
-
395
320
  this.#defaults = defaults
321
+ this.#applyDefaults()
396
322
  this.#applyStableConfig(this.stableConfig?.localEntries ?? {}, this.#localStableConfig)
397
323
  this.#applyEnvironment(envs)
398
324
  this.#applyStableConfig(this.stableConfig?.fleetEntries ?? {}, this.#fleetStableConfig)
@@ -452,35 +378,32 @@ class Config {
452
378
  }
453
379
 
454
380
  #applyStableConfig (config, obj) {
455
- const {
456
- DD_APPSEC_ENABLED,
457
- DD_APPSEC_SCA_ENABLED,
458
- DD_DATA_STREAMS_ENABLED,
459
- DD_DYNAMIC_INSTRUMENTATION_ENABLED,
460
- DD_ENV,
461
- DD_IAST_ENABLED,
462
- DD_LOGS_INJECTION,
463
- DD_PROFILING_ENABLED,
464
- DD_RUNTIME_METRICS_ENABLED,
465
- DD_SERVICE,
466
- DD_VERSION
467
- } = config
468
-
469
- this.#setBoolean(obj, 'appsec.enabled', DD_APPSEC_ENABLED)
470
- this.#setBoolean(obj, 'appsec.sca.enabled', DD_APPSEC_SCA_ENABLED)
471
- this.#setBoolean(obj, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
472
- this.#setBoolean(obj, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
473
- this.#setString(obj, 'env', DD_ENV)
474
- this.#setBoolean(obj, 'iast.enabled', DD_IAST_ENABLED)
475
- this.#setBoolean(obj, 'logInjection', DD_LOGS_INJECTION)
476
- const profilingEnabled = normalizeProfilingEnabledValue(DD_PROFILING_ENABLED)
477
- this.#setString(obj, 'profiling.enabled', profilingEnabled)
478
- this.#setBoolean(obj, 'runtimeMetrics.enabled', DD_RUNTIME_METRICS_ENABLED)
479
- this.#setString(obj, 'service', DD_SERVICE)
480
- this.#setString(obj, 'version', DD_VERSION)
381
+ this.#applyConfigValues(config, obj, {})
382
+ }
383
+
384
+ // Set environment-dependent defaults that can be overridden by users
385
+ #applyDefaults () {
386
+ const defaults = this.#defaults
387
+
388
+ if (isInServerlessEnvironment()) {
389
+ this.#setBoolean(defaults, 'crashtracking.enabled', false)
390
+ this.#setString(defaults, 'profiling.enabled', 'false')
391
+ this.#setBoolean(defaults, 'telemetry.enabled', false)
392
+ this.#setBoolean(defaults, 'remoteConfig.enabled', false)
393
+ } else {
394
+ this.#setBoolean(defaults, 'crashtracking.enabled', true)
395
+ }
396
+
397
+ if (getEnv('JEST_WORKER_ID')) {
398
+ this.#setBoolean(defaults, 'telemetry.enabled', false)
399
+ }
481
400
  }
482
401
 
483
- #applyEnvironment (envs) {
402
+ #applyEnvironment () {
403
+ this.#applyConfigValues(getEnvironmentVariables(), this.#env, this.#envUnprocessed)
404
+ }
405
+
406
+ #applyConfigValues (source, target, unprocessedTarget) {
484
407
  const {
485
408
  AWS_LAMBDA_FUNCTION_NAME,
486
409
  DD_AGENT_HOST,
@@ -489,11 +412,13 @@ class Config {
489
412
  DD_AI_GUARD_MAX_CONTENT_SIZE,
490
413
  DD_AI_GUARD_MAX_MESSAGES_LENGTH,
491
414
  DD_AI_GUARD_TIMEOUT,
415
+ DD_API_KEY,
492
416
  DD_API_SECURITY_ENABLED,
493
417
  DD_API_SECURITY_SAMPLE_DELAY,
494
418
  DD_API_SECURITY_ENDPOINT_COLLECTION_ENABLED,
495
419
  DD_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT,
496
420
  DD_APM_TRACING_ENABLED,
421
+ DD_APP_KEY,
497
422
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
498
423
  DD_APPSEC_COLLECT_ALL_HEADERS,
499
424
  DD_APPSEC_ENABLED,
@@ -530,7 +455,6 @@ class Config {
530
455
  DD_PROFILING_ENABLED,
531
456
  DD_GRPC_CLIENT_ERROR_STATUSES,
532
457
  DD_GRPC_SERVER_ERROR_STATUSES,
533
- JEST_WORKER_ID,
534
458
  DD_HEAP_SNAPSHOT_COUNT,
535
459
  DD_HEAP_SNAPSHOT_DESTINATION,
536
460
  DD_HEAP_SNAPSHOT_INTERVAL,
@@ -562,6 +486,9 @@ class Config {
562
486
  DD_PROFILING_EXPORTERS,
563
487
  DD_PROFILING_SOURCE_MAP,
564
488
  DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD,
489
+ DD_INSTRUMENTATION_INSTALL_ID,
490
+ DD_INSTRUMENTATION_INSTALL_TIME,
491
+ DD_INSTRUMENTATION_INSTALL_TYPE,
565
492
  DD_REMOTE_CONFIGURATION_ENABLED,
566
493
  DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS,
567
494
  DD_RUNTIME_METRICS_ENABLED,
@@ -588,6 +515,9 @@ class Config {
588
515
  DD_TRACE_BAGGAGE_TAG_KEYS,
589
516
  DD_TRACE_CLIENT_IP_ENABLED,
590
517
  DD_TRACE_CLIENT_IP_HEADER,
518
+ DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING,
519
+ DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING,
520
+ DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH,
591
521
  DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS,
592
522
  DD_TRACE_ENABLED,
593
523
  DD_TRACE_EXPERIMENTAL_EXPORTER,
@@ -646,262 +576,327 @@ class Config {
646
576
  OTEL_EXPORTER_OTLP_TIMEOUT,
647
577
  OTEL_BSP_SCHEDULE_DELAY,
648
578
  OTEL_BSP_MAX_EXPORT_BATCH_SIZE
649
- } = envs
579
+ } = source
650
580
 
651
581
  const tags = {}
652
- const env = this.#env
653
582
 
654
- tagger.add(this.#parsedDdTags, parseSpaceSeparatedTags(DD_TAGS))
583
+ const parsedDdTags = parseSpaceSeparatedTags(DD_TAGS)
584
+ tagger.add(this.#parsedDdTags, parsedDdTags)
655
585
 
656
586
  tagger.add(tags, parseSpaceSeparatedTags(handleOtel(OTEL_RESOURCE_ATTRIBUTES)))
657
- tagger.add(tags, this.#parsedDdTags)
587
+ tagger.add(tags, parsedDdTags)
658
588
  tagger.add(tags, DD_TRACE_TAGS)
659
589
  tagger.add(tags, DD_TRACE_GLOBAL_TAGS)
660
590
 
661
- this.#setBoolean(env, 'otelLogsEnabled', isTrue(DD_LOGS_OTEL_ENABLED))
591
+ this.#setString(target, 'apiKey', DD_API_KEY)
592
+ this.#setBoolean(target, 'otelLogsEnabled', DD_LOGS_OTEL_ENABLED)
662
593
  // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars
663
594
  if (OTEL_EXPORTER_OTLP_ENDPOINT) {
664
595
  // Only set if there's a custom URL, otherwise let calc phase handle the default
665
- this.#setString(env, 'otelUrl', OTEL_EXPORTER_OTLP_ENDPOINT)
596
+ this.#setString(target, 'otelUrl', OTEL_EXPORTER_OTLP_ENDPOINT)
666
597
  }
667
598
  if (OTEL_EXPORTER_OTLP_ENDPOINT || OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) {
668
- this.#setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || env.otelUrl)
599
+ this.#setString(target, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || target.otelUrl)
669
600
  }
670
- this.#setString(env, 'otelHeaders', OTEL_EXPORTER_OTLP_HEADERS)
671
- this.#setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || env.otelHeaders)
672
- this.#setString(env, 'otelProtocol', OTEL_EXPORTER_OTLP_PROTOCOL)
673
- this.#setString(env, 'otelLogsProtocol', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || env.otelProtocol)
674
- env.otelTimeout = maybeInt(OTEL_EXPORTER_OTLP_TIMEOUT)
675
- env.otelLogsTimeout = maybeInt(OTEL_EXPORTER_OTLP_LOGS_TIMEOUT) || env.otelTimeout
676
- env.otelLogsBatchTimeout = maybeInt(OTEL_BSP_SCHEDULE_DELAY)
677
- env.otelLogsMaxExportBatchSize = maybeInt(OTEL_BSP_MAX_EXPORT_BATCH_SIZE)
601
+ this.#setString(target, 'otelHeaders', OTEL_EXPORTER_OTLP_HEADERS)
602
+ this.#setString(target, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || target.otelHeaders)
603
+ this.#setString(target, 'otelProtocol', OTEL_EXPORTER_OTLP_PROTOCOL)
604
+ this.#setString(target, 'otelLogsProtocol', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || target.otelProtocol)
605
+ target.otelTimeout = maybeInt(OTEL_EXPORTER_OTLP_TIMEOUT)
606
+ target.otelLogsTimeout = maybeInt(OTEL_EXPORTER_OTLP_LOGS_TIMEOUT) || target.otelTimeout
607
+ target.otelLogsBatchTimeout = maybeInt(OTEL_BSP_SCHEDULE_DELAY)
608
+ target.otelLogsMaxExportBatchSize = maybeInt(OTEL_BSP_MAX_EXPORT_BATCH_SIZE)
678
609
  this.#setBoolean(
679
- env,
610
+ target,
680
611
  'apmTracingEnabled',
681
612
  DD_APM_TRACING_ENABLED ??
682
613
  (DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED))
683
614
  )
684
- this.#setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
685
- env['appsec.apiSecurity.sampleDelay'] = maybeFloat(DD_API_SECURITY_SAMPLE_DELAY)
686
- this.#setBoolean(env, 'appsec.apiSecurity.endpointCollectionEnabled',
615
+ this.#setString(target, 'appKey', DD_APP_KEY)
616
+ this.#setBoolean(target, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
617
+ target['appsec.apiSecurity.sampleDelay'] = maybeFloat(DD_API_SECURITY_SAMPLE_DELAY)
618
+ this.#setBoolean(target, 'appsec.apiSecurity.endpointCollectionEnabled',
687
619
  DD_API_SECURITY_ENDPOINT_COLLECTION_ENABLED)
688
- env['appsec.apiSecurity.endpointCollectionMessageLimit'] =
620
+ target['appsec.apiSecurity.endpointCollectionMessageLimit'] =
689
621
  maybeInt(DD_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT)
690
- env['appsec.blockedTemplateGraphql'] = maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON)
691
- env['appsec.blockedTemplateHtml'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML)
692
- this.#envUnprocessed['appsec.blockedTemplateHtml'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML
693
- env['appsec.blockedTemplateJson'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON)
694
- this.#envUnprocessed['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
695
- this.#setBoolean(env, 'appsec.enabled', DD_APPSEC_ENABLED)
696
- this.#setString(env, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
622
+ target['appsec.blockedTemplateGraphql'] = maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON)
623
+ target['appsec.blockedTemplateHtml'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML)
624
+ unprocessedTarget['appsec.blockedTemplateHtml'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML
625
+ target['appsec.blockedTemplateJson'] = maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON)
626
+ unprocessedTarget['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
627
+ this.#setBoolean(target, 'appsec.enabled', DD_APPSEC_ENABLED)
628
+ this.#setString(target, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
697
629
  // TODO appsec.extendedHeadersCollection are deprecated, to delete in a major
698
- this.#setBoolean(env, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
630
+ this.#setBoolean(target, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
699
631
  this.#setBoolean(
700
- env,
632
+ target,
701
633
  'appsec.extendedHeadersCollection.redaction',
702
634
  DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED
703
635
  )
704
- env['appsec.extendedHeadersCollection.maxHeaders'] = maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS)
705
- this.#envUnprocessed['appsec.extendedHeadersCollection.maxHeaders'] = DD_APPSEC_MAX_COLLECTED_HEADERS
706
- this.#setString(env, 'appsec.obfuscatorKeyRegex', DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP)
707
- this.#setString(env, 'appsec.obfuscatorValueRegex', DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP)
708
- this.#setBoolean(env, 'appsec.rasp.enabled', DD_APPSEC_RASP_ENABLED)
636
+ target['appsec.extendedHeadersCollection.maxHeaders'] = maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS)
637
+ unprocessedTarget['appsec.extendedHeadersCollection.maxHeaders'] = DD_APPSEC_MAX_COLLECTED_HEADERS
638
+ this.#setString(target, 'appsec.obfuscatorKeyRegex', DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP)
639
+ this.#setString(target, 'appsec.obfuscatorValueRegex', DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP)
640
+ this.#setBoolean(target, 'appsec.rasp.enabled', DD_APPSEC_RASP_ENABLED)
709
641
  // TODO Deprecated, to delete in a major
710
- this.#setBoolean(env, 'appsec.rasp.bodyCollection', DD_APPSEC_RASP_COLLECT_REQUEST_BODY)
711
- env['appsec.rateLimit'] = maybeInt(DD_APPSEC_TRACE_RATE_LIMIT)
712
- this.#envUnprocessed['appsec.rateLimit'] = DD_APPSEC_TRACE_RATE_LIMIT
713
- this.#setString(env, 'appsec.rules', DD_APPSEC_RULES)
642
+ this.#setBoolean(target, 'appsec.rasp.bodyCollection', DD_APPSEC_RASP_COLLECT_REQUEST_BODY)
643
+ target['appsec.rateLimit'] = maybeInt(DD_APPSEC_TRACE_RATE_LIMIT)
644
+ unprocessedTarget['appsec.rateLimit'] = DD_APPSEC_TRACE_RATE_LIMIT
645
+ this.#setString(target, 'appsec.rules', DD_APPSEC_RULES)
714
646
  // DD_APPSEC_SCA_ENABLED is never used locally, but only sent to the backend
715
- this.#setBoolean(env, 'appsec.sca.enabled', DD_APPSEC_SCA_ENABLED)
716
- this.#setBoolean(env, 'appsec.stackTrace.enabled', DD_APPSEC_STACK_TRACE_ENABLED)
717
- env['appsec.stackTrace.maxDepth'] = maybeInt(DD_APPSEC_MAX_STACK_TRACE_DEPTH)
718
- this.#envUnprocessed['appsec.stackTrace.maxDepth'] = DD_APPSEC_MAX_STACK_TRACE_DEPTH
719
- env['appsec.stackTrace.maxStackTraces'] = maybeInt(DD_APPSEC_MAX_STACK_TRACES)
720
- this.#envUnprocessed['appsec.stackTrace.maxStackTraces'] = DD_APPSEC_MAX_STACK_TRACES
721
- env['appsec.wafTimeout'] = maybeInt(DD_APPSEC_WAF_TIMEOUT)
722
- this.#envUnprocessed['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
723
- env.baggageMaxBytes = DD_TRACE_BAGGAGE_MAX_BYTES
724
- env.baggageMaxItems = DD_TRACE_BAGGAGE_MAX_ITEMS
725
- env.baggageTagKeys = DD_TRACE_BAGGAGE_TAG_KEYS
726
- this.#setBoolean(env, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
727
- this.#setString(env, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
728
- this.#setBoolean(env, 'crashtracking.enabled', DD_CRASHTRACKING_ENABLED ?? !this._isInServerlessEnvironment())
729
- this.#setBoolean(env, 'codeOriginForSpans.enabled', DD_CODE_ORIGIN_FOR_SPANS_ENABLED)
647
+ this.#setBoolean(target, 'appsec.sca.enabled', DD_APPSEC_SCA_ENABLED)
648
+ this.#setBoolean(target, 'appsec.stackTrace.enabled', DD_APPSEC_STACK_TRACE_ENABLED)
649
+ target['appsec.stackTrace.maxDepth'] = maybeInt(DD_APPSEC_MAX_STACK_TRACE_DEPTH)
650
+ unprocessedTarget['appsec.stackTrace.maxDepth'] = DD_APPSEC_MAX_STACK_TRACE_DEPTH
651
+ target['appsec.stackTrace.maxStackTraces'] = maybeInt(DD_APPSEC_MAX_STACK_TRACES)
652
+ unprocessedTarget['appsec.stackTrace.maxStackTraces'] = DD_APPSEC_MAX_STACK_TRACES
653
+ target['appsec.wafTimeout'] = maybeInt(DD_APPSEC_WAF_TIMEOUT)
654
+ unprocessedTarget['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
655
+ target.baggageMaxBytes = DD_TRACE_BAGGAGE_MAX_BYTES
656
+ target.baggageMaxItems = DD_TRACE_BAGGAGE_MAX_ITEMS
657
+ target.baggageTagKeys = DD_TRACE_BAGGAGE_TAG_KEYS
658
+ this.#setBoolean(target, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
659
+ this.#setString(target, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
660
+ if (DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING || DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING) {
661
+ if (DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING) {
662
+ this.#setBoolean(target, 'cloudPayloadTagging.requestsEnabled', true)
663
+ }
664
+ if (DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING) {
665
+ this.#setBoolean(target, 'cloudPayloadTagging.responsesEnabled', true)
666
+ }
667
+ target['cloudPayloadTagging.rules'] = appendRules(
668
+ splitJSONPathRules(DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING),
669
+ splitJSONPathRules(DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING)
670
+ )
671
+ }
672
+ if (DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH) {
673
+ target['cloudPayloadTagging.maxDepth'] = maybeInt(DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH)
674
+ }
675
+ this.#setBoolean(target, 'crashtracking.enabled', DD_CRASHTRACKING_ENABLED)
676
+ this.#setBoolean(target, 'codeOriginForSpans.enabled', DD_CODE_ORIGIN_FOR_SPANS_ENABLED)
730
677
  this.#setBoolean(
731
- env,
678
+ target,
732
679
  'codeOriginForSpans.experimental.exit_spans.enabled',
733
680
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED
734
681
  )
735
- this.#setString(env, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
736
- this.#setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
737
- this.#setString(env, 'dogstatsd.port', DD_DOGSTATSD_PORT)
738
- this.#setBoolean(env, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
739
- this.#setBoolean(env, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
740
- this.#setString(env, 'dynamicInstrumentation.probeFile', DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE)
741
- this.#setArray(env, 'dynamicInstrumentation.redactedIdentifiers', DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS)
682
+ this.#setString(target, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
683
+ this.#setString(target, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
684
+ this.#setString(target, 'dogstatsd.port', DD_DOGSTATSD_PORT)
685
+ this.#setBoolean(target, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
686
+ this.#setBoolean(target, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
687
+ this.#setString(target, 'dynamicInstrumentation.probeFile', DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE)
688
+ this.#setArray(target, 'dynamicInstrumentation.redactedIdentifiers',
689
+ DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS)
742
690
  this.#setArray(
743
- env,
691
+ target,
744
692
  'dynamicInstrumentation.redactionExcludedIdentifiers',
745
693
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS
746
694
  )
747
- env['dynamicInstrumentation.uploadIntervalSeconds'] = maybeFloat(DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS)
748
- this.#envUnprocessed['dynamicInstrumentation.uploadInterval'] = DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS
749
- this.#setString(env, 'env', DD_ENV || tags.env)
750
- this.#setBoolean(env, 'experimental.flaggingProvider.enabled', DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED)
751
- this.#setBoolean(env, 'traceEnabled', DD_TRACE_ENABLED)
752
- this.#setBoolean(env, 'experimental.aiguard.enabled', DD_AI_GUARD_ENABLED)
753
- this.#setString(env, 'experimental.aiguard.endpoint', DD_AI_GUARD_ENDPOINT)
754
- env['experimental.aiguard.maxContentSize'] = maybeInt(DD_AI_GUARD_MAX_CONTENT_SIZE)
755
- this.#envUnprocessed['experimental.aiguard.maxContentSize'] = DD_AI_GUARD_MAX_CONTENT_SIZE
756
- env['experimental.aiguard.maxMessagesLength'] = maybeInt(DD_AI_GUARD_MAX_MESSAGES_LENGTH)
757
- this.#envUnprocessed['experimental.aiguard.maxMessagesLength'] = DD_AI_GUARD_MAX_MESSAGES_LENGTH
758
- env['experimental.aiguard.timeout'] = maybeInt(DD_AI_GUARD_TIMEOUT)
759
- this.#envUnprocessed['experimental.aiguard.timeout'] = DD_AI_GUARD_TIMEOUT
760
- this.#setBoolean(env, 'experimental.enableGetRumData', DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED)
761
- this.#setString(env, 'experimental.exporter', DD_TRACE_EXPERIMENTAL_EXPORTER)
762
- env.flushInterval = AWS_LAMBDA_FUNCTION_NAME ? 0 : maybeInt(DD_TRACE_FLUSH_INTERVAL)
763
- env.flushMinSpans = maybeInt(DD_TRACE_PARTIAL_FLUSH_MIN_SPANS)
764
- this.#envUnprocessed.flushMinSpans = DD_TRACE_PARTIAL_FLUSH_MIN_SPANS
765
- this.#setBoolean(env, 'gitMetadataEnabled', DD_TRACE_GIT_METADATA_ENABLED)
766
- this.#setIntegerRangeSet(env, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
767
- this.#setIntegerRangeSet(env, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
768
- this.#setArray(env, 'headerTags', DD_TRACE_HEADER_TAGS)
769
- env['heapSnapshot.count'] = maybeInt(DD_HEAP_SNAPSHOT_COUNT)
770
- this.#setString(env, 'heapSnapshot.destination', DD_HEAP_SNAPSHOT_DESTINATION)
771
- env['heapSnapshot.interval'] = maybeInt(DD_HEAP_SNAPSHOT_INTERVAL)
772
- this.#setString(env, 'hostname', DD_AGENT_HOST)
773
- env['iast.dbRowsToTaint'] = maybeInt(DD_IAST_DB_ROWS_TO_TAINT)
774
- this.#setBoolean(env, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
775
- this.#setBoolean(env, 'iast.enabled', DD_IAST_ENABLED)
776
- env['iast.maxConcurrentRequests'] = maybeInt(DD_IAST_MAX_CONCURRENT_REQUESTS)
777
- this.#envUnprocessed['iast.maxConcurrentRequests'] = DD_IAST_MAX_CONCURRENT_REQUESTS
778
- env['iast.maxContextOperations'] = maybeInt(DD_IAST_MAX_CONTEXT_OPERATIONS)
779
- this.#envUnprocessed['iast.maxContextOperations'] = DD_IAST_MAX_CONTEXT_OPERATIONS
780
- this.#setBoolean(env, 'iast.redactionEnabled', DD_IAST_REDACTION_ENABLED && !isFalse(DD_IAST_REDACTION_ENABLED))
781
- this.#setString(env, 'iast.redactionNamePattern', DD_IAST_REDACTION_NAME_PATTERN)
782
- this.#setString(env, 'iast.redactionValuePattern', DD_IAST_REDACTION_VALUE_PATTERN)
695
+ target['dynamicInstrumentation.uploadIntervalSeconds'] =
696
+ maybeFloat(DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS)
697
+ unprocessedTarget['dynamicInstrumentation.uploadInterval'] = DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS
698
+ this.#setString(target, 'env', DD_ENV || tags.env)
699
+ this.#setBoolean(target, 'experimental.flaggingProvider.enabled', DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED)
700
+ this.#setBoolean(target, 'traceEnabled', DD_TRACE_ENABLED)
701
+ this.#setBoolean(target, 'experimental.aiguard.enabled', DD_AI_GUARD_ENABLED)
702
+ this.#setString(target, 'experimental.aiguard.endpoint', DD_AI_GUARD_ENDPOINT)
703
+ target['experimental.aiguard.maxContentSize'] = maybeInt(DD_AI_GUARD_MAX_CONTENT_SIZE)
704
+ unprocessedTarget['experimental.aiguard.maxContentSize'] = DD_AI_GUARD_MAX_CONTENT_SIZE
705
+ target['experimental.aiguard.maxMessagesLength'] = maybeInt(DD_AI_GUARD_MAX_MESSAGES_LENGTH)
706
+ unprocessedTarget['experimental.aiguard.maxMessagesLength'] = DD_AI_GUARD_MAX_MESSAGES_LENGTH
707
+ target['experimental.aiguard.timeout'] = maybeInt(DD_AI_GUARD_TIMEOUT)
708
+ unprocessedTarget['experimental.aiguard.timeout'] = DD_AI_GUARD_TIMEOUT
709
+ this.#setBoolean(target, 'experimental.enableGetRumData', DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED)
710
+ this.#setString(target, 'experimental.exporter', DD_TRACE_EXPERIMENTAL_EXPORTER)
711
+ if (AWS_LAMBDA_FUNCTION_NAME) {
712
+ target.flushInterval = 0
713
+ } else if (DD_TRACE_FLUSH_INTERVAL) {
714
+ target.flushInterval = maybeInt(DD_TRACE_FLUSH_INTERVAL)
715
+ }
716
+ target.flushMinSpans = maybeInt(DD_TRACE_PARTIAL_FLUSH_MIN_SPANS)
717
+ unprocessedTarget.flushMinSpans = DD_TRACE_PARTIAL_FLUSH_MIN_SPANS
718
+ this.#setBoolean(target, 'gitMetadataEnabled', DD_TRACE_GIT_METADATA_ENABLED)
719
+ this.#setIntegerRangeSet(target, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
720
+ this.#setIntegerRangeSet(target, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
721
+ this.#setArray(target, 'headerTags', DD_TRACE_HEADER_TAGS)
722
+ target['heapSnapshot.count'] = maybeInt(DD_HEAP_SNAPSHOT_COUNT)
723
+ this.#setString(target, 'heapSnapshot.destination', DD_HEAP_SNAPSHOT_DESTINATION)
724
+ target['heapSnapshot.interval'] = maybeInt(DD_HEAP_SNAPSHOT_INTERVAL)
725
+ this.#setString(target, 'hostname', DD_AGENT_HOST)
726
+ target['iast.dbRowsToTaint'] = maybeInt(DD_IAST_DB_ROWS_TO_TAINT)
727
+ this.#setBoolean(target, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
728
+ this.#setBoolean(target, 'iast.enabled', DD_IAST_ENABLED)
729
+ target['iast.maxConcurrentRequests'] = maybeInt(DD_IAST_MAX_CONCURRENT_REQUESTS)
730
+ unprocessedTarget['iast.maxConcurrentRequests'] = DD_IAST_MAX_CONCURRENT_REQUESTS
731
+ target['iast.maxContextOperations'] = maybeInt(DD_IAST_MAX_CONTEXT_OPERATIONS)
732
+ unprocessedTarget['iast.maxContextOperations'] = DD_IAST_MAX_CONTEXT_OPERATIONS
733
+ this.#setBoolean(target, 'iast.redactionEnabled', DD_IAST_REDACTION_ENABLED && !isFalse(DD_IAST_REDACTION_ENABLED))
734
+ this.#setString(target, 'iast.redactionNamePattern', DD_IAST_REDACTION_NAME_PATTERN)
735
+ this.#setString(target, 'iast.redactionValuePattern', DD_IAST_REDACTION_VALUE_PATTERN)
783
736
  const iastRequestSampling = maybeInt(DD_IAST_REQUEST_SAMPLING)
784
737
  if (iastRequestSampling !== undefined && iastRequestSampling > -1 && iastRequestSampling < 101) {
785
- env['iast.requestSampling'] = iastRequestSampling
738
+ target['iast.requestSampling'] = iastRequestSampling
786
739
  }
787
- this.#envUnprocessed['iast.requestSampling'] = DD_IAST_REQUEST_SAMPLING
788
- this.#setString(env, 'iast.securityControlsConfiguration', DD_IAST_SECURITY_CONTROLS_CONFIGURATION)
789
- this.#setString(env, 'iast.telemetryVerbosity', DD_IAST_TELEMETRY_VERBOSITY)
790
- this.#setBoolean(env, 'iast.stackTrace.enabled', DD_IAST_STACK_TRACE_ENABLED)
791
- this.#setArray(env, 'injectionEnabled', DD_INJECTION_ENABLED)
792
- this.#setString(env, 'instrumentationSource', DD_INJECTION_ENABLED ? 'ssi' : 'manual')
793
- this.#setBoolean(env, 'injectForce', DD_INJECT_FORCE)
794
- this.#setBoolean(env, 'isAzureFunction', getIsAzureFunction())
795
- this.#setBoolean(env, 'isGCPFunction', getIsGCPFunction())
796
- env['langchain.spanCharLimit'] = maybeInt(DD_LANGCHAIN_SPAN_CHAR_LIMIT)
797
- env['langchain.spanPromptCompletionSampleRate'] = maybeFloat(DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
798
- this.#setBoolean(env, 'legacyBaggageEnabled', DD_TRACE_LEGACY_BAGGAGE_ENABLED)
799
- this.#setBoolean(env, 'llmobs.agentlessEnabled', DD_LLMOBS_AGENTLESS_ENABLED)
800
- this.#setBoolean(env, 'llmobs.enabled', DD_LLMOBS_ENABLED)
801
- this.#setString(env, 'llmobs.mlApp', DD_LLMOBS_ML_APP)
802
- this.#setBoolean(env, 'logInjection', DD_LOGS_INJECTION)
740
+ unprocessedTarget['iast.requestSampling'] = DD_IAST_REQUEST_SAMPLING
741
+ this.#setString(target, 'iast.securityControlsConfiguration', DD_IAST_SECURITY_CONTROLS_CONFIGURATION)
742
+ this.#setString(target, 'iast.telemetryVerbosity', DD_IAST_TELEMETRY_VERBOSITY)
743
+ this.#setBoolean(target, 'iast.stackTrace.enabled', DD_IAST_STACK_TRACE_ENABLED)
744
+ this.#setString(target, 'installSignature.id', DD_INSTRUMENTATION_INSTALL_ID)
745
+ this.#setString(target, 'installSignature.time', DD_INSTRUMENTATION_INSTALL_TIME)
746
+ this.#setString(target, 'installSignature.type', DD_INSTRUMENTATION_INSTALL_TYPE)
747
+ this.#setArray(target, 'injectionEnabled', DD_INJECTION_ENABLED)
748
+ if (DD_INJECTION_ENABLED !== undefined) {
749
+ this.#setString(target, 'instrumentationSource', DD_INJECTION_ENABLED ? 'ssi' : 'manual')
750
+ }
751
+ this.#setBoolean(target, 'injectForce', DD_INJECT_FORCE)
752
+ this.#setBoolean(target, 'isAzureFunction', getIsAzureFunction())
753
+ this.#setBoolean(target, 'isGCPFunction', getIsGCPFunction())
754
+ target['langchain.spanCharLimit'] = maybeInt(DD_LANGCHAIN_SPAN_CHAR_LIMIT)
755
+ target['langchain.spanPromptCompletionSampleRate'] = maybeFloat(DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
756
+ this.#setBoolean(target, 'legacyBaggageEnabled', DD_TRACE_LEGACY_BAGGAGE_ENABLED)
757
+ this.#setBoolean(target, 'llmobs.agentlessEnabled', DD_LLMOBS_AGENTLESS_ENABLED)
758
+ this.#setBoolean(target, 'llmobs.enabled', DD_LLMOBS_ENABLED)
759
+ this.#setString(target, 'llmobs.mlApp', DD_LLMOBS_ML_APP)
760
+ this.#setBoolean(target, 'logInjection', DD_LOGS_INJECTION)
803
761
  // Requires an accompanying DD_APM_OBFUSCATION_MEMCACHED_KEEP_COMMAND=true in the agent
804
- this.#setBoolean(env, 'memcachedCommandEnabled', DD_TRACE_MEMCACHED_COMMAND_ENABLED)
805
- this.#setBoolean(env, 'middlewareTracingEnabled', DD_TRACE_MIDDLEWARE_TRACING_ENABLED)
806
- this.#setBoolean(env, 'openAiLogsEnabled', DD_OPENAI_LOGS_ENABLED)
807
- env['openai.spanCharLimit'] = maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT)
808
- this.#envUnprocessed.openaiSpanCharLimit = DD_OPENAI_SPAN_CHAR_LIMIT
762
+ this.#setBoolean(target, 'memcachedCommandEnabled', DD_TRACE_MEMCACHED_COMMAND_ENABLED)
763
+ this.#setBoolean(target, 'middlewareTracingEnabled', DD_TRACE_MIDDLEWARE_TRACING_ENABLED)
764
+ this.#setBoolean(target, 'openAiLogsEnabled', DD_OPENAI_LOGS_ENABLED)
765
+ target['openai.spanCharLimit'] = maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT)
766
+ unprocessedTarget.openaiSpanCharLimit = DD_OPENAI_SPAN_CHAR_LIMIT
809
767
  if (DD_TRACE_PEER_SERVICE_MAPPING) {
810
- env.peerServiceMapping = Object.fromEntries(
768
+ target.peerServiceMapping = Object.fromEntries(
811
769
  DD_TRACE_PEER_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
812
770
  )
813
- this.#envUnprocessed.peerServiceMapping = DD_TRACE_PEER_SERVICE_MAPPING
771
+ unprocessedTarget.peerServiceMapping = DD_TRACE_PEER_SERVICE_MAPPING
814
772
  }
815
- this.#setString(env, 'port', DD_TRACE_AGENT_PORT)
816
- const profilingEnabled = normalizeProfilingEnabledValue(
817
- DD_PROFILING_ENABLED ??
818
- (this._isInServerlessEnvironment() ? 'false' : undefined)
819
- )
820
- this.#setString(env, 'profiling.enabled', profilingEnabled)
821
- this.#setString(env, 'profiling.exporters', DD_PROFILING_EXPORTERS)
822
- this.#setBoolean(env, 'profiling.sourceMap', DD_PROFILING_SOURCE_MAP && !isFalse(DD_PROFILING_SOURCE_MAP))
773
+ this.#setString(target, 'port', DD_TRACE_AGENT_PORT)
774
+ const profilingEnabled = normalizeProfilingEnabledValue(DD_PROFILING_ENABLED)
775
+ this.#setString(target, 'profiling.enabled', profilingEnabled)
776
+ this.#setString(target, 'profiling.exporters', DD_PROFILING_EXPORTERS)
777
+ this.#setBoolean(target, 'profiling.sourceMap', DD_PROFILING_SOURCE_MAP && !isFalse(DD_PROFILING_SOURCE_MAP))
823
778
  if (DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD) {
824
779
  // This is only used in testing to not have to wait 30s
825
- env['profiling.longLivedThreshold'] = Number(DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD)
780
+ target['profiling.longLivedThreshold'] = Number(DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD)
826
781
  }
827
782
 
828
- this.#setString(env, 'protocolVersion', DD_TRACE_AGENT_PROTOCOL_VERSION)
829
- this.#setString(env, 'queryStringObfuscation', DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP)
830
- this.#setBoolean(env, 'remoteConfig.enabled', DD_REMOTE_CONFIGURATION_ENABLED ?? !this._isInServerlessEnvironment())
831
- env['remoteConfig.pollInterval'] = maybeFloat(DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS)
832
- this.#envUnprocessed['remoteConfig.pollInterval'] = DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS
833
- this.#setBoolean(env, 'reportHostname', DD_TRACE_REPORT_HOSTNAME)
783
+ this.#setString(target, 'protocolVersion', DD_TRACE_AGENT_PROTOCOL_VERSION)
784
+ this.#setString(target, 'queryStringObfuscation', DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP)
785
+ this.#setBoolean(target, 'remoteConfig.enabled', DD_REMOTE_CONFIGURATION_ENABLED)
786
+ target['remoteConfig.pollInterval'] = maybeFloat(DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS)
787
+ unprocessedTarget['remoteConfig.pollInterval'] = DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS
788
+ this.#setBoolean(target, 'reportHostname', DD_TRACE_REPORT_HOSTNAME)
834
789
  // only used to explicitly set runtimeMetrics to false
835
790
  const otelSetRuntimeMetrics = String(OTEL_METRICS_EXPORTER).toLowerCase() === 'none'
836
791
  ? false
837
792
  : undefined
838
- this.#setBoolean(env, 'runtimeMetrics.enabled', DD_RUNTIME_METRICS_ENABLED ||
793
+ this.#setBoolean(target, 'runtimeMetrics.enabled', DD_RUNTIME_METRICS_ENABLED ||
839
794
  otelSetRuntimeMetrics)
840
- this.#setBoolean(env, 'runtimeMetrics.eventLoop', DD_RUNTIME_METRICS_EVENT_LOOP_ENABLED)
841
- this.#setBoolean(env, 'runtimeMetrics.gc', DD_RUNTIME_METRICS_GC_ENABLED)
842
- this.#setBoolean(env, 'runtimeMetricsRuntimeId', DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED)
843
- this.#setArray(env, 'sampler.spanSamplingRules', reformatSpanSamplingRules(
795
+ this.#setBoolean(target, 'runtimeMetrics.eventLoop', DD_RUNTIME_METRICS_EVENT_LOOP_ENABLED)
796
+ this.#setBoolean(target, 'runtimeMetrics.gc', DD_RUNTIME_METRICS_GC_ENABLED)
797
+ this.#setBoolean(target, 'runtimeMetricsRuntimeId', DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED)
798
+ this.#setArray(target, 'sampler.spanSamplingRules', reformatSpanSamplingRules(
844
799
  maybeJsonFile(DD_SPAN_SAMPLING_RULES_FILE) ??
845
800
  safeJsonParse(DD_SPAN_SAMPLING_RULES)
846
801
  ))
847
- this.#setUnit(env, 'sampleRate', DD_TRACE_SAMPLE_RATE ||
802
+ this.#setUnit(target, 'sampleRate', DD_TRACE_SAMPLE_RATE ||
848
803
  getFromOtelSamplerMap(OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG))
849
- env['sampler.rateLimit'] = DD_TRACE_RATE_LIMIT
850
- this.#setSamplingRule(env, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
851
- this.#envUnprocessed['sampler.rules'] = DD_TRACE_SAMPLING_RULES
852
- this.#setString(env, 'scope', DD_TRACE_SCOPE)
853
- this.#setString(env, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
804
+ target['sampler.rateLimit'] = DD_TRACE_RATE_LIMIT
805
+ this.#setSamplingRule(target, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
806
+ unprocessedTarget['sampler.rules'] = DD_TRACE_SAMPLING_RULES
807
+ this.#setString(target, 'scope', DD_TRACE_SCOPE)
808
+ this.#setString(target, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
854
809
  if (DD_SERVICE_MAPPING) {
855
- env.serviceMapping = Object.fromEntries(
810
+ target.serviceMapping = Object.fromEntries(
856
811
  DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
857
812
  )
858
813
  }
859
- this.#setString(env, 'site', DD_SITE)
814
+ this.#setString(target, 'site', DD_SITE)
860
815
  if (DD_TRACE_SPAN_ATTRIBUTE_SCHEMA) {
861
- this.#setString(env, 'spanAttributeSchema', validateNamingVersion(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA))
862
- this.#envUnprocessed.spanAttributeSchema = DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
816
+ this.#setString(target, 'spanAttributeSchema', validateNamingVersion(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA))
817
+ unprocessedTarget.spanAttributeSchema = DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
863
818
  }
864
819
  // 0: disabled, 1: logging, 2: garbage collection + logging
865
- env.spanLeakDebug = maybeInt(DD_TRACE_SPAN_LEAK_DEBUG)
866
- this.#setBoolean(env, 'spanRemoveIntegrationFromService', DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED)
867
- this.#setBoolean(env, 'startupLogs', DD_TRACE_STARTUP_LOGS)
868
- this.#setTags(env, 'tags', tags)
869
- env.tagsHeaderMaxLength = DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH
870
- this.#setBoolean(env, 'telemetry.enabled', DD_INSTRUMENTATION_TELEMETRY_ENABLED ??
871
- !(this._isInServerlessEnvironment() || JEST_WORKER_ID))
872
- this.#setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
873
- this.#setBoolean(env, 'telemetry.debug', DD_TELEMETRY_DEBUG)
874
- this.#setBoolean(env, 'telemetry.dependencyCollection', DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED)
875
- env['telemetry.heartbeatInterval'] = maybeInt(Math.floor(DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000))
876
- this.#envUnprocessed['telemetry.heartbeatInterval'] = DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000
877
- this.#setBoolean(env, 'telemetry.logCollection', DD_TELEMETRY_LOG_COLLECTION_ENABLED)
878
- this.#setBoolean(env, 'telemetry.metrics', DD_TELEMETRY_METRICS_ENABLED)
879
- this.#setBoolean(env, 'traceId128BitGenerationEnabled', DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED)
880
- this.#setBoolean(env, 'traceId128BitLoggingEnabled', DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED)
881
- this.#setBoolean(env, 'tracePropagationExtractFirst', DD_TRACE_PROPAGATION_EXTRACT_FIRST)
882
- const stringPropagationBehaviorExtract = String(DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT)
883
- env.tracePropagationBehaviorExtract =
884
- VALID_PROPAGATION_BEHAVIOR_EXTRACT.has(stringPropagationBehaviorExtract)
885
- ? stringPropagationBehaviorExtract
886
- : 'continue'
887
- this.#setBoolean(env, 'tracePropagationStyle.otelPropagators',
888
- DD_TRACE_PROPAGATION_STYLE ||
889
- DD_TRACE_PROPAGATION_STYLE_INJECT ||
820
+ target.spanLeakDebug = maybeInt(DD_TRACE_SPAN_LEAK_DEBUG)
821
+ this.#setBoolean(target, 'spanRemoveIntegrationFromService', DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED)
822
+ this.#setBoolean(target, 'startupLogs', DD_TRACE_STARTUP_LOGS)
823
+ this.#setTags(target, 'tags', tags)
824
+ target.tagsHeaderMaxLength = DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH
825
+ this.#setBoolean(target, 'telemetry.enabled', DD_INSTRUMENTATION_TELEMETRY_ENABLED)
826
+ this.#setString(target, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
827
+ this.#setBoolean(target, 'telemetry.debug', DD_TELEMETRY_DEBUG)
828
+ this.#setBoolean(target, 'telemetry.dependencyCollection', DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED)
829
+ target['telemetry.heartbeatInterval'] = maybeInt(Math.floor(DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000))
830
+ unprocessedTarget['telemetry.heartbeatInterval'] = DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000
831
+ this.#setBoolean(target, 'telemetry.logCollection', DD_TELEMETRY_LOG_COLLECTION_ENABLED)
832
+ this.#setBoolean(target, 'telemetry.metrics', DD_TELEMETRY_METRICS_ENABLED)
833
+ this.#setBoolean(target, 'traceId128BitGenerationEnabled', DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED)
834
+ this.#setBoolean(target, 'traceId128BitLoggingEnabled', DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED)
835
+ warnIfPropagationStyleConflict(
836
+ DD_TRACE_PROPAGATION_STYLE,
837
+ DD_TRACE_PROPAGATION_STYLE_INJECT,
890
838
  DD_TRACE_PROPAGATION_STYLE_EXTRACT
891
- ? false
892
- : !!OTEL_PROPAGATORS)
893
- this.#setBoolean(env, 'traceWebsocketMessagesEnabled', DD_TRACE_WEBSOCKET_MESSAGES_ENABLED)
894
- this.#setBoolean(env, 'traceWebsocketMessagesInheritSampling', DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING)
895
- this.#setBoolean(env, 'traceWebsocketMessagesSeparateTraces', DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES)
896
- this.#setBoolean(env, 'tracing', DD_TRACING_ENABLED)
897
- this.#setString(env, 'version', DD_VERSION || tags.version)
898
- this.#setBoolean(env, 'inferredProxyServicesEnabled', DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED)
899
- this.#setBoolean(env, 'trace.aws.addSpanPointers', DD_TRACE_AWS_ADD_SPAN_POINTERS)
900
- this.#setString(env, 'trace.dynamoDb.tablePrimaryKeys', DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS)
901
- this.#setArray(env, 'graphqlErrorExtensions', DD_TRACE_GRAPHQL_ERROR_EXTENSIONS)
902
- this.#setBoolean(env, 'trace.nativeSpanEvents', DD_TRACE_NATIVE_SPAN_EVENTS)
903
- env['vertexai.spanPromptCompletionSampleRate'] = maybeFloat(DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
904
- env['vertexai.spanCharLimit'] = maybeInt(DD_VERTEXAI_SPAN_CHAR_LIMIT)
839
+ )
840
+ if (DD_TRACE_PROPAGATION_STYLE !== undefined) {
841
+ this.#setArray(target, 'tracePropagationStyle.inject', normalizePropagationStyle(DD_TRACE_PROPAGATION_STYLE))
842
+ this.#setArray(target, 'tracePropagationStyle.extract', normalizePropagationStyle(DD_TRACE_PROPAGATION_STYLE))
843
+ }
844
+ if (DD_TRACE_PROPAGATION_STYLE_INJECT !== undefined) {
845
+ this.#setArray(target, 'tracePropagationStyle.inject',
846
+ normalizePropagationStyle(DD_TRACE_PROPAGATION_STYLE_INJECT))
847
+ }
848
+ if (DD_TRACE_PROPAGATION_STYLE_EXTRACT !== undefined) {
849
+ this.#setArray(target, 'tracePropagationStyle.extract',
850
+ normalizePropagationStyle(DD_TRACE_PROPAGATION_STYLE_EXTRACT))
851
+ }
852
+ this.#setBoolean(target, 'tracePropagationExtractFirst', DD_TRACE_PROPAGATION_EXTRACT_FIRST)
853
+ if (DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT !== undefined) {
854
+ const stringPropagationBehaviorExtract = String(DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT)
855
+ target.tracePropagationBehaviorExtract =
856
+ VALID_PROPAGATION_BEHAVIOR_EXTRACT.has(stringPropagationBehaviorExtract)
857
+ ? stringPropagationBehaviorExtract
858
+ : 'continue'
859
+ }
860
+ if (DD_TRACE_PROPAGATION_STYLE !== undefined ||
861
+ DD_TRACE_PROPAGATION_STYLE_INJECT !== undefined ||
862
+ DD_TRACE_PROPAGATION_STYLE_EXTRACT !== undefined ||
863
+ OTEL_PROPAGATORS !== undefined) {
864
+ // At least one var is defined, calculate value using truthy logic
865
+ const useDdStyle = DD_TRACE_PROPAGATION_STYLE ||
866
+ DD_TRACE_PROPAGATION_STYLE_INJECT ||
867
+ DD_TRACE_PROPAGATION_STYLE_EXTRACT
868
+ this.#setBoolean(target, 'tracePropagationStyle.otelPropagators',
869
+ useDdStyle ? false : !!OTEL_PROPAGATORS)
870
+
871
+ // Use OTEL_PROPAGATORS if no DD-specific vars are set
872
+ if (!useDdStyle && OTEL_PROPAGATORS) {
873
+ const otelStyles = normalizePropagationStyle(OTEL_PROPAGATORS)
874
+ // Validate OTEL propagators
875
+ for (const style of otelStyles || []) {
876
+ if (!VALID_PROPAGATION_STYLES.has(style)) {
877
+ log.warn('unexpected value %s for OTEL_PROPAGATORS environment variable', style)
878
+ getCounter('otel.env.invalid', 'DD_TRACE_PROPAGATION_STYLE', 'OTEL_PROPAGATORS').inc()
879
+ }
880
+ }
881
+ // Set inject/extract from OTEL_PROPAGATORS
882
+ if (otelStyles) {
883
+ this.#setArray(target, 'tracePropagationStyle.inject', otelStyles)
884
+ this.#setArray(target, 'tracePropagationStyle.extract', otelStyles)
885
+ }
886
+ }
887
+ }
888
+ this.#setBoolean(target, 'traceWebsocketMessagesEnabled', DD_TRACE_WEBSOCKET_MESSAGES_ENABLED)
889
+ this.#setBoolean(target, 'traceWebsocketMessagesInheritSampling', DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING)
890
+ this.#setBoolean(target, 'traceWebsocketMessagesSeparateTraces', DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES)
891
+ this.#setBoolean(target, 'tracing', DD_TRACING_ENABLED)
892
+ this.#setString(target, 'version', DD_VERSION || tags.version)
893
+ this.#setBoolean(target, 'inferredProxyServicesEnabled', DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED)
894
+ this.#setBoolean(target, 'trace.aws.addSpanPointers', DD_TRACE_AWS_ADD_SPAN_POINTERS)
895
+ this.#setString(target, 'trace.dynamoDb.tablePrimaryKeys', DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS)
896
+ this.#setArray(target, 'graphqlErrorExtensions', DD_TRACE_GRAPHQL_ERROR_EXTENSIONS)
897
+ this.#setBoolean(target, 'trace.nativeSpanEvents', DD_TRACE_NATIVE_SPAN_EVENTS)
898
+ target['vertexai.spanPromptCompletionSampleRate'] = maybeFloat(DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE)
899
+ target['vertexai.spanCharLimit'] = maybeInt(DD_VERTEXAI_SPAN_CHAR_LIMIT)
905
900
  }
906
901
 
907
902
  #applyOptions (options) {
@@ -954,6 +949,25 @@ class Config {
954
949
  this.#optsUnprocessed['appsec.wafTimeout'] = options.appsec?.wafTimeout
955
950
  this.#setBoolean(opts, 'clientIpEnabled', options.clientIpEnabled)
956
951
  this.#setString(opts, 'clientIpHeader', options.clientIpHeader?.toLowerCase())
952
+ if (options.cloudPayloadTagging?.request || options.cloudPayloadTagging?.response) {
953
+ if (options.cloudPayloadTagging.request) {
954
+ this.#setBoolean(opts, 'cloudPayloadTagging.requestsEnabled', true)
955
+ }
956
+ if (options.cloudPayloadTagging.response) {
957
+ this.#setBoolean(opts, 'cloudPayloadTagging.responsesEnabled', true)
958
+ }
959
+ opts['cloudPayloadTagging.rules'] = appendRules(
960
+ splitJSONPathRules(options.cloudPayloadTagging.request),
961
+ splitJSONPathRules(options.cloudPayloadTagging.response)
962
+ )
963
+ }
964
+ if (options.cloudPayloadTagging?.requestsEnabled !== undefined) {
965
+ this.#setBoolean(opts, 'cloudPayloadTagging.requestsEnabled', options.cloudPayloadTagging.requestsEnabled)
966
+ }
967
+ if (options.cloudPayloadTagging?.responsesEnabled !== undefined) {
968
+ this.#setBoolean(opts, 'cloudPayloadTagging.responsesEnabled', options.cloudPayloadTagging.responsesEnabled)
969
+ }
970
+ opts['cloudPayloadTagging.maxDepth'] = maybeInt(options.cloudPayloadTagging?.maxDepth)
957
971
  opts.baggageMaxBytes = options.baggageMaxBytes
958
972
  opts.baggageMaxItems = options.baggageMaxItems
959
973
  opts.baggageTagKeys = options.baggageTagKeys
@@ -1019,7 +1033,9 @@ class Config {
1019
1033
  opts['iast.requestSampling'] = iastRequestSampling
1020
1034
  this.#optsUnprocessed['iast.requestSampling'] = options.iast?.requestSampling
1021
1035
  }
1022
- opts['iast.securityControlsConfiguration'] = options.iast?.securityControlsConfiguration
1036
+ if (DD_MAJOR < 6) {
1037
+ opts['iast.securityControlsConfiguration'] = options.iast?.securityControlsConfiguration
1038
+ }
1023
1039
  this.#setBoolean(opts, 'iast.stackTrace.enabled', options.iast?.stackTrace?.enabled)
1024
1040
  this.#setString(opts, 'iast.telemetryVerbosity', options.iast && options.iast.telemetryVerbosity)
1025
1041
  this.#setBoolean(opts, 'isCiVisibility', options.isCiVisibility)
@@ -1070,6 +1086,12 @@ class Config {
1070
1086
  this.#setBoolean(opts, 'inferredProxyServicesEnabled', options.inferredProxyServicesEnabled)
1071
1087
  this.#setBoolean(opts, 'graphqlErrorExtensions', options.graphqlErrorExtensions)
1072
1088
  this.#setBoolean(opts, 'trace.nativeSpanEvents', options.trace?.nativeSpanEvents)
1089
+ if (options.tracePropagationStyle) {
1090
+ this.#setArray(opts, 'tracePropagationStyle.inject',
1091
+ normalizePropagationStyle(options.tracePropagationStyle.inject ?? options.tracePropagationStyle))
1092
+ this.#setArray(opts, 'tracePropagationStyle.extract',
1093
+ normalizePropagationStyle(options.tracePropagationStyle.extract ?? options.tracePropagationStyle))
1094
+ }
1073
1095
 
1074
1096
  // For LLMObs, we want the environment variable to take precedence over the options.
1075
1097
  // This is reliant on environment config being set before options.
@@ -1189,17 +1211,11 @@ class Config {
1189
1211
  this.#setBoolean(calc, 'spanComputePeerService', this.#getSpanComputePeerService())
1190
1212
  this.#setBoolean(calc, 'stats.enabled', this.#isTraceStatsComputationEnabled())
1191
1213
  const defaultPropagationStyle = this.#getDefaultPropagationStyle(this.#optionsArg)
1192
- calc['tracePropagationStyle.inject'] = propagationStyle(
1193
- 'inject',
1194
- this.#optionsArg.tracePropagationStyle
1195
- )
1196
- calc['tracePropagationStyle.extract'] = propagationStyle(
1197
- 'extract',
1198
- this.#optionsArg.tracePropagationStyle
1199
- )
1200
1214
  if (defaultPropagationStyle.length > 2) {
1201
- calc['tracePropagationStyle.inject'] = calc['tracePropagationStyle.inject'] || defaultPropagationStyle
1202
- calc['tracePropagationStyle.extract'] = calc['tracePropagationStyle.extract'] || defaultPropagationStyle
1215
+ // b3 was added, so update defaults to include it
1216
+ // This will only be used if no other source (options, env, stable config) set the value
1217
+ calc['tracePropagationStyle.inject'] = defaultPropagationStyle
1218
+ calc['tracePropagationStyle.extract'] = defaultPropagationStyle
1203
1219
  }
1204
1220
  }
1205
1221