dd-trace 5.86.0 → 5.88.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 (105) hide show
  1. package/LICENSE-3rdparty.csv +60 -32
  2. package/ext/exporters.d.ts +1 -0
  3. package/ext/exporters.js +1 -0
  4. package/index.d.ts +243 -7
  5. package/package.json +9 -6
  6. package/packages/datadog-instrumentations/src/ai.js +54 -90
  7. package/packages/datadog-instrumentations/src/cucumber.js +14 -0
  8. package/packages/datadog-instrumentations/src/helpers/hook.js +17 -11
  9. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  10. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +55 -14
  11. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +15 -13
  12. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/ai.js +103 -0
  13. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.js +108 -0
  14. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -1
  15. package/packages/datadog-instrumentations/src/helpers/rewriter/transformer.js +21 -0
  16. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +138 -12
  17. package/packages/datadog-instrumentations/src/http/client.js +119 -1
  18. package/packages/datadog-instrumentations/src/jest.js +179 -15
  19. package/packages/datadog-instrumentations/src/kafkajs.js +20 -17
  20. package/packages/datadog-instrumentations/src/mocha/utils.js +6 -0
  21. package/packages/datadog-instrumentations/src/mysql2.js +131 -64
  22. package/packages/datadog-instrumentations/src/playwright.js +9 -1
  23. package/packages/datadog-instrumentations/src/stripe.js +92 -0
  24. package/packages/datadog-instrumentations/src/vitest.js +11 -0
  25. package/packages/datadog-plugin-amqplib/src/consumer.js +14 -10
  26. package/packages/datadog-plugin-amqplib/src/producer.js +23 -19
  27. package/packages/datadog-plugin-azure-functions/src/index.js +53 -37
  28. package/packages/datadog-plugin-bullmq/src/consumer.js +33 -11
  29. package/packages/datadog-plugin-bullmq/src/producer.js +60 -31
  30. package/packages/datadog-plugin-cucumber/src/index.js +9 -6
  31. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +33 -0
  32. package/packages/datadog-plugin-cypress/src/support.js +48 -8
  33. package/packages/datadog-plugin-jest/src/index.js +12 -2
  34. package/packages/datadog-plugin-jest/src/util.js +2 -1
  35. package/packages/datadog-plugin-kafkajs/src/consumer.js +22 -12
  36. package/packages/datadog-plugin-kafkajs/src/producer.js +33 -22
  37. package/packages/datadog-plugin-mocha/src/index.js +9 -6
  38. package/packages/datadog-plugin-playwright/src/index.js +10 -6
  39. package/packages/datadog-plugin-vitest/src/index.js +13 -8
  40. package/packages/dd-trace/src/appsec/addresses.js +11 -0
  41. package/packages/dd-trace/src/appsec/channels.js +5 -1
  42. package/packages/dd-trace/src/appsec/downstream_requests.js +302 -0
  43. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  44. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  45. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  46. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +4 -5
  47. package/packages/dd-trace/src/appsec/iast/path-line.js +36 -25
  48. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  49. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +3 -4
  50. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +3 -2
  51. package/packages/dd-trace/src/appsec/index.js +103 -0
  52. package/packages/dd-trace/src/appsec/rasp/ssrf.js +66 -4
  53. package/packages/dd-trace/src/azure_metadata.js +0 -2
  54. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +14 -1
  55. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  56. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +2 -0
  57. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  58. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -1
  59. package/packages/dd-trace/src/ci-visibility/requests/request.js +236 -0
  60. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  61. package/packages/dd-trace/src/config/defaults.js +148 -195
  62. package/packages/dd-trace/src/config/helper.js +43 -1
  63. package/packages/dd-trace/src/config/index.js +42 -14
  64. package/packages/dd-trace/src/config/supported-configurations.json +4115 -510
  65. package/packages/dd-trace/src/constants.js +0 -2
  66. package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -3
  67. package/packages/dd-trace/src/datastreams/pathway.js +22 -3
  68. package/packages/dd-trace/src/datastreams/processor.js +14 -1
  69. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +47 -2
  70. package/packages/dd-trace/src/debugger/devtools_client/index.js +75 -23
  71. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +23 -1
  72. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +3 -3
  73. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +168 -36
  74. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +18 -0
  75. package/packages/dd-trace/src/encode/agentless-json.js +141 -0
  76. package/packages/dd-trace/src/exporter.js +2 -0
  77. package/packages/dd-trace/src/exporters/agent/writer.js +22 -8
  78. package/packages/dd-trace/src/exporters/agentless/index.js +89 -0
  79. package/packages/dd-trace/src/exporters/agentless/writer.js +184 -0
  80. package/packages/dd-trace/src/exporters/common/agents.js +1 -1
  81. package/packages/dd-trace/src/exporters/common/request.js +4 -4
  82. package/packages/dd-trace/src/llmobs/constants/writers.js +1 -1
  83. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +5 -3
  84. package/packages/dd-trace/src/llmobs/sdk.js +34 -5
  85. package/packages/dd-trace/src/opentelemetry/context_manager.js +19 -46
  86. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +3 -4
  87. package/packages/dd-trace/src/opentracing/propagation/text_map.js +3 -5
  88. package/packages/dd-trace/src/opentracing/span.js +6 -4
  89. package/packages/dd-trace/src/plugins/ci_plugin.js +57 -5
  90. package/packages/dd-trace/src/plugins/database.js +57 -45
  91. package/packages/dd-trace/src/plugins/outbound.js +27 -2
  92. package/packages/dd-trace/src/plugins/tracing.js +39 -4
  93. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +7 -0
  94. package/packages/dd-trace/src/plugins/util/test.js +48 -0
  95. package/packages/dd-trace/src/plugins/util/web.js +8 -7
  96. package/packages/dd-trace/src/profiling/exporter_cli.js +1 -0
  97. package/packages/dd-trace/src/propagation-hash/index.js +145 -0
  98. package/packages/dd-trace/src/proxy.js +4 -0
  99. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  100. package/packages/dd-trace/src/startup-log.js +3 -3
  101. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +0 -106
  102. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -741
  103. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +0 -11
  104. package/packages/dd-trace/src/plugins/util/serverless.js +0 -8
  105. package/packages/dd-trace/src/scope/noop/scope.js +0 -21
@@ -62,7 +62,7 @@ module.exports = getConfig
62
62
  class Config {
63
63
  /**
64
64
  * parsed DD_TAGS, usable as a standalone tag set across products
65
- * @type {Record<string, string> | undefined}
65
+ * @type {Record<string, string>}
66
66
  */
67
67
  #parsedDdTags = {}
68
68
  #envUnprocessed = {}
@@ -89,6 +89,8 @@ class Config {
89
89
 
90
90
  options = {
91
91
  ...options,
92
+ // TODO(BridgeAR): Remove the experimental prefix once we have a major version.
93
+ // That also applies to index.d.ts
92
94
  appsec: options.appsec == null ? options.experimental?.appsec : options.appsec,
93
95
  iast: options.iast == null ? options.experimental?.iast : options.iast,
94
96
  }
@@ -162,7 +164,7 @@ class Config {
162
164
  * Set the configuration with remote config settings.
163
165
  * Applies remote configuration, recalculates derived values, and merges all configuration sources.
164
166
  *
165
- * @param {import('./config/remote_config').RemoteConfigOptions|null} options - Configurations received via Remote
167
+ * @param {import('./remote_config').RemoteConfigOptions|null} options - Configurations received via Remote
166
168
  * Config or null to reset all remote configuration
167
169
  */
168
170
  setRemoteConfig (options) {
@@ -255,6 +257,8 @@ class Config {
255
257
  DD_API_SECURITY_SAMPLE_DELAY,
256
258
  DD_API_SECURITY_ENDPOINT_COLLECTION_ENABLED,
257
259
  DD_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT,
260
+ DD_API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE,
261
+ DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS,
258
262
  DD_APM_TRACING_ENABLED,
259
263
  DD_APP_KEY,
260
264
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
@@ -281,6 +285,7 @@ class Config {
281
285
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED,
282
286
  DD_DATA_STREAMS_ENABLED,
283
287
  DD_DBM_PROPAGATION_MODE,
288
+ DD_DBM_INJECT_SQL_BASEHASH,
284
289
  DD_DOGSTATSD_HOST,
285
290
  DD_DOGSTATSD_PORT,
286
291
  DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS,
@@ -366,7 +371,6 @@ class Config {
366
371
  DD_TRACE_EXPERIMENTAL_GET_RUM_DATA_ENABLED,
367
372
  DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED,
368
373
  DD_TRACE_GIT_METADATA_ENABLED,
369
- DD_TRACE_GLOBAL_TAGS,
370
374
  DD_TRACE_GRAPHQL_ERROR_EXTENSIONS,
371
375
  DD_TRACE_HEADER_TAGS,
372
376
  DD_TRACE_LEGACY_BAGGAGE_ENABLED,
@@ -433,13 +437,11 @@ class Config {
433
437
 
434
438
  const tags = {}
435
439
 
436
- const parsedDdTags = parseSpaceSeparatedTags(DD_TAGS)
437
- tagger.add(this.#parsedDdTags, parsedDdTags)
438
-
439
440
  tagger.add(tags, parseSpaceSeparatedTags(handleOtel(OTEL_RESOURCE_ATTRIBUTES)))
440
- tagger.add(tags, parsedDdTags)
441
+ tagger.add(tags, parseSpaceSeparatedTags(DD_TAGS))
441
442
  tagger.add(tags, DD_TRACE_TAGS)
442
- tagger.add(tags, DD_TRACE_GLOBAL_TAGS)
443
+
444
+ Object.assign(this.#parsedDdTags, tags)
443
445
 
444
446
  setString(target, 'apiKey', DD_API_KEY)
445
447
  setBoolean(target, 'otelLogsEnabled', DD_LOGS_OTEL_ENABLED)
@@ -540,9 +542,13 @@ class Config {
540
542
  unprocessedTarget['appsec.stackTrace.maxStackTraces'] = DD_APPSEC_MAX_STACK_TRACES
541
543
  target['appsec.wafTimeout'] = maybeInt(DD_APPSEC_WAF_TIMEOUT)
542
544
  unprocessedTarget['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
545
+ target['appsec.apiSecurity.downstreamBodyAnalysisSampleRate'] =
546
+ maybeFloat(DD_API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE)
547
+ target['appsec.apiSecurity.maxDownstreamRequestBodyAnalysis'] =
548
+ maybeInt(DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS)
543
549
  target.baggageMaxBytes = DD_TRACE_BAGGAGE_MAX_BYTES
544
550
  target.baggageMaxItems = DD_TRACE_BAGGAGE_MAX_ITEMS
545
- target.baggageTagKeys = DD_TRACE_BAGGAGE_TAG_KEYS
551
+ setArray(target, 'baggageTagKeys', DD_TRACE_BAGGAGE_TAG_KEYS)
546
552
  setBoolean(target, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
547
553
  setString(target, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
548
554
  if (DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING || DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING) {
@@ -568,6 +574,7 @@ class Config {
568
574
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED
569
575
  )
570
576
  setString(target, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
577
+ setBoolean(target, 'dbm.injectSqlBaseHash', DD_DBM_INJECT_SQL_BASEHASH)
571
578
  setString(target, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
572
579
  setString(target, 'dogstatsd.port', DD_DOGSTATSD_PORT)
573
580
  setBoolean(target, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
@@ -642,6 +649,7 @@ class Config {
642
649
  setString(target, 'installSignature.id', DD_INSTRUMENTATION_INSTALL_ID)
643
650
  setString(target, 'installSignature.time', DD_INSTRUMENTATION_INSTALL_TIME)
644
651
  setString(target, 'installSignature.type', DD_INSTRUMENTATION_INSTALL_TYPE)
652
+ // TODO: Why is DD_INJECTION_ENABLED a comma separated list?
645
653
  setArray(target, 'injectionEnabled', DD_INJECTION_ENABLED)
646
654
  if (DD_INJECTION_ENABLED !== undefined) {
647
655
  setString(target, 'instrumentationSource', DD_INJECTION_ENABLED ? 'ssi' : 'manual')
@@ -701,8 +709,11 @@ class Config {
701
709
  maybeJsonFile(DD_SPAN_SAMPLING_RULES_FILE) ??
702
710
  safeJsonParse(DD_SPAN_SAMPLING_RULES)
703
711
  ))
704
- setUnit(target, 'sampleRate', DD_TRACE_SAMPLE_RATE ||
705
- getFromOtelSamplerMap(OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG))
712
+ setUnit(
713
+ target,
714
+ 'sampleRate',
715
+ DD_TRACE_SAMPLE_RATE || getFromOtelSamplerMap(OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG)
716
+ )
706
717
  target['sampler.rateLimit'] = DD_TRACE_RATE_LIMIT
707
718
  setSamplingRule(target, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
708
719
  unprocessedTarget['sampler.rules'] = DD_TRACE_SAMPLING_RULES
@@ -743,7 +754,7 @@ class Config {
743
754
  setBoolean(target, 'telemetry.debug', DD_TELEMETRY_DEBUG)
744
755
  setBoolean(target, 'telemetry.dependencyCollection', DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED)
745
756
  target['telemetry.heartbeatInterval'] = maybeInt(Math.floor(DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000))
746
- unprocessedTarget['telemetry.heartbeatInterval'] = DD_TELEMETRY_HEARTBEAT_INTERVAL * 1000
757
+ unprocessedTarget['telemetry.heartbeatInterval'] = DD_TELEMETRY_HEARTBEAT_INTERVAL
747
758
  setBoolean(target, 'telemetry.logCollection', DD_TELEMETRY_LOG_COLLECTION_ENABLED)
748
759
  setBoolean(target, 'telemetry.metrics', DD_TELEMETRY_METRICS_ENABLED)
749
760
  setBoolean(target, 'traceId128BitGenerationEnabled', DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED)
@@ -886,7 +897,7 @@ class Config {
886
897
  opts['cloudPayloadTagging.maxDepth'] = maybeInt(options.cloudPayloadTagging?.maxDepth)
887
898
  opts.baggageMaxBytes = options.baggageMaxBytes
888
899
  opts.baggageMaxItems = options.baggageMaxItems
889
- opts.baggageTagKeys = options.baggageTagKeys
900
+ setArray(opts, 'baggageTagKeys', options.baggageTagKeys)
890
901
  setBoolean(opts, 'codeOriginForSpans.enabled', options.codeOriginForSpans?.enabled)
891
902
  setBoolean(
892
903
  opts,
@@ -894,6 +905,7 @@ class Config {
894
905
  options.codeOriginForSpans?.experimental?.exit_spans?.enabled
895
906
  )
896
907
  setString(opts, 'dbmPropagationMode', options.dbmPropagationMode)
908
+ setBoolean(opts, 'dbm.injectSqlBaseHash', options.dbm?.injectSqlBaseHash)
897
909
  if (options.dogstatsd) {
898
910
  setString(opts, 'dogstatsd.hostname', options.dogstatsd.hostname)
899
911
  setString(opts, 'dogstatsd.port', options.dogstatsd.port)
@@ -1091,6 +1103,21 @@ class Config {
1091
1103
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1092
1104
  : getAgentUrl(this.#getTraceAgentUrl(), this.#optionsArg)
1093
1105
 
1106
+ // Experimental agentless APM span intake
1107
+ // When enabled, sends spans directly to Datadog intake without an agent
1108
+ const agentlessEnabled = isTrue(getEnv('_DD_APM_TRACING_AGENTLESS_ENABLED'))
1109
+ if (agentlessEnabled) {
1110
+ setString(calc, 'experimental.exporter', 'agentless')
1111
+ // Disable rate limiting - server-side sampling will be used
1112
+ calc['sampler.rateLimit'] = -1
1113
+ // Disable client-side stats computation
1114
+ setBoolean(calc, 'stats.enabled', false)
1115
+ // Enable hostname reporting
1116
+ setBoolean(calc, 'reportHostname', true)
1117
+ // Clear sampling rules - server-side sampling handles this
1118
+ calc['sampler.rules'] = []
1119
+ }
1120
+
1094
1121
  if (this.#isCiVisibility()) {
1095
1122
  setBoolean(calc, 'isEarlyFlakeDetectionEnabled',
1096
1123
  getEnv('DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED') ?? true)
@@ -1123,6 +1150,7 @@ class Config {
1123
1150
  calc.otelLogsUrl = `http://${agentHostname}:${DEFAULT_OTLP_PORT}`
1124
1151
  calc.otelMetricsUrl = `http://${agentHostname}:${DEFAULT_OTLP_PORT}/v1/metrics`
1125
1152
  calc.otelUrl = `http://${agentHostname}:${DEFAULT_OTLP_PORT}`
1153
+ calc['telemetry.heartbeatInterval'] = maybeInt(Math.floor(this.#defaults['telemetry.heartbeatInterval'] * 1000))
1126
1154
 
1127
1155
  setBoolean(calc, 'isGitUploadEnabled',
1128
1156
  calc.isIntelligentTestRunnerEnabled && !isFalse(getEnv('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED')))
@@ -1150,7 +1178,7 @@ class Config {
1150
1178
  /**
1151
1179
  * Applies remote configuration options from APM_TRACING configs.
1152
1180
  *
1153
- * @param {import('./config/remote_config').RemoteConfigOptions} options - Configurations received via Remote Config
1181
+ * @param {import('./remote_config').RemoteConfigOptions} options - Configurations received via Remote Config
1154
1182
  */
1155
1183
  #applyRemoteConfig (options) {
1156
1184
  const opts = this.#remote