dd-trace 5.67.0 → 5.68.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 (104) hide show
  1. package/LICENSE-3rdparty.csv +0 -3
  2. package/README.md +0 -2
  3. package/ci/init.js +52 -54
  4. package/ext/exporters.d.ts +2 -1
  5. package/ext/exporters.js +2 -1
  6. package/index.d.ts +47 -2
  7. package/initialize.mjs +1 -1
  8. package/package.json +8 -11
  9. package/packages/datadog-esbuild/index.js +56 -0
  10. package/packages/datadog-instrumentations/src/aws-sdk.js +42 -4
  11. package/packages/datadog-instrumentations/src/azure-functions.js +1 -1
  12. package/packages/datadog-instrumentations/src/azure-service-bus.js +1 -1
  13. package/packages/datadog-instrumentations/src/cassandra-driver.js +2 -2
  14. package/packages/datadog-instrumentations/src/connect.js +6 -2
  15. package/packages/datadog-instrumentations/src/cucumber.js +31 -6
  16. package/packages/datadog-instrumentations/src/express.js +5 -6
  17. package/packages/datadog-instrumentations/src/fastify.js +3 -3
  18. package/packages/datadog-instrumentations/src/helpers/hook.js +28 -15
  19. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  20. package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -2
  21. package/packages/datadog-instrumentations/src/helpers/register.js +10 -3
  22. package/packages/datadog-instrumentations/src/http2/client.js +1 -0
  23. package/packages/datadog-instrumentations/src/http2/server.js +0 -1
  24. package/packages/datadog-instrumentations/src/ioredis.js +12 -1
  25. package/packages/datadog-instrumentations/src/jest.js +48 -36
  26. package/packages/datadog-instrumentations/src/limitd-client.js +2 -1
  27. package/packages/datadog-instrumentations/src/mocha/main.js +15 -7
  28. package/packages/datadog-instrumentations/src/mocha/utils.js +3 -0
  29. package/packages/datadog-instrumentations/src/mongoose.js +2 -1
  30. package/packages/datadog-instrumentations/src/oracledb.js +19 -13
  31. package/packages/datadog-instrumentations/src/pg.js +9 -5
  32. package/packages/datadog-instrumentations/src/pino.js +18 -6
  33. package/packages/datadog-instrumentations/src/playwright.js +15 -1
  34. package/packages/datadog-instrumentations/src/sequelize.js +1 -1
  35. package/packages/datadog-instrumentations/src/vitest.js +155 -62
  36. package/packages/datadog-plugin-ai/src/tracing.js +3 -3
  37. package/packages/datadog-plugin-aws-sdk/src/base.js +23 -8
  38. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  39. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +101 -2
  40. package/packages/datadog-plugin-aws-sdk/src/util.js +1 -1
  41. package/packages/datadog-plugin-cucumber/src/index.js +4 -56
  42. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +6 -2
  43. package/packages/datadog-plugin-cypress/src/support.js +4 -0
  44. package/packages/datadog-plugin-express/src/code_origin.js +2 -2
  45. package/packages/datadog-plugin-fastify/src/code_origin.js +1 -2
  46. package/packages/datadog-plugin-jest/src/index.js +0 -21
  47. package/packages/datadog-plugin-mocha/src/index.js +3 -57
  48. package/packages/datadog-plugin-mongodb-core/src/index.js +20 -7
  49. package/packages/datadog-plugin-playwright/src/index.js +11 -5
  50. package/packages/datadog-plugin-vitest/src/index.js +5 -1
  51. package/packages/datadog-plugin-ws/src/close.js +1 -1
  52. package/packages/datadog-plugin-ws/src/producer.js +6 -1
  53. package/packages/datadog-plugin-ws/src/receiver.js +6 -1
  54. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +1 -1
  55. package/packages/dd-trace/src/appsec/telemetry/waf.js +2 -2
  56. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -4
  57. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +11 -3
  58. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +10 -1
  59. package/packages/dd-trace/src/config.js +69 -304
  60. package/packages/dd-trace/src/config_defaults.js +186 -0
  61. package/packages/dd-trace/src/crashtracking/crashtracker.js +2 -1
  62. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  63. package/packages/dd-trace/src/datastreams/writer.js +3 -2
  64. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -1
  65. package/packages/dd-trace/src/dogstatsd.js +4 -3
  66. package/packages/dd-trace/src/encode/0.4.js +1 -5
  67. package/packages/dd-trace/src/exporter.js +1 -0
  68. package/packages/dd-trace/src/exporters/agent/index.js +3 -2
  69. package/packages/dd-trace/src/exporters/agent/writer.js +1 -1
  70. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +3 -2
  71. package/packages/dd-trace/src/exporters/common/request.js +2 -1
  72. package/packages/dd-trace/src/exporters/span-stats/index.js +3 -2
  73. package/packages/dd-trace/src/llmobs/constants/tags.js +2 -0
  74. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +4 -3
  75. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +12 -1
  76. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +40 -13
  77. package/packages/dd-trace/src/llmobs/plugins/openai.js +7 -1
  78. package/packages/dd-trace/src/llmobs/tagger.js +8 -0
  79. package/packages/dd-trace/src/llmobs/telemetry.js +2 -1
  80. package/packages/dd-trace/src/log/index.js +28 -17
  81. package/packages/dd-trace/src/log/log.js +29 -5
  82. package/packages/dd-trace/src/log/writer.js +5 -5
  83. package/packages/dd-trace/src/noop/span.js +1 -0
  84. package/packages/dd-trace/src/opentelemetry/span.js +14 -3
  85. package/packages/dd-trace/src/opentracing/span.js +18 -4
  86. package/packages/dd-trace/src/plugin_manager.js +20 -2
  87. package/packages/dd-trace/src/plugins/ci_plugin.js +97 -3
  88. package/packages/dd-trace/src/plugins/index.js +2 -0
  89. package/packages/dd-trace/src/plugins/util/git-cache.js +129 -0
  90. package/packages/dd-trace/src/plugins/util/git.js +40 -26
  91. package/packages/dd-trace/src/plugins/util/test.js +37 -27
  92. package/packages/dd-trace/src/plugins/util/web.js +1 -1
  93. package/packages/dd-trace/src/profiler.js +4 -1
  94. package/packages/dd-trace/src/profiling/config.js +73 -42
  95. package/packages/dd-trace/src/profiling/profiler.js +3 -1
  96. package/packages/dd-trace/src/profiling/profilers/events.js +3 -8
  97. package/packages/dd-trace/src/profiling/profilers/space.js +1 -0
  98. package/packages/dd-trace/src/profiling/profilers/wall.js +196 -117
  99. package/packages/dd-trace/src/remote_config/capabilities.js +5 -0
  100. package/packages/dd-trace/src/remote_config/manager.js +3 -2
  101. package/packages/dd-trace/src/startup-log.js +2 -1
  102. package/packages/dd-trace/src/supported-configurations.json +3 -0
  103. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  104. package/register.js +1 -1
@@ -5,8 +5,6 @@ const os = require('os')
5
5
  const uuid = require('crypto-randomuuid') // we need to keep the old uuid dep because of cypress
6
6
  const { URL } = require('url')
7
7
  const log = require('./log')
8
- const pkg = require('./pkg')
9
- const coalesce = require('koalas')
10
8
  const tagger = require('./tagger')
11
9
  const set = require('../../datadog-core/src/utils/src/set')
12
10
  const { isTrue, isFalse, normalizeProfilingEnabledValue } = require('./util')
@@ -15,11 +13,10 @@ const { getGitMetadataFromGitProperties, removeUserSensitiveInfo } = require('./
15
13
  const { updateConfig } = require('./telemetry')
16
14
  const telemetryMetrics = require('./telemetry/metrics')
17
15
  const { isInServerlessEnvironment, getIsGCPFunction, getIsAzureFunction } = require('./serverless')
18
- const {
19
- ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES
20
- } = require('./constants')
16
+ const { ORIGIN_KEY } = require('./constants')
21
17
  const { appendRules } = require('./payload-tagging/config')
22
18
  const { getEnvironmentVariable, getEnvironmentVariables } = require('./config-helper')
19
+ const defaults = require('./config_defaults')
23
20
 
24
21
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
25
22
 
@@ -134,12 +131,6 @@ function checkIfBothOtelAndDdEnvVarSet () {
134
131
  }
135
132
  }
136
133
 
137
- // eslint-disable-next-line @stylistic/max-len
138
- const qsRegex = String.raw`(?:p(?:ass)?w(?:or)?d|pass(?:_?phrase)?|secret|(?:api_?|private_?|public_?|access_?|secret_?)key(?:_?id)?|token|consumer_?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\s|%20)*(?:=|%3D)[^&]+|(?:"|%22)(?:\s|%20)*(?::|%3A)(?:\s|%20)*(?:"|%22)(?:%2[^2]|%[^2]|[^"%])+(?:"|%22))|bearer(?:\s|%20)+[a-z0-9\._\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\w=-]|%3D)+\.ey[I-L](?:[\w=-]|%3D)+(?:\.(?:[\w.+\/=-]|%3D|%2F|%2B)+)?|[\-]{5}BEGIN(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY[\-]{5}[^\-]+[\-]{5}END(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY|ssh-rsa(?:\s|%20)*(?:[a-z0-9\/\.+]|%2F|%5C|%2B){100,}`
139
- // eslint-disable-next-line @stylistic/max-len
140
- const defaultWafObfuscatorKeyRegex = String.raw`(?i)pass|pw(?:or)?d|secret|(?:api|private|public|access)[_-]?key|token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)|bearer|authorization|jsessionid|phpsessid|asp\.net[_-]sessionid|sid|jwt`
141
- // eslint-disable-next-line @stylistic/max-len
142
- const defaultWafObfuscatorValueRegex = String.raw`(?i)(?:p(?:ass)?w(?:or)?d|pass(?:[_-]?phrase)?|secret(?:[_-]?key)?|(?:(?:api|private|public|access)[_-]?)key(?:[_-]?id)?|(?:(?:auth|access|id|refresh)[_-]?)?token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|jsessionid|phpsessid|asp\.net(?:[_-]|-)sessionid|sid|jwt)(?:\s*=([^;&]+)|"\s*:\s*("[^"]+"|\d+))|bearer\s+([a-z0-9\._\-]+)|token\s*:\s*([a-z0-9]{13})|gh[opsu]_([0-9a-zA-Z]{36})|ey[I-L][\w=-]+\.(ey[I-L][\w=-]+(?:\.[\w.+\/=-]+)?)|[\-]{5}BEGIN[a-z\s]+PRIVATE\sKEY[\-]{5}([^\-]+)[\-]{5}END[a-z\s]+PRIVATE\sKEY|ssh-rsa\s*([a-z0-9\/\.+]{100,})`
143
134
  const runtimeId = uuid()
144
135
 
145
136
  function maybeFile (filepath) {
@@ -222,8 +213,9 @@ function propagationStyle (key, option) {
222
213
  // Otherwise, fallback to env var parsing
223
214
  const envKey = `DD_TRACE_PROPAGATION_STYLE_${key.toUpperCase()}`
224
215
 
225
- const envVar = coalesce(getEnvironmentVariable(envKey),
226
- getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE'), getEnvironmentVariable('OTEL_PROPAGATORS'))
216
+ const envVar = getEnvironmentVariable(envKey) ??
217
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') ??
218
+ getEnvironmentVariable('OTEL_PROPAGATORS')
227
219
  if (envVar !== undefined) {
228
220
  return envVar.split(',')
229
221
  .filter(v => v !== '')
@@ -277,7 +269,7 @@ class Config {
277
269
  this.stableConfig?.fleetEntries?.DD_TRACE_DEBUG,
278
270
  this.stableConfig?.localEntries?.DD_TRACE_DEBUG
279
271
  )
280
- this.logger = coalesce(options.logger, logConfig.logger)
272
+ this.logger = options.logger ?? logConfig.logger
281
273
  this.logLevel = log.getLogLevel(
282
274
  options.logLevel,
283
275
  this.stableConfig?.fleetEntries?.DD_TRACE_LOG_LEVEL,
@@ -323,39 +315,27 @@ class Config {
323
315
  }
324
316
  }
325
317
 
326
- const DD_INSTRUMENTATION_INSTALL_ID = coalesce(
327
- getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID'),
328
- null
329
- )
330
- const DD_INSTRUMENTATION_INSTALL_TIME = coalesce(
331
- getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TIME'),
332
- null
333
- )
334
- const DD_INSTRUMENTATION_INSTALL_TYPE = coalesce(
335
- getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TYPE'),
336
- null
337
- )
318
+ const DD_INSTRUMENTATION_INSTALL_ID = getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID') ?? null
319
+ const DD_INSTRUMENTATION_INSTALL_TIME = getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TIME') ?? null
320
+ const DD_INSTRUMENTATION_INSTALL_TYPE = getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TYPE') ?? null
338
321
 
339
322
  const DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING = splitJSONPathRules(
340
- coalesce(
341
- getEnvironmentVariable('DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING'),
342
- options.cloudPayloadTagging?.request,
343
- ''
344
- ))
323
+ getEnvironmentVariable('DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING') ??
324
+ options.cloudPayloadTagging?.request ??
325
+ ''
326
+ )
345
327
 
346
328
  const DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING = splitJSONPathRules(
347
- coalesce(
348
- getEnvironmentVariable('DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING'),
349
- options.cloudPayloadTagging?.response,
350
- ''
351
- ))
352
-
353
- const DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH = coalesce(
354
- getEnvironmentVariable('DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH'),
355
- options.cloudPayloadTagging?.maxDepth,
356
- 10
329
+ getEnvironmentVariable('DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING') ??
330
+ options.cloudPayloadTagging?.response ??
331
+ ''
357
332
  )
358
333
 
334
+ const DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH = maybeInt(
335
+ getEnvironmentVariable('DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH') ??
336
+ options.cloudPayloadTagging?.maxDepth
337
+ ) ?? 10
338
+
359
339
  // TODO: refactor
360
340
  this.apiKey = DD_API_KEY
361
341
 
@@ -399,20 +379,14 @@ class Config {
399
379
 
400
380
  if (this.gitMetadataEnabled) {
401
381
  this.repositoryUrl = removeUserSensitiveInfo(
402
- coalesce(
403
- getEnvironmentVariable('DD_GIT_REPOSITORY_URL'),
404
- this.tags[GIT_REPOSITORY_URL]
405
- )
382
+ getEnvironmentVariable('DD_GIT_REPOSITORY_URL') ??
383
+ this.tags[GIT_REPOSITORY_URL]
406
384
  )
407
- this.commitSHA = coalesce(
408
- getEnvironmentVariable('DD_GIT_COMMIT_SHA'),
385
+ this.commitSHA = getEnvironmentVariable('DD_GIT_COMMIT_SHA') ??
409
386
  this.tags[GIT_COMMIT_SHA]
410
- )
411
387
  if (!this.repositoryUrl || !this.commitSHA) {
412
- const DD_GIT_PROPERTIES_FILE = coalesce(
413
- getEnvironmentVariable('DD_GIT_PROPERTIES_FILE'),
388
+ const DD_GIT_PROPERTIES_FILE = getEnvironmentVariable('DD_GIT_PROPERTIES_FILE') ??
414
389
  `${process.cwd()}/git.properties`
415
- )
416
390
  let gitPropertiesString
417
391
  try {
418
392
  gitPropertiesString = fs.readFileSync(DD_GIT_PROPERTIES_FILE, 'utf8')
@@ -450,11 +424,8 @@ class Config {
450
424
 
451
425
  _getDefaultPropagationStyle (options) {
452
426
  // TODO: Remove the experimental env vars as a major?
453
- const DD_TRACE_B3_ENABLED = coalesce(
454
- options.experimental && options.experimental.b3,
455
- getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_B3_ENABLED'),
456
- false
457
- )
427
+ const DD_TRACE_B3_ENABLED = options.experimental?.b3 ??
428
+ getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_B3_ENABLED')
458
429
  const defaultPropagationStyle = ['datadog', 'tracecontext']
459
430
  if (isTrue(DD_TRACE_B3_ENABLED)) {
460
431
  defaultPropagationStyle.push('b3', 'b3 single header')
@@ -468,180 +439,7 @@ class Config {
468
439
 
469
440
  // for _merge to work, every config value must have a default value
470
441
  _applyDefaults () {
471
- const {
472
- AWS_LAMBDA_FUNCTION_NAME,
473
- FUNCTION_NAME,
474
- K_SERVICE,
475
- WEBSITE_SITE_NAME
476
- } = getEnvironmentVariables()
477
-
478
- const service = AWS_LAMBDA_FUNCTION_NAME ||
479
- FUNCTION_NAME || // Google Cloud Function Name set by deprecated runtimes
480
- K_SERVICE || // Google Cloud Function Name set by newer runtimes
481
- WEBSITE_SITE_NAME || // set by Azure Functions
482
- pkg.name ||
483
- 'node'
484
-
485
- const defaults = setHiddenProperty(this, '_defaults', {})
486
-
487
- defaults.apmTracingEnabled = true
488
- defaults['appsec.apiSecurity.enabled'] = true
489
- defaults['appsec.apiSecurity.sampleDelay'] = 30
490
- defaults['appsec.apiSecurity.endpointCollectionEnabled'] = true
491
- defaults['appsec.apiSecurity.endpointCollectionMessageLimit'] = 300
492
- defaults['appsec.blockedTemplateGraphql'] = undefined
493
- defaults['appsec.blockedTemplateHtml'] = undefined
494
- defaults['appsec.blockedTemplateJson'] = undefined
495
- defaults['appsec.enabled'] = undefined
496
- defaults['appsec.eventTracking.mode'] = 'identification'
497
- defaults['appsec.extendedHeadersCollection.enabled'] = false
498
- defaults['appsec.extendedHeadersCollection.redaction'] = true
499
- defaults['appsec.extendedHeadersCollection.maxHeaders'] = 50
500
- defaults['appsec.obfuscatorKeyRegex'] = defaultWafObfuscatorKeyRegex
501
- defaults['appsec.obfuscatorValueRegex'] = defaultWafObfuscatorValueRegex
502
- defaults['appsec.rasp.enabled'] = true
503
- defaults['appsec.rasp.bodyCollection'] = false
504
- defaults['appsec.rateLimit'] = 100
505
- defaults['appsec.rules'] = undefined
506
- defaults['appsec.sca.enabled'] = null
507
- defaults['appsec.stackTrace.enabled'] = true
508
- defaults['appsec.stackTrace.maxDepth'] = 32
509
- defaults['appsec.stackTrace.maxStackTraces'] = 2
510
- defaults['appsec.wafTimeout'] = 5e3 // µs
511
- defaults.baggageMaxBytes = 8192
512
- defaults.baggageMaxItems = 64
513
- defaults.baggageTagKeys = 'user.id,session.id,account.id'
514
- defaults.ciVisibilityTestSessionName = ''
515
- defaults.clientIpEnabled = false
516
- defaults.clientIpHeader = null
517
- defaults['crashtracking.enabled'] = true
518
- defaults['codeOriginForSpans.enabled'] = true
519
- defaults['codeOriginForSpans.experimental.exit_spans.enabled'] = false
520
- defaults.dbmPropagationMode = 'disabled'
521
- defaults['dogstatsd.hostname'] = '127.0.0.1'
522
- defaults['dogstatsd.port'] = '8125'
523
- defaults.dsmEnabled = false
524
- defaults['dynamicInstrumentation.enabled'] = false
525
- defaults['dynamicInstrumentation.probeFile'] = undefined
526
- defaults['dynamicInstrumentation.redactedIdentifiers'] = []
527
- defaults['dynamicInstrumentation.redactionExcludedIdentifiers'] = []
528
- defaults['dynamicInstrumentation.uploadIntervalSeconds'] = 1
529
- defaults.env = undefined
530
- defaults['experimental.enableGetRumData'] = false
531
- defaults['experimental.exporter'] = undefined
532
- defaults.flushInterval = 2000
533
- defaults.flushMinSpans = 1000
534
- defaults.gitMetadataEnabled = true
535
- defaults.graphqlErrorExtensions = []
536
- defaults['grpc.client.error.statuses'] = GRPC_CLIENT_ERROR_STATUSES
537
- defaults['grpc.server.error.statuses'] = GRPC_SERVER_ERROR_STATUSES
538
- defaults.headerTags = []
539
- defaults['heapSnapshot.count'] = 0
540
- defaults['heapSnapshot.destination'] = ''
541
- defaults['heapSnapshot.interval'] = 3600
542
- defaults.hostname = '127.0.0.1'
543
- defaults['iast.dbRowsToTaint'] = 1
544
- defaults['iast.deduplicationEnabled'] = true
545
- defaults['iast.enabled'] = false
546
- defaults['iast.maxConcurrentRequests'] = 2
547
- defaults['iast.maxContextOperations'] = 2
548
- defaults['iast.redactionEnabled'] = true
549
- defaults['iast.redactionNamePattern'] = null
550
- defaults['iast.redactionValuePattern'] = null
551
- defaults['iast.requestSampling'] = 30
552
- defaults['iast.securityControlsConfiguration'] = null
553
- defaults['iast.telemetryVerbosity'] = 'INFORMATION'
554
- defaults['iast.stackTrace.enabled'] = true
555
- defaults.injectionEnabled = []
556
- defaults.instrumentationSource = 'manual'
557
- defaults.injectForce = null
558
- defaults.isAzureFunction = false
559
- defaults.isCiVisibility = false
560
- defaults.isEarlyFlakeDetectionEnabled = false
561
- defaults.isFlakyTestRetriesEnabled = false
562
- defaults.flakyTestRetriesCount = 5
563
- defaults.isGCPFunction = false
564
- defaults.isGitUploadEnabled = false
565
- defaults.isIntelligentTestRunnerEnabled = false
566
- defaults.isManualApiEnabled = false
567
- defaults['langchain.spanCharLimit'] = 128
568
- defaults['langchain.spanPromptCompletionSampleRate'] = 1
569
- defaults['llmobs.agentlessEnabled'] = undefined
570
- defaults['llmobs.enabled'] = false
571
- defaults['llmobs.mlApp'] = undefined
572
- defaults.ciVisibilityTestSessionName = ''
573
- defaults.ciVisAgentlessLogSubmissionEnabled = false
574
- defaults.legacyBaggageEnabled = true
575
- defaults.isTestDynamicInstrumentationEnabled = false
576
- defaults.isServiceUserProvided = false
577
- defaults.testManagementAttemptToFixRetries = 20
578
- defaults.isTestManagementEnabled = false
579
- defaults.isImpactedTestsEnabled = false
580
- defaults.logInjection = true
581
- defaults.lookup = undefined
582
- defaults.inferredProxyServicesEnabled = false
583
- defaults.memcachedCommandEnabled = false
584
- defaults.middlewareTracingEnabled = true
585
- defaults.openAiLogsEnabled = false
586
- defaults['openai.spanCharLimit'] = 128
587
- defaults.peerServiceMapping = {}
588
- defaults.plugins = true
589
- defaults.port = '8126'
590
- defaults['profiling.enabled'] = undefined
591
- defaults['profiling.exporters'] = 'agent'
592
- defaults['profiling.sourceMap'] = true
593
- defaults['profiling.longLivedThreshold'] = undefined
594
- defaults.protocolVersion = '0.4'
595
- defaults.queryStringObfuscation = qsRegex
596
- defaults['remoteConfig.enabled'] = true
597
- defaults['remoteConfig.pollInterval'] = 5 // seconds
598
- defaults.reportHostname = false
599
- defaults['runtimeMetrics.enabled'] = false
600
- defaults['runtimeMetrics.eventLoop'] = true
601
- defaults['runtimeMetrics.gc'] = true
602
- defaults.runtimeMetricsRuntimeId = false
603
- defaults.sampleRate = undefined
604
- defaults['sampler.rateLimit'] = 100
605
- defaults['sampler.rules'] = []
606
- defaults['sampler.spanSamplingRules'] = []
607
- defaults.scope = undefined
608
- defaults.service = service
609
- defaults.serviceMapping = {}
610
- defaults.site = 'datadoghq.com'
611
- defaults.spanAttributeSchema = 'v0'
612
- defaults.spanComputePeerService = false
613
- defaults.spanLeakDebug = 0
614
- defaults.spanRemoveIntegrationFromService = false
615
- defaults.startupLogs = false
616
- defaults['stats.enabled'] = false
617
- defaults.tags = {}
618
- defaults.tagsHeaderMaxLength = 512
619
- defaults['telemetry.debug'] = false
620
- defaults['telemetry.dependencyCollection'] = true
621
- defaults['telemetry.enabled'] = true
622
- defaults['telemetry.heartbeatInterval'] = 60_000
623
- defaults['telemetry.logCollection'] = true
624
- defaults['telemetry.metrics'] = true
625
- defaults.traceEnabled = true
626
- defaults.traceId128BitGenerationEnabled = true
627
- defaults.traceId128BitLoggingEnabled = true
628
- defaults.tracePropagationExtractFirst = false
629
- defaults.tracePropagationBehaviorExtract = 'continue'
630
- defaults['tracePropagationStyle.inject'] = ['datadog', 'tracecontext', 'baggage']
631
- defaults['tracePropagationStyle.extract'] = ['datadog', 'tracecontext', 'baggage']
632
- defaults['tracePropagationStyle.otelPropagators'] = false
633
- defaults.traceWebsocketMessagesEnabled = true
634
- defaults.traceWebsocketMessagesInheritSampling = true
635
- defaults.traceWebsocketMessagesSeparateTraces = true
636
- defaults.tracing = true
637
- defaults.url = undefined
638
- defaults.version = pkg.version
639
- defaults.instrumentation_config_id = undefined
640
- defaults['vertexai.spanCharLimit'] = 128
641
- defaults['vertexai.spanPromptCompletionSampleRate'] = 1
642
- defaults['trace.aws.addSpanPointers'] = true
643
- defaults['trace.dynamoDb.tablePrimaryKeys'] = undefined
644
- defaults['trace.nativeSpanEvents'] = false
442
+ setHiddenProperty(this, '_defaults', defaults)
645
443
  }
646
444
 
647
445
  _applyLocalStableConfig () {
@@ -844,10 +642,12 @@ class Config {
844
642
  tagger.add(tags, DD_TRACE_TAGS)
845
643
  tagger.add(tags, DD_TRACE_GLOBAL_TAGS)
846
644
 
847
- this._setBoolean(env, 'apmTracingEnabled', coalesce(
848
- DD_APM_TRACING_ENABLED,
849
- DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED)
850
- ))
645
+ this._setBoolean(
646
+ env,
647
+ 'apmTracingEnabled',
648
+ DD_APM_TRACING_ENABLED ??
649
+ (DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED))
650
+ )
851
651
  this._setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
852
652
  env['appsec.apiSecurity.sampleDelay'] = maybeFloat(DD_API_SECURITY_SAMPLE_DELAY)
853
653
  this._setBoolean(env, 'appsec.apiSecurity.endpointCollectionEnabled',
@@ -890,10 +690,7 @@ class Config {
890
690
  env.baggageTagKeys = DD_TRACE_BAGGAGE_TAG_KEYS
891
691
  this._setBoolean(env, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
892
692
  this._setString(env, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
893
- this._setBoolean(env, 'crashtracking.enabled', coalesce(
894
- DD_CRASHTRACKING_ENABLED,
895
- !this._isInServerlessEnvironment()
896
- ))
693
+ this._setBoolean(env, 'crashtracking.enabled', DD_CRASHTRACKING_ENABLED ?? !this._isInServerlessEnvironment())
897
694
  this._setBoolean(env, 'codeOriginForSpans.enabled', DD_CODE_ORIGIN_FOR_SPANS_ENABLED)
898
695
  this._setBoolean(
899
696
  env,
@@ -973,10 +770,8 @@ class Config {
973
770
  }
974
771
  this._setString(env, 'port', DD_TRACE_AGENT_PORT)
975
772
  const profilingEnabled = normalizeProfilingEnabledValue(
976
- coalesce(
977
- DD_PROFILING_ENABLED,
978
- this._isInServerlessEnvironment() ? 'false' : undefined
979
- )
773
+ DD_PROFILING_ENABLED ??
774
+ (this._isInServerlessEnvironment() ? 'false' : undefined)
980
775
  )
981
776
  this._setString(env, 'profiling.enabled', profilingEnabled)
982
777
  this._setString(env, 'profiling.exporters', DD_PROFILING_EXPORTERS)
@@ -988,10 +783,7 @@ class Config {
988
783
 
989
784
  this._setString(env, 'protocolVersion', DD_TRACE_AGENT_PROTOCOL_VERSION)
990
785
  this._setString(env, 'queryStringObfuscation', DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP)
991
- this._setBoolean(env, 'remoteConfig.enabled', coalesce(
992
- DD_REMOTE_CONFIGURATION_ENABLED,
993
- !this._isInServerlessEnvironment()
994
- ))
786
+ this._setBoolean(env, 'remoteConfig.enabled', DD_REMOTE_CONFIGURATION_ENABLED ?? !this._isInServerlessEnvironment())
995
787
  env['remoteConfig.pollInterval'] = maybeFloat(DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS)
996
788
  this._envUnprocessed['remoteConfig.pollInterval'] = DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS
997
789
  this._setBoolean(env, 'reportHostname', DD_TRACE_REPORT_HOSTNAME)
@@ -1004,10 +796,10 @@ class Config {
1004
796
  this._setBoolean(env, 'runtimeMetrics.eventLoop', DD_RUNTIME_METRICS_EVENT_LOOP_ENABLED)
1005
797
  this._setBoolean(env, 'runtimeMetrics.gc', DD_RUNTIME_METRICS_GC_ENABLED)
1006
798
  this._setBoolean(env, 'runtimeMetricsRuntimeId', DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED)
1007
- this._setArray(env, 'sampler.spanSamplingRules', reformatSpanSamplingRules(coalesce(
1008
- maybeJsonFile(DD_SPAN_SAMPLING_RULES_FILE),
799
+ this._setArray(env, 'sampler.spanSamplingRules', reformatSpanSamplingRules(
800
+ maybeJsonFile(DD_SPAN_SAMPLING_RULES_FILE) ??
1009
801
  safeJsonParse(DD_SPAN_SAMPLING_RULES)
1010
- )))
802
+ ))
1011
803
  this._setUnit(env, 'sampleRate', DD_TRACE_SAMPLE_RATE ||
1012
804
  getFromOtelSamplerMap(OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG))
1013
805
  env['sampler.rateLimit'] = DD_TRACE_RATE_LIMIT
@@ -1031,10 +823,8 @@ class Config {
1031
823
  this._setBoolean(env, 'startupLogs', DD_TRACE_STARTUP_LOGS)
1032
824
  this._setTags(env, 'tags', tags)
1033
825
  env.tagsHeaderMaxLength = DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH
1034
- this._setBoolean(env, 'telemetry.enabled', coalesce(
1035
- DD_INSTRUMENTATION_TELEMETRY_ENABLED,
1036
- !(this._isInServerlessEnvironment() || JEST_WORKER_ID)
1037
- ))
826
+ this._setBoolean(env, 'telemetry.enabled', DD_INSTRUMENTATION_TELEMETRY_ENABLED ??
827
+ !(this._isInServerlessEnvironment() || JEST_WORKER_ID))
1038
828
  this._setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
1039
829
  this._setBoolean(env, 'telemetry.debug', DD_TELEMETRY_DEBUG)
1040
830
  this._setBoolean(env, 'telemetry.dependencyCollection', DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED)
@@ -1079,10 +869,9 @@ class Config {
1079
869
 
1080
870
  tagger.add(tags, options.tags)
1081
871
 
1082
- this._setBoolean(opts, 'apmTracingEnabled', coalesce(
1083
- options.apmTracingEnabled,
1084
- options.experimental?.appsec?.standalone && !options.experimental.appsec.standalone.enabled
1085
- ))
872
+ this._setBoolean(opts, 'apmTracingEnabled', options.apmTracingEnabled ??
873
+ (options.experimental?.appsec?.standalone && !options.experimental.appsec.standalone.enabled)
874
+ )
1086
875
  this._setBoolean(opts, 'appsec.apiSecurity.enabled', options.appsec?.apiSecurity?.enabled)
1087
876
  this._setBoolean(opts, 'appsec.apiSecurity.endpointCollectionEnabled',
1088
877
  options.appsec?.apiSecurity?.endpointCollectionEnabled)
@@ -1156,7 +945,6 @@ class Config {
1156
945
  this._setString(opts, 'env', options.env || tags.env)
1157
946
  this._setBoolean(opts, 'experimental.enableGetRumData', options.experimental?.enableGetRumData)
1158
947
  this._setString(opts, 'experimental.exporter', options.experimental?.exporter)
1159
- this._setBoolean(opts, 'runtimeMetricsRuntimeId', options.runtimeMetricsRuntimeId)
1160
948
  opts.flushInterval = maybeInt(options.flushInterval)
1161
949
  this._optsUnprocessed.flushInterval = options.flushInterval
1162
950
  opts.flushMinSpans = maybeInt(options.flushMinSpans)
@@ -1208,9 +996,8 @@ class Config {
1208
996
  this._setBoolean(opts, 'runtimeMetrics.gc', options.runtimeMetrics?.gc)
1209
997
  this._setBoolean(opts, 'runtimeMetricsRuntimeId', options.runtimeMetricsRuntimeId)
1210
998
  this._setArray(opts, 'sampler.spanSamplingRules', reformatSpanSamplingRules(options.spanSamplingRules))
1211
- this._setUnit(opts, 'sampleRate', coalesce(options.sampleRate, options.ingestion.sampleRate))
1212
- const ingestion = options.ingestion || {}
1213
- opts['sampler.rateLimit'] = coalesce(options.rateLimit, ingestion.rateLimit)
999
+ this._setUnit(opts, 'sampleRate', options.sampleRate ?? options.ingestion.sampleRate)
1000
+ opts['sampler.rateLimit'] = maybeInt(options.rateLimit ?? options.ingestion.rateLimit)
1214
1001
  this._setSamplingRule(opts, 'sampler.rules', options.samplingRules)
1215
1002
  this._setString(opts, 'service', options.service || tags.service)
1216
1003
  opts.serviceMapping = options.serviceMapping
@@ -1243,17 +1030,11 @@ class Config {
1243
1030
  }
1244
1031
 
1245
1032
  _isCiVisibility () {
1246
- return coalesce(
1247
- this._optionsArg.isCiVisibility,
1248
- this._defaults.isCiVisibility
1249
- )
1033
+ return this._optionsArg.isCiVisibility ?? this._defaults.isCiVisibility
1250
1034
  }
1251
1035
 
1252
1036
  _isCiVisibilityItrEnabled () {
1253
- return coalesce(
1254
- getEnvironmentVariable('DD_CIVISIBILITY_ITR_ENABLED'),
1255
- true
1256
- )
1037
+ return getEnvironmentVariable('DD_CIVISIBILITY_ITR_ENABLED') ?? true
1257
1038
  }
1258
1039
 
1259
1040
  _getHostname () {
@@ -1261,30 +1042,24 @@ class Config {
1261
1042
  const url = DD_CIVISIBILITY_AGENTLESS_URL
1262
1043
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1263
1044
  : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1264
- const DD_AGENT_HOST = coalesce(
1265
- this._optionsArg.hostname,
1266
- getEnvironmentVariable('DD_AGENT_HOST'),
1267
- '127.0.0.1'
1268
- )
1269
- return DD_AGENT_HOST || (url && url.hostname)
1045
+ const DD_AGENT_HOST = this._optionsArg.hostname ??
1046
+ getEnvironmentVariable('DD_AGENT_HOST') ??
1047
+ defaults.hostname
1048
+ return DD_AGENT_HOST || url?.hostname
1270
1049
  }
1271
1050
 
1272
1051
  _getSpanComputePeerService () {
1273
1052
  const DD_TRACE_SPAN_ATTRIBUTE_SCHEMA = validateNamingVersion(
1274
- coalesce(
1275
- this._optionsArg.spanAttributeSchema,
1276
- getEnvironmentVariable('DD_TRACE_SPAN_ATTRIBUTE_SCHEMA')
1277
- )
1053
+ this._optionsArg.spanAttributeSchema ??
1054
+ getEnvironmentVariable('DD_TRACE_SPAN_ATTRIBUTE_SCHEMA')
1278
1055
  )
1279
1056
 
1280
1057
  const peerServiceSet = (
1281
1058
  this._optionsArg.hasOwnProperty('spanComputePeerService') ||
1282
1059
  getEnvironmentVariables().hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1283
1060
  )
1284
- const peerServiceValue = coalesce(
1285
- this._optionsArg.spanComputePeerService,
1061
+ const peerServiceValue = this._optionsArg.spanComputePeerService ??
1286
1062
  getEnvironmentVariable('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1287
- )
1288
1063
 
1289
1064
  const spanComputePeerService = (
1290
1065
  DD_TRACE_SPAN_ATTRIBUTE_SCHEMA === 'v0'
@@ -1298,36 +1073,28 @@ class Config {
1298
1073
  }
1299
1074
 
1300
1075
  _isCiVisibilityGitUploadEnabled () {
1301
- return coalesce(
1302
- getEnvironmentVariable('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED'),
1303
- true
1304
- )
1076
+ return getEnvironmentVariable('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED') ?? true
1305
1077
  }
1306
1078
 
1307
1079
  _isCiVisibilityManualApiEnabled () {
1308
- return coalesce(
1309
- getEnvironmentVariable('DD_CIVISIBILITY_MANUAL_API_ENABLED'),
1310
- true
1311
- )
1080
+ return getEnvironmentVariable('DD_CIVISIBILITY_MANUAL_API_ENABLED') ?? true
1312
1081
  }
1313
1082
 
1314
1083
  _isTraceStatsComputationEnabled () {
1315
1084
  const apmTracingEnabled = this._options.apmTracingEnabled !== false &&
1316
1085
  this._env.apmTracingEnabled !== false
1317
1086
 
1318
- return apmTracingEnabled && coalesce(
1319
- this._optionsArg.stats,
1320
- getEnvironmentVariable('DD_TRACE_STATS_COMPUTATION_ENABLED'),
1321
- getIsGCPFunction() || getIsAzureFunction()
1087
+ return apmTracingEnabled && (
1088
+ this._optionsArg.stats ??
1089
+ getEnvironmentVariable('DD_TRACE_STATS_COMPUTATION_ENABLED') ??
1090
+ (getIsGCPFunction() || getIsAzureFunction())
1322
1091
  )
1323
1092
  }
1324
1093
 
1325
1094
  _getTraceAgentUrl () {
1326
- return coalesce(
1327
- this._optionsArg.url,
1328
- getEnvironmentVariable('DD_TRACE_AGENT_URL'),
1095
+ return this._optionsArg.url ??
1096
+ getEnvironmentVariable('DD_TRACE_AGENT_URL') ??
1329
1097
  null
1330
- )
1331
1098
  }
1332
1099
 
1333
1100
  // handles values calculated from a mixture of options and env vars
@@ -1351,11 +1118,9 @@ class Config {
1351
1118
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1352
1119
  : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1353
1120
  if (this._isCiVisibility()) {
1354
- this._setBoolean(calc, 'isEarlyFlakeDetectionEnabled',
1355
- coalesce(DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED, true))
1356
- this._setBoolean(calc, 'isFlakyTestRetriesEnabled',
1357
- coalesce(DD_CIVISIBILITY_FLAKY_RETRY_ENABLED, true))
1358
- calc.flakyTestRetriesCount = coalesce(maybeInt(DD_CIVISIBILITY_FLAKY_RETRY_COUNT), 5)
1121
+ this._setBoolean(calc, 'isEarlyFlakeDetectionEnabled', DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED ?? true)
1122
+ this._setBoolean(calc, 'isFlakyTestRetriesEnabled', DD_CIVISIBILITY_FLAKY_RETRY_ENABLED ?? true)
1123
+ calc.flakyTestRetriesCount = maybeInt(DD_CIVISIBILITY_FLAKY_RETRY_COUNT) ?? 5
1359
1124
  this._setBoolean(calc, 'isIntelligentTestRunnerEnabled', isTrue(this._isCiVisibilityItrEnabled()))
1360
1125
  this._setBoolean(calc, 'isManualApiEnabled', !isFalse(this._isCiVisibilityManualApiEnabled()))
1361
1126
  this._setString(calc, 'ciVisibilityTestSessionName', DD_TEST_SESSION_NAME)
@@ -1363,7 +1128,7 @@ class Config {
1363
1128
  this._setBoolean(calc, 'isTestDynamicInstrumentationEnabled', !isFalse(DD_TEST_FAILED_TEST_REPLAY_ENABLED))
1364
1129
  this._setBoolean(calc, 'isServiceUserProvided', !!this._env.service)
1365
1130
  this._setBoolean(calc, 'isTestManagementEnabled', !isFalse(DD_TEST_MANAGEMENT_ENABLED))
1366
- calc.testManagementAttemptToFixRetries = coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20)
1131
+ calc.testManagementAttemptToFixRetries = maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES) ?? 20
1367
1132
  this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED))
1368
1133
  }
1369
1134
  calc['dogstatsd.hostname'] = this._getHostname()