dd-trace 5.53.0 → 5.55.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 (368) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/index.d.ts +33 -16
  6. package/initialize.mjs +5 -6
  7. package/package.json +40 -38
  8. package/packages/datadog-code-origin/index.js +22 -4
  9. package/packages/datadog-core/src/utils/src/get.js +1 -1
  10. package/packages/datadog-core/src/utils/src/has.js +1 -1
  11. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  12. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  13. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  14. package/packages/datadog-core/src/utils/src/set.js +1 -1
  15. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  16. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  17. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  18. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/cassandra-driver.js +10 -10
  21. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  22. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
  23. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  24. package/packages/datadog-instrumentations/src/couchbase.js +6 -9
  25. package/packages/datadog-instrumentations/src/cucumber.js +108 -68
  26. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  27. package/packages/datadog-instrumentations/src/dns.js +5 -5
  28. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  29. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  30. package/packages/datadog-instrumentations/src/fs.js +1 -1
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
  32. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  33. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  34. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  35. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  36. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  37. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  38. package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
  39. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  40. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  41. package/packages/datadog-instrumentations/src/helpers/register.js +11 -12
  42. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  43. package/packages/datadog-instrumentations/src/jest.js +201 -143
  44. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  45. package/packages/datadog-instrumentations/src/knex.js +4 -4
  46. package/packages/datadog-instrumentations/src/koa.js +2 -3
  47. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +49 -65
  49. package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
  50. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  51. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  52. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  53. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  54. package/packages/datadog-instrumentations/src/mysql.js +30 -37
  55. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  56. package/packages/datadog-instrumentations/src/net.js +1 -1
  57. package/packages/datadog-instrumentations/src/next.js +1 -0
  58. package/packages/datadog-instrumentations/src/nyc.js +3 -2
  59. package/packages/datadog-instrumentations/src/openai.js +22 -24
  60. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  61. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  62. package/packages/datadog-instrumentations/src/pg.js +3 -5
  63. package/packages/datadog-instrumentations/src/playwright.js +123 -83
  64. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  65. package/packages/datadog-instrumentations/src/redis.js +4 -4
  66. package/packages/datadog-instrumentations/src/restify.js +9 -13
  67. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  68. package/packages/datadog-instrumentations/src/router.js +30 -32
  69. package/packages/datadog-instrumentations/src/tedious.js +2 -3
  70. package/packages/datadog-instrumentations/src/vitest.js +87 -52
  71. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  72. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  73. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  74. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  75. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  76. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  77. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  78. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  79. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  80. package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
  81. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  82. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  83. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  84. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
  85. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  86. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
  87. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
  88. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  89. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  90. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
  91. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
  92. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  93. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  94. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  95. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  96. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  97. package/packages/datadog-plugin-cucumber/src/index.js +60 -4
  98. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
  99. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  100. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  101. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  102. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  103. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  104. package/packages/datadog-plugin-express/src/index.js +10 -12
  105. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  106. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  107. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  108. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  109. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +27 -10
  110. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  111. package/packages/datadog-plugin-graphql/src/index.js +10 -8
  112. package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
  113. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  114. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  115. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  116. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  117. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  118. package/packages/datadog-plugin-http/src/client.js +23 -13
  119. package/packages/datadog-plugin-http2/src/client.js +24 -25
  120. package/packages/datadog-plugin-jest/src/index.js +26 -23
  121. package/packages/datadog-plugin-jest/src/util.js +8 -8
  122. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  123. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  124. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  125. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  126. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  127. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  128. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  129. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  130. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  131. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  132. package/packages/datadog-plugin-mocha/src/index.js +39 -14
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
  134. package/packages/datadog-plugin-mysql/src/index.js +22 -9
  135. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  136. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  137. package/packages/datadog-plugin-next/src/index.js +7 -6
  138. package/packages/datadog-plugin-openai/src/services.js +6 -10
  139. package/packages/datadog-plugin-openai/src/tracing.js +12 -18
  140. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  141. package/packages/datadog-plugin-playwright/src/index.js +25 -4
  142. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  143. package/packages/datadog-plugin-redis/src/index.js +2 -4
  144. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  145. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  146. package/packages/datadog-plugin-router/src/index.js +1 -1
  147. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  148. package/packages/datadog-plugin-vitest/src/index.js +52 -35
  149. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  150. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  151. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  152. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  153. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  154. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  158. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +5 -8
  159. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  160. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  161. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  162. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  163. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  165. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  166. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  167. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +16 -24
  168. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  169. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  170. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  171. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  172. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -8
  173. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  174. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  175. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +7 -8
  176. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  177. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +7 -7
  178. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
  179. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  180. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -28
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  185. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  186. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  187. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  188. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  189. package/packages/dd-trace/src/appsec/index.js +5 -5
  190. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  191. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  192. package/packages/dd-trace/src/appsec/reporter.js +232 -41
  193. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  194. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  195. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  196. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  197. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  198. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  199. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  200. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  201. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -4
  202. package/packages/dd-trace/src/azure_metadata.js +9 -9
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
  204. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  205. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +3 -2
  206. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +3 -2
  208. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
  209. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  211. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -5
  212. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  214. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +3 -2
  215. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
  216. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
  217. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  218. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +3 -2
  219. package/packages/dd-trace/src/config-helper.js +89 -0
  220. package/packages/dd-trace/src/config.js +159 -129
  221. package/packages/dd-trace/src/config_stable.js +10 -7
  222. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  223. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  224. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  225. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  226. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +7 -7
  227. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  228. package/packages/dd-trace/src/datastreams/size.js +1 -1
  229. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +75 -69
  230. package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
  231. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
  233. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  234. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  235. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  236. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  237. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
  239. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  240. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  241. package/packages/dd-trace/src/debugger/index.js +1 -0
  242. package/packages/dd-trace/src/dogstatsd.js +7 -6
  243. package/packages/dd-trace/src/encode/0.4.js +14 -11
  244. package/packages/dd-trace/src/encode/0.5.js +4 -6
  245. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
  246. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  247. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  248. package/packages/dd-trace/src/exporter.js +7 -6
  249. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  250. package/packages/dd-trace/src/exporters/common/docker.js +4 -3
  251. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  252. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  253. package/packages/dd-trace/src/exporters/common/util.js +4 -2
  254. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  255. package/packages/dd-trace/src/flare/file.js +1 -5
  256. package/packages/dd-trace/src/format.js +1 -1
  257. package/packages/dd-trace/src/git_properties.js +1 -1
  258. package/packages/dd-trace/src/id.js +15 -9
  259. package/packages/dd-trace/src/iitm.js +10 -22
  260. package/packages/dd-trace/src/index.js +4 -3
  261. package/packages/dd-trace/src/lambda/handler.js +7 -6
  262. package/packages/dd-trace/src/lambda/index.js +2 -1
  263. package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
  264. package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
  265. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  266. package/packages/dd-trace/src/llmobs/index.js +21 -5
  267. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  268. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  269. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  270. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  271. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  272. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  273. package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
  274. package/packages/dd-trace/src/llmobs/sdk.js +4 -3
  275. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  276. package/packages/dd-trace/src/llmobs/tagger.js +129 -102
  277. package/packages/dd-trace/src/llmobs/util.js +9 -9
  278. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  279. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  280. package/packages/dd-trace/src/log/index.js +9 -8
  281. package/packages/dd-trace/src/log/log.js +1 -1
  282. package/packages/dd-trace/src/log/writer.js +3 -4
  283. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  284. package/packages/dd-trace/src/msgpack/encoder.js +31 -31
  285. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  286. package/packages/dd-trace/src/noop/span.js +4 -6
  287. package/packages/dd-trace/src/noop/tracer.js +1 -2
  288. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  289. package/packages/dd-trace/src/opentelemetry/tracer.js +7 -6
  290. package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
  291. package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
  292. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  293. package/packages/dd-trace/src/opentracing/span.js +16 -20
  294. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  295. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  296. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  297. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  298. package/packages/dd-trace/src/pkg.js +1 -1
  299. package/packages/dd-trace/src/plugin_manager.js +4 -3
  300. package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
  301. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  302. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  303. package/packages/dd-trace/src/plugins/index.js +0 -1
  304. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  305. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  306. package/packages/dd-trace/src/plugins/producer.js +2 -2
  307. package/packages/dd-trace/src/plugins/storage.js +2 -2
  308. package/packages/dd-trace/src/plugins/util/ci.js +28 -20
  309. package/packages/dd-trace/src/plugins/util/git.js +166 -12
  310. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  311. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  313. package/packages/dd-trace/src/plugins/util/stacktrace.js +9 -2
  314. package/packages/dd-trace/src/plugins/util/test.js +315 -51
  315. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  316. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  317. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -4
  318. package/packages/dd-trace/src/plugins/util/web.js +8 -8
  319. package/packages/dd-trace/src/priority_sampler.js +64 -53
  320. package/packages/dd-trace/src/profiling/config.js +51 -35
  321. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  322. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  323. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
  324. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  325. package/packages/dd-trace/src/profiling/index.js +2 -1
  326. package/packages/dd-trace/src/profiling/profiler.js +44 -6
  327. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  328. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  329. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  330. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  331. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  332. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  333. package/packages/dd-trace/src/profiling/tagger.js +21 -13
  334. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  335. package/packages/dd-trace/src/proxy.js +9 -10
  336. package/packages/dd-trace/src/random_sampler.js +40 -0
  337. package/packages/dd-trace/src/rate_limiter.js +4 -4
  338. package/packages/dd-trace/src/remote_config/index.js +3 -7
  339. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  340. package/packages/dd-trace/src/require-package-json.js +1 -1
  341. package/packages/dd-trace/src/ritm.js +8 -8
  342. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
  343. package/packages/dd-trace/src/sampler.js +41 -4
  344. package/packages/dd-trace/src/sampling_rule.js +12 -3
  345. package/packages/dd-trace/src/scope.js +1 -1
  346. package/packages/dd-trace/src/serverless.js +11 -4
  347. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  348. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  349. package/packages/dd-trace/src/span_processor.js +5 -4
  350. package/packages/dd-trace/src/span_sampler.js +4 -1
  351. package/packages/dd-trace/src/standalone/tracesource.js +2 -3
  352. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  353. package/packages/dd-trace/src/startup-log.js +6 -18
  354. package/packages/dd-trace/src/supported-configurations.json +439 -0
  355. package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
  356. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  357. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  358. package/packages/dd-trace/src/telemetry/send-data.js +8 -7
  359. package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
  360. package/packages/dd-trace/src/tracer.js +3 -7
  361. package/packages/dd-trace/src/util.js +1 -6
  362. package/version.js +1 -0
  363. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  364. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  365. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  366. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
  367. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
  368. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -19,6 +19,7 @@ const telemetryMetrics = require('./telemetry/metrics')
19
19
  const { isInServerlessEnvironment, getIsGCPFunction, getIsAzureFunction } = require('./serverless')
20
20
  const { ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES } = require('./constants')
21
21
  const { appendRules } = require('./payload-tagging/config')
22
+ const { getEnvironmentVariable, getEnvironmentVariables } = require('./config-helper')
22
23
 
23
24
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
24
25
 
@@ -80,10 +81,10 @@ function getFromOtelSamplerMap (otelTracesSampler, otelTracesSamplerArg) {
80
81
  }
81
82
 
82
83
  function validateOtelPropagators (propagators) {
83
- if (!process.env.PROPAGATION_STYLE_EXTRACT &&
84
- !process.env.PROPAGATION_STYLE_INJECT &&
85
- !process.env.DD_TRACE_PROPAGATION_STYLE &&
86
- process.env.OTEL_PROPAGATORS) {
84
+ if (!getEnvironmentVariable('PROPAGATION_STYLE_EXTRACT') &&
85
+ !getEnvironmentVariable('PROPAGATION_STYLE_INJECT') &&
86
+ !getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') &&
87
+ getEnvironmentVariable('OTEL_PROPAGATORS')) {
87
88
  for (const style in propagators) {
88
89
  if (!VALID_PROPAGATION_STYLES.has(style)) {
89
90
  log.warn('unexpected value for OTEL_PROPAGATORS environment variable')
@@ -94,7 +95,7 @@ function validateOtelPropagators (propagators) {
94
95
  }
95
96
 
96
97
  function validateEnvVarType (envVar) {
97
- const value = process.env[envVar]
98
+ const value = getEnvironmentVariable(envVar)
98
99
  switch (envVar) {
99
100
  case 'OTEL_LOG_LEVEL':
100
101
  return VALID_LOG_LEVELS.has(value)
@@ -103,9 +104,9 @@ function validateEnvVarType (envVar) {
103
104
  case 'OTEL_SERVICE_NAME':
104
105
  return typeof value === 'string'
105
106
  case 'OTEL_TRACES_SAMPLER':
106
- return getFromOtelSamplerMap(value, process.env.OTEL_TRACES_SAMPLER_ARG) !== undefined
107
+ return getFromOtelSamplerMap(value, getEnvironmentVariable('OTEL_TRACES_SAMPLER_ARG')) !== undefined
107
108
  case 'OTEL_TRACES_SAMPLER_ARG':
108
- return !isNaN(parseFloat(value))
109
+ return !Number.isNaN(Number.parseFloat(value))
109
110
  case 'OTEL_SDK_DISABLED':
110
111
  return value.toLowerCase() === 'true' || value.toLowerCase() === 'false'
111
112
  case 'OTEL_TRACES_EXPORTER':
@@ -119,27 +120,24 @@ function validateEnvVarType (envVar) {
119
120
 
120
121
  function checkIfBothOtelAndDdEnvVarSet () {
121
122
  for (const [otelEnvVar, ddEnvVar] of Object.entries(otelDdEnvMapping)) {
122
- if (ddEnvVar && process.env[ddEnvVar] && process.env[otelEnvVar]) {
123
+ if (ddEnvVar && getEnvironmentVariable(ddEnvVar) && getEnvironmentVariable(otelEnvVar)) {
123
124
  log.warn(`both ${ddEnvVar} and ${otelEnvVar} environment variables are set`)
124
125
  getCounter('otel.env.hiding', ddEnvVar, otelEnvVar).inc()
125
126
  }
126
127
 
127
- if (process.env[otelEnvVar] && !validateEnvVarType(otelEnvVar)) {
128
+ if (getEnvironmentVariable(otelEnvVar) && !validateEnvVarType(otelEnvVar)) {
128
129
  log.warn(`unexpected value for ${otelEnvVar} environment variable`)
129
130
  getCounter('otel.env.invalid', ddEnvVar, otelEnvVar).inc()
130
131
  }
131
132
  }
132
133
  }
133
134
 
134
- const fromEntries = Object.fromEntries || (entries =>
135
- entries.reduce((obj, [k, v]) => Object.assign(obj, { [k]: v }), {}))
136
-
137
- // eslint-disable-next-line @stylistic/js/max-len
138
- const qsRegex = '(?: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/js/max-len
140
- const defaultWafObfuscatorKeyRegex = '(?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/js/max-len
142
- const defaultWafObfuscatorValueRegex = '(?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,})'
135
+ // eslint-disable-next-line @stylistic/max-len
136
+ 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,}`
137
+ // eslint-disable-next-line @stylistic/max-len
138
+ 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`
139
+ // eslint-disable-next-line @stylistic/max-len
140
+ 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
141
  const runtimeId = uuid()
144
142
 
145
143
  function maybeFile (filepath) {
@@ -148,26 +146,23 @@ function maybeFile (filepath) {
148
146
  return fs.readFileSync(filepath, 'utf8')
149
147
  } catch (e) {
150
148
  log.error('Error reading file %s', filepath, e)
151
- return undefined
152
149
  }
153
150
  }
154
151
 
155
152
  function safeJsonParse (input) {
156
153
  try {
157
154
  return JSON.parse(input)
158
- } catch (err) {
159
- return undefined
160
- }
155
+ } catch {}
161
156
  }
162
157
 
163
- const namingVersions = ['v0', 'v1']
158
+ const namingVersions = new Set(['v0', 'v1'])
164
159
  const defaultNamingVersion = 'v0'
165
160
 
166
161
  function validateNamingVersion (versionString) {
167
162
  if (!versionString) {
168
163
  return defaultNamingVersion
169
164
  }
170
- if (!namingVersions.includes(versionString)) {
165
+ if (!namingVersions.has(versionString)) {
171
166
  log.warn(
172
167
  `Unexpected input for config.spanAttributeSchema, picked default ${defaultNamingVersion}`
173
168
  )
@@ -184,7 +179,7 @@ function validateNamingVersion (versionString) {
184
179
  * @param {string | string[]} input
185
180
  */
186
181
  function splitJSONPathRules (input) {
187
- if (!input) return null
182
+ if (!input) return
188
183
  if (Array.isArray(input)) return input
189
184
  if (input === 'all') return []
190
185
  return input.split(',')
@@ -217,7 +212,8 @@ function propagationStyle (key, option) {
217
212
  // Otherwise, fallback to env var parsing
218
213
  const envKey = `DD_TRACE_PROPAGATION_STYLE_${key.toUpperCase()}`
219
214
 
220
- const envVar = coalesce(process.env[envKey], process.env.DD_TRACE_PROPAGATION_STYLE, process.env.OTEL_PROPAGATORS)
215
+ const envVar = coalesce(getEnvironmentVariable(envKey),
216
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE'), getEnvironmentVariable('OTEL_PROPAGATORS'))
221
217
  if (envVar !== undefined) {
222
218
  return envVar.split(',')
223
219
  .filter(v => v !== '')
@@ -245,8 +241,8 @@ class Config {
245
241
 
246
242
  options = {
247
243
  ...options,
248
- appsec: options.appsec != null ? options.appsec : options.experimental?.appsec,
249
- iast: options.iast != null ? options.iast : options.experimental?.iast
244
+ appsec: options.appsec == null ? options.experimental?.appsec : options.appsec,
245
+ iast: options.iast == null ? options.experimental?.iast : options.iast
250
246
  }
251
247
 
252
248
  // Configure the logger first so it can be used to warn about other configs
@@ -271,14 +267,11 @@ class Config {
271
267
 
272
268
  checkIfBothOtelAndDdEnvVarSet()
273
269
 
274
- const DD_API_KEY = coalesce(
275
- process.env.DATADOG_API_KEY,
276
- process.env.DD_API_KEY
277
- )
270
+ const DD_API_KEY = getEnvironmentVariable('DD_API_KEY')
278
271
 
279
- if (process.env.DD_TRACE_PROPAGATION_STYLE && (
280
- process.env.DD_TRACE_PROPAGATION_STYLE_INJECT ||
281
- process.env.DD_TRACE_PROPAGATION_STYLE_EXTRACT
272
+ if (getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') && (
273
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_INJECT') ||
274
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_EXTRACT')
282
275
  )) {
283
276
  log.warn(
284
277
  'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate ' +
@@ -300,34 +293,34 @@ class Config {
300
293
  }
301
294
 
302
295
  const DD_INSTRUMENTATION_INSTALL_ID = coalesce(
303
- process.env.DD_INSTRUMENTATION_INSTALL_ID,
296
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID'),
304
297
  null
305
298
  )
306
299
  const DD_INSTRUMENTATION_INSTALL_TIME = coalesce(
307
- process.env.DD_INSTRUMENTATION_INSTALL_TIME,
300
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TIME'),
308
301
  null
309
302
  )
310
303
  const DD_INSTRUMENTATION_INSTALL_TYPE = coalesce(
311
- process.env.DD_INSTRUMENTATION_INSTALL_TYPE,
304
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TYPE'),
312
305
  null
313
306
  )
314
307
 
315
308
  const DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING = splitJSONPathRules(
316
309
  coalesce(
317
- process.env.DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING,
310
+ getEnvironmentVariable('DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING'),
318
311
  options.cloudPayloadTagging?.request,
319
312
  ''
320
313
  ))
321
314
 
322
315
  const DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING = splitJSONPathRules(
323
316
  coalesce(
324
- process.env.DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING,
317
+ getEnvironmentVariable('DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING'),
325
318
  options.cloudPayloadTagging?.response,
326
319
  ''
327
320
  ))
328
321
 
329
322
  const DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH = coalesce(
330
- process.env.DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH,
323
+ getEnvironmentVariable('DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH'),
331
324
  options.cloudPayloadTagging?.maxDepth,
332
325
  10
333
326
  )
@@ -376,17 +369,17 @@ class Config {
376
369
  if (this.gitMetadataEnabled) {
377
370
  this.repositoryUrl = removeUserSensitiveInfo(
378
371
  coalesce(
379
- process.env.DD_GIT_REPOSITORY_URL,
372
+ getEnvironmentVariable('DD_GIT_REPOSITORY_URL'),
380
373
  this.tags[GIT_REPOSITORY_URL]
381
374
  )
382
375
  )
383
376
  this.commitSHA = coalesce(
384
- process.env.DD_GIT_COMMIT_SHA,
377
+ getEnvironmentVariable('DD_GIT_COMMIT_SHA'),
385
378
  this.tags[GIT_COMMIT_SHA]
386
379
  )
387
380
  if (!this.repositoryUrl || !this.commitSHA) {
388
381
  const DD_GIT_PROPERTIES_FILE = coalesce(
389
- process.env.DD_GIT_PROPERTIES_FILE,
382
+ getEnvironmentVariable('DD_GIT_PROPERTIES_FILE'),
390
383
  `${process.cwd()}/git.properties`
391
384
  )
392
385
  let gitPropertiesString
@@ -394,7 +387,7 @@ class Config {
394
387
  gitPropertiesString = fs.readFileSync(DD_GIT_PROPERTIES_FILE, 'utf8')
395
388
  } catch (e) {
396
389
  // Only log error if the user has set a git.properties path
397
- if (process.env.DD_GIT_PROPERTIES_FILE) {
390
+ if (getEnvironmentVariable('DD_GIT_PROPERTIES_FILE')) {
398
391
  log.error('Error reading DD_GIT_PROPERTIES_FILE: %s', DD_GIT_PROPERTIES_FILE, e)
399
392
  }
400
393
  }
@@ -424,13 +417,12 @@ class Config {
424
417
  // TODO: Remove the experimental env vars as a major?
425
418
  const DD_TRACE_B3_ENABLED = coalesce(
426
419
  options.experimental && options.experimental.b3,
427
- process.env.DD_TRACE_EXPERIMENTAL_B3_ENABLED,
420
+ getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_B3_ENABLED'),
428
421
  false
429
422
  )
430
423
  const defaultPropagationStyle = ['datadog', 'tracecontext']
431
424
  if (isTrue(DD_TRACE_B3_ENABLED)) {
432
- defaultPropagationStyle.push('b3')
433
- defaultPropagationStyle.push('b3 single header')
425
+ defaultPropagationStyle.push('b3', 'b3 single header')
434
426
  }
435
427
  return defaultPropagationStyle
436
428
  }
@@ -446,7 +438,7 @@ class Config {
446
438
  FUNCTION_NAME,
447
439
  K_SERVICE,
448
440
  WEBSITE_SITE_NAME
449
- } = process.env
441
+ } = getEnvironmentVariables()
450
442
 
451
443
  const service = AWS_LAMBDA_FUNCTION_NAME ||
452
444
  FUNCTION_NAME || // Google Cloud Function Name set by deprecated runtimes
@@ -460,16 +452,20 @@ class Config {
460
452
  this._setBoolean(defaults, 'apmTracingEnabled', true)
461
453
  this._setValue(defaults, 'appsec.apiSecurity.enabled', true)
462
454
  this._setValue(defaults, 'appsec.apiSecurity.sampleDelay', 30)
463
- this._setValue(defaults, 'appsec.blockedTemplateGraphql', undefined)
464
- this._setValue(defaults, 'appsec.blockedTemplateHtml', undefined)
465
- this._setValue(defaults, 'appsec.blockedTemplateJson', undefined)
466
- this._setValue(defaults, 'appsec.enabled', undefined)
455
+ this._setValue(defaults, 'appsec.blockedTemplateGraphql')
456
+ this._setValue(defaults, 'appsec.blockedTemplateHtml')
457
+ this._setValue(defaults, 'appsec.blockedTemplateJson')
458
+ this._setValue(defaults, 'appsec.enabled')
467
459
  this._setValue(defaults, 'appsec.eventTracking.mode', 'identification')
460
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.enabled', false)
461
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.redaction', true)
462
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.maxHeaders', 50)
468
463
  this._setValue(defaults, 'appsec.obfuscatorKeyRegex', defaultWafObfuscatorKeyRegex)
469
464
  this._setValue(defaults, 'appsec.obfuscatorValueRegex', defaultWafObfuscatorValueRegex)
470
465
  this._setValue(defaults, 'appsec.rasp.enabled', true)
466
+ this._setValue(defaults, 'appsec.rasp.bodyCollection', false)
471
467
  this._setValue(defaults, 'appsec.rateLimit', 100)
472
- this._setValue(defaults, 'appsec.rules', undefined)
468
+ this._setValue(defaults, 'appsec.rules')
473
469
  this._setValue(defaults, 'appsec.sca.enabled', null)
474
470
  this._setValue(defaults, 'appsec.stackTrace.enabled', true)
475
471
  this._setValue(defaults, 'appsec.stackTrace.maxDepth', 32)
@@ -477,6 +473,7 @@ class Config {
477
473
  this._setValue(defaults, 'appsec.wafTimeout', 5e3) // µs
478
474
  this._setValue(defaults, 'baggageMaxBytes', 8192)
479
475
  this._setValue(defaults, 'baggageMaxItems', 64)
476
+ this._setValue(defaults, 'baggageTagKeys', 'user.id,session.id,account.id')
480
477
  this._setValue(defaults, 'ciVisibilityTestSessionName', '')
481
478
  this._setValue(defaults, 'clientIpEnabled', false)
482
479
  this._setValue(defaults, 'clientIpHeader', null)
@@ -490,9 +487,9 @@ class Config {
490
487
  this._setValue(defaults, 'dynamicInstrumentation.enabled', false)
491
488
  this._setValue(defaults, 'dynamicInstrumentation.redactedIdentifiers', [])
492
489
  this._setValue(defaults, 'dynamicInstrumentation.redactionExcludedIdentifiers', [])
493
- this._setValue(defaults, 'env', undefined)
490
+ this._setValue(defaults, 'env')
494
491
  this._setValue(defaults, 'experimental.enableGetRumData', false)
495
- this._setValue(defaults, 'experimental.exporter', undefined)
492
+ this._setValue(defaults, 'experimental.exporter')
496
493
  this._setValue(defaults, 'experimental.runtimeId', false)
497
494
  this._setValue(defaults, 'flushInterval', 2000)
498
495
  this._setValue(defaults, 'flushMinSpans', 1000)
@@ -525,10 +522,10 @@ class Config {
525
522
  this._setValue(defaults, 'isIntelligentTestRunnerEnabled', false)
526
523
  this._setValue(defaults, 'isManualApiEnabled', false)
527
524
  this._setValue(defaults, 'langchain.spanCharLimit', 128)
528
- this._setValue(defaults, 'langchain.spanPromptCompletionSampleRate', 1.0)
529
- this._setValue(defaults, 'llmobs.agentlessEnabled', undefined)
525
+ this._setValue(defaults, 'langchain.spanPromptCompletionSampleRate', 1)
526
+ this._setValue(defaults, 'llmobs.agentlessEnabled')
530
527
  this._setValue(defaults, 'llmobs.enabled', false)
531
- this._setValue(defaults, 'llmobs.mlApp', undefined)
528
+ this._setValue(defaults, 'llmobs.mlApp')
532
529
  this._setValue(defaults, 'ciVisibilityTestSessionName', '')
533
530
  this._setValue(defaults, 'ciVisAgentlessLogSubmissionEnabled', false)
534
531
  this._setValue(defaults, 'legacyBaggageEnabled', true)
@@ -536,8 +533,9 @@ class Config {
536
533
  this._setValue(defaults, 'isServiceUserProvided', false)
537
534
  this._setValue(defaults, 'testManagementAttemptToFixRetries', 20)
538
535
  this._setValue(defaults, 'isTestManagementEnabled', false)
536
+ this._setValue(defaults, 'isImpactedTestsEnabled', false)
539
537
  this._setValue(defaults, 'logInjection', false)
540
- this._setValue(defaults, 'lookup', undefined)
538
+ this._setValue(defaults, 'lookup')
541
539
  this._setValue(defaults, 'inferredProxyServicesEnabled', false)
542
540
  this._setValue(defaults, 'memcachedCommandEnabled', false)
543
541
  this._setValue(defaults, 'middlewareTracingEnabled', true)
@@ -546,21 +544,21 @@ class Config {
546
544
  this._setValue(defaults, 'peerServiceMapping', {})
547
545
  this._setValue(defaults, 'plugins', true)
548
546
  this._setValue(defaults, 'port', '8126')
549
- this._setValue(defaults, 'profiling.enabled', undefined)
547
+ this._setValue(defaults, 'profiling.enabled')
550
548
  this._setValue(defaults, 'profiling.exporters', 'agent')
551
549
  this._setValue(defaults, 'profiling.sourceMap', true)
552
- this._setValue(defaults, 'profiling.longLivedThreshold', undefined)
550
+ this._setValue(defaults, 'profiling.longLivedThreshold')
553
551
  this._setValue(defaults, 'protocolVersion', '0.4')
554
552
  this._setValue(defaults, 'queryStringObfuscation', qsRegex)
555
553
  this._setValue(defaults, 'remoteConfig.enabled', true)
556
554
  this._setValue(defaults, 'remoteConfig.pollInterval', 5) // seconds
557
555
  this._setValue(defaults, 'reportHostname', false)
558
556
  this._setValue(defaults, 'runtimeMetrics', false)
559
- this._setValue(defaults, 'sampleRate', undefined)
557
+ this._setValue(defaults, 'sampleRate')
560
558
  this._setValue(defaults, 'sampler.rateLimit', 100)
561
559
  this._setValue(defaults, 'sampler.rules', [])
562
560
  this._setValue(defaults, 'sampler.spanSamplingRules', [])
563
- this._setValue(defaults, 'scope', undefined)
561
+ this._setValue(defaults, 'scope')
564
562
  this._setValue(defaults, 'service', service)
565
563
  this._setValue(defaults, 'serviceMapping', {})
566
564
  this._setValue(defaults, 'site', 'datadoghq.com')
@@ -575,7 +573,7 @@ class Config {
575
573
  this._setValue(defaults, 'telemetry.debug', false)
576
574
  this._setValue(defaults, 'telemetry.dependencyCollection', true)
577
575
  this._setValue(defaults, 'telemetry.enabled', true)
578
- this._setValue(defaults, 'telemetry.heartbeatInterval', 60000)
576
+ this._setValue(defaults, 'telemetry.heartbeatInterval', 60_000)
579
577
  this._setValue(defaults, 'telemetry.logCollection', true)
580
578
  this._setValue(defaults, 'telemetry.metrics', true)
581
579
  this._setValue(defaults, 'traceEnabled', true)
@@ -587,13 +585,13 @@ class Config {
587
585
  this._setValue(defaults, 'tracePropagationStyle.extract', ['datadog', 'tracecontext', 'baggage'])
588
586
  this._setValue(defaults, 'tracePropagationStyle.otelPropagators', false)
589
587
  this._setValue(defaults, 'tracing', true)
590
- this._setValue(defaults, 'url', undefined)
588
+ this._setValue(defaults, 'url')
591
589
  this._setValue(defaults, 'version', pkg.version)
592
- this._setValue(defaults, 'instrumentation_config_id', undefined)
590
+ this._setValue(defaults, 'instrumentation_config_id')
593
591
  this._setValue(defaults, 'vertexai.spanCharLimit', 128)
594
- this._setValue(defaults, 'vertexai.spanPromptCompletionSampleRate', 1.0)
592
+ this._setValue(defaults, 'vertexai.spanPromptCompletionSampleRate', 1)
595
593
  this._setValue(defaults, 'trace.aws.addSpanPointers', true)
596
- this._setValue(defaults, 'trace.dynamoDb.tablePrimaryKeys', undefined)
594
+ this._setValue(defaults, 'trace.dynamoDb.tablePrimaryKeys')
597
595
  this._setValue(defaults, 'trace.nativeSpanEvents', false)
598
596
  }
599
597
 
@@ -644,11 +642,13 @@ class Config {
644
642
  DD_API_SECURITY_SAMPLE_DELAY,
645
643
  DD_APM_TRACING_ENABLED,
646
644
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
647
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING,
645
+ DD_APPSEC_COLLECT_ALL_HEADERS,
648
646
  DD_APPSEC_ENABLED,
649
647
  DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON,
648
+ DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED,
650
649
  DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML,
651
650
  DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON,
651
+ DD_APPSEC_MAX_COLLECTED_HEADERS,
652
652
  DD_APPSEC_MAX_STACK_TRACES,
653
653
  DD_APPSEC_MAX_STACK_TRACE_DEPTH,
654
654
  DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP,
@@ -657,6 +657,7 @@ class Config {
657
657
  DD_APPSEC_SCA_ENABLED,
658
658
  DD_APPSEC_STACK_TRACE_ENABLED,
659
659
  DD_APPSEC_RASP_ENABLED,
660
+ DD_APPSEC_RASP_COLLECT_REQUEST_BODY,
660
661
  DD_APPSEC_TRACE_RATE_LIMIT,
661
662
  DD_APPSEC_WAF_TIMEOUT,
662
663
  DD_CRASHTRACKING_ENABLED,
@@ -664,16 +665,14 @@ class Config {
664
665
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED,
665
666
  DD_DATA_STREAMS_ENABLED,
666
667
  DD_DBM_PROPAGATION_MODE,
667
- DD_DOGSTATSD_HOSTNAME,
668
668
  DD_DOGSTATSD_HOST,
669
669
  DD_DOGSTATSD_PORT,
670
670
  DD_DYNAMIC_INSTRUMENTATION_ENABLED,
671
671
  DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS,
672
672
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS,
673
673
  DD_ENV,
674
- DD_EXPERIMENTAL_API_SECURITY_ENABLED,
675
674
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED,
676
- DD_EXPERIMENTAL_PROFILING_ENABLED,
675
+ DD_PROFILING_ENABLED,
677
676
  DD_GRPC_CLIENT_ERROR_STATUSES,
678
677
  DD_GRPC_SERVER_ERROR_STATUSES,
679
678
  JEST_WORKER_ID,
@@ -700,7 +699,6 @@ class Config {
700
699
  DD_LLMOBS_ML_APP,
701
700
  DD_OPENAI_LOGS_ENABLED,
702
701
  DD_OPENAI_SPAN_CHAR_LIMIT,
703
- DD_PROFILING_ENABLED,
704
702
  DD_PROFILING_EXPORTERS,
705
703
  DD_PROFILING_SOURCE_MAP,
706
704
  DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD,
@@ -709,7 +707,6 @@ class Config {
709
707
  DD_RUNTIME_METRICS_ENABLED,
710
708
  DD_SERVICE,
711
709
  DD_SERVICE_MAPPING,
712
- DD_SERVICE_NAME,
713
710
  DD_SITE,
714
711
  DD_SPAN_SAMPLING_RULES,
715
712
  DD_SPAN_SAMPLING_RULES_FILE,
@@ -721,12 +718,12 @@ class Config {
721
718
  DD_TELEMETRY_METRICS_ENABLED,
722
719
  DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED,
723
720
  DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED,
724
- DD_TRACE_AGENT_HOSTNAME,
725
721
  DD_TRACE_AGENT_PORT,
726
722
  DD_TRACE_AGENT_PROTOCOL_VERSION,
727
723
  DD_TRACE_AWS_ADD_SPAN_POINTERS,
728
724
  DD_TRACE_BAGGAGE_MAX_BYTES,
729
725
  DD_TRACE_BAGGAGE_MAX_ITEMS,
726
+ DD_TRACE_BAGGAGE_TAG_KEYS,
730
727
  DD_TRACE_CLIENT_IP_ENABLED,
731
728
  DD_TRACE_CLIENT_IP_HEADER,
732
729
  DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS,
@@ -759,7 +756,6 @@ class Config {
759
756
  DD_TRACE_SPAN_LEAK_DEBUG,
760
757
  DD_TRACE_STARTUP_LOGS,
761
758
  DD_TRACE_TAGS,
762
- DD_TRACE_TELEMETRY_ENABLED,
763
759
  DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH,
764
760
  DD_TRACING_ENABLED,
765
761
  DD_VERSION,
@@ -773,7 +769,7 @@ class Config {
773
769
  OTEL_SERVICE_NAME,
774
770
  OTEL_TRACES_SAMPLER,
775
771
  OTEL_TRACES_SAMPLER_ARG
776
- } = process.env
772
+ } = getEnvironmentVariables()
777
773
 
778
774
  const tags = {}
779
775
  const env = setHiddenProperty(this, '_env', {})
@@ -788,10 +784,7 @@ class Config {
788
784
  DD_APM_TRACING_ENABLED,
789
785
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED)
790
786
  ))
791
- this._setBoolean(env, 'appsec.apiSecurity.enabled', coalesce(
792
- DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED),
793
- DD_EXPERIMENTAL_API_SECURITY_ENABLED && isTrue(DD_EXPERIMENTAL_API_SECURITY_ENABLED)
794
- ))
787
+ this._setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
795
788
  this._setValue(env, 'appsec.apiSecurity.sampleDelay', maybeFloat(DD_API_SECURITY_SAMPLE_DELAY))
796
789
  this._setValue(env, 'appsec.blockedTemplateGraphql', maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON))
797
790
  this._setValue(env, 'appsec.blockedTemplateHtml', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML))
@@ -799,13 +792,19 @@ class Config {
799
792
  this._setValue(env, 'appsec.blockedTemplateJson', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON))
800
793
  this._envUnprocessed['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
801
794
  this._setBoolean(env, 'appsec.enabled', DD_APPSEC_ENABLED)
802
- this._setString(env, 'appsec.eventTracking.mode', coalesce(
803
- DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
804
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING // TODO: remove in next major
805
- ))
795
+ this._setString(env, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
796
+ this._setBoolean(env, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
797
+ this._setBoolean(
798
+ env,
799
+ 'appsec.extendedHeadersCollection.redaction',
800
+ DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED
801
+ )
802
+ this._setValue(env, 'appsec.extendedHeadersCollection.maxHeaders', maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS))
803
+ this._envUnprocessed['appsec.extendedHeadersCollection.maxHeaders'] = DD_APPSEC_MAX_COLLECTED_HEADERS
806
804
  this._setString(env, 'appsec.obfuscatorKeyRegex', DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP)
807
805
  this._setString(env, 'appsec.obfuscatorValueRegex', DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP)
808
806
  this._setBoolean(env, 'appsec.rasp.enabled', DD_APPSEC_RASP_ENABLED)
807
+ this._setBoolean(env, 'appsec.rasp.bodyCollection', DD_APPSEC_RASP_COLLECT_REQUEST_BODY)
809
808
  this._setValue(env, 'appsec.rateLimit', maybeInt(DD_APPSEC_TRACE_RATE_LIMIT))
810
809
  this._envUnprocessed['appsec.rateLimit'] = DD_APPSEC_TRACE_RATE_LIMIT
811
810
  this._setString(env, 'appsec.rules', DD_APPSEC_RULES)
@@ -820,6 +819,7 @@ class Config {
820
819
  this._envUnprocessed['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
821
820
  this._setValue(env, 'baggageMaxBytes', DD_TRACE_BAGGAGE_MAX_BYTES)
822
821
  this._setValue(env, 'baggageMaxItems', DD_TRACE_BAGGAGE_MAX_ITEMS)
822
+ this._setValue(env, 'baggageTagKeys', DD_TRACE_BAGGAGE_TAG_KEYS)
823
823
  this._setBoolean(env, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
824
824
  this._setString(env, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
825
825
  this._setBoolean(env, 'crashtracking.enabled', coalesce(
@@ -833,7 +833,7 @@ class Config {
833
833
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED
834
834
  )
835
835
  this._setString(env, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
836
- this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST || DD_DOGSTATSD_HOSTNAME)
836
+ this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
837
837
  this._setString(env, 'dogstatsd.port', DD_DOGSTATSD_PORT)
838
838
  this._setBoolean(env, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
839
839
  this._setBoolean(env, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
@@ -855,7 +855,7 @@ class Config {
855
855
  this._setIntegerRangeSet(env, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
856
856
  this._setIntegerRangeSet(env, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
857
857
  this._setArray(env, 'headerTags', DD_TRACE_HEADER_TAGS)
858
- this._setString(env, 'hostname', coalesce(DD_AGENT_HOST, DD_TRACE_AGENT_HOSTNAME))
858
+ this._setString(env, 'hostname', DD_AGENT_HOST)
859
859
  this._setValue(env, 'iast.dbRowsToTaint', maybeInt(DD_IAST_DB_ROWS_TO_TAINT))
860
860
  this._setBoolean(env, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
861
861
  this._setBoolean(env, 'iast.enabled', DD_IAST_ENABLED)
@@ -893,7 +893,7 @@ class Config {
893
893
  this._setValue(env, 'openai.spanCharLimit', maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT))
894
894
  this._envUnprocessed.openaiSpanCharLimit = DD_OPENAI_SPAN_CHAR_LIMIT
895
895
  if (DD_TRACE_PEER_SERVICE_MAPPING) {
896
- this._setValue(env, 'peerServiceMapping', fromEntries(
896
+ this._setValue(env, 'peerServiceMapping', Object.fromEntries(
897
897
  DD_TRACE_PEER_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
898
898
  ))
899
899
  this._envUnprocessed.peerServiceMapping = DD_TRACE_PEER_SERVICE_MAPPING
@@ -901,7 +901,6 @@ class Config {
901
901
  this._setString(env, 'port', DD_TRACE_AGENT_PORT)
902
902
  const profilingEnabled = normalizeProfilingEnabledValue(
903
903
  coalesce(
904
- DD_EXPERIMENTAL_PROFILING_ENABLED,
905
904
  DD_PROFILING_ENABLED,
906
905
  this._isInServerlessEnvironment() ? 'false' : undefined
907
906
  )
@@ -939,10 +938,10 @@ class Config {
939
938
  this._setSamplingRule(env, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
940
939
  this._envUnprocessed['sampler.rules'] = DD_TRACE_SAMPLING_RULES
941
940
  this._setString(env, 'scope', DD_TRACE_SCOPE)
942
- this._setString(env, 'service', DD_SERVICE || DD_SERVICE_NAME || tags.service || OTEL_SERVICE_NAME)
941
+ this._setString(env, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
943
942
  if (DD_SERVICE_MAPPING) {
944
- this._setValue(env, 'serviceMapping', fromEntries(
945
- process.env.DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
943
+ this._setValue(env, 'serviceMapping', Object.fromEntries(
944
+ DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
946
945
  ))
947
946
  }
948
947
  this._setString(env, 'site', DD_SITE)
@@ -957,8 +956,7 @@ class Config {
957
956
  this._setTags(env, 'tags', tags)
958
957
  this._setValue(env, 'tagsHeaderMaxLength', DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH)
959
958
  this._setBoolean(env, 'telemetry.enabled', coalesce(
960
- DD_TRACE_TELEMETRY_ENABLED, // for backward compatibility
961
- DD_INSTRUMENTATION_TELEMETRY_ENABLED, // to comply with instrumentation telemetry specs
959
+ DD_INSTRUMENTATION_TELEMETRY_ENABLED,
962
960
  !(this._isInServerlessEnvironment() || JEST_WORKER_ID)
963
961
  ))
964
962
  this._setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
@@ -1002,7 +1000,7 @@ class Config {
1002
1000
  const tags = {}
1003
1001
  setHiddenProperty(this, '_optsUnprocessed', {})
1004
1002
 
1005
- options = setHiddenProperty(this, '_optionsArg', Object.assign({ ingestion: {} }, options, opts))
1003
+ options = setHiddenProperty(this, '_optionsArg', { ingestion: {}, ...options, ...opts })
1006
1004
 
1007
1005
  tagger.add(tags, options.tags)
1008
1006
 
@@ -1018,9 +1016,24 @@ class Config {
1018
1016
  this._optsUnprocessed['appsec.blockedTemplateJson'] = options.appsec?.blockedTemplateJson
1019
1017
  this._setBoolean(opts, 'appsec.enabled', options.appsec?.enabled)
1020
1018
  this._setString(opts, 'appsec.eventTracking.mode', options.appsec?.eventTracking?.mode)
1019
+ this._setBoolean(
1020
+ opts,
1021
+ 'appsec.extendedHeadersCollection.enabled',
1022
+ options.appsec?.extendedHeadersCollection?.enabled
1023
+ )
1024
+ this._setBoolean(
1025
+ opts,
1026
+ 'appsec.extendedHeadersCollection.redaction',
1027
+ options.appsec?.extendedHeadersCollection?.redaction
1028
+ )
1029
+ this._setValue(opts,
1030
+ 'appsec.extendedHeadersCollection.maxHeaders',
1031
+ options.appsec?.extendedHeadersCollection?.maxHeaders
1032
+ )
1021
1033
  this._setString(opts, 'appsec.obfuscatorKeyRegex', options.appsec?.obfuscatorKeyRegex)
1022
1034
  this._setString(opts, 'appsec.obfuscatorValueRegex', options.appsec?.obfuscatorValueRegex)
1023
1035
  this._setBoolean(opts, 'appsec.rasp.enabled', options.appsec?.rasp?.enabled)
1036
+ this._setBoolean(opts, 'appsec.rasp.bodyCollection', options.appsec?.rasp?.bodyCollection)
1024
1037
  this._setValue(opts, 'appsec.rateLimit', maybeInt(options.appsec?.rateLimit))
1025
1038
  this._optsUnprocessed['appsec.rateLimit'] = options.appsec?.rateLimit
1026
1039
  this._setString(opts, 'appsec.rules', options.appsec?.rules)
@@ -1035,6 +1048,7 @@ class Config {
1035
1048
  this._setString(opts, 'clientIpHeader', options.clientIpHeader?.toLowerCase())
1036
1049
  this._setValue(opts, 'baggageMaxBytes', options.baggageMaxBytes)
1037
1050
  this._setValue(opts, 'baggageMaxItems', options.baggageMaxItems)
1051
+ this._setValue(opts, 'baggageTagKeys', options.baggageTagKeys)
1038
1052
  this._setBoolean(opts, 'codeOriginForSpans.enabled', options.codeOriginForSpans?.enabled)
1039
1053
  this._setBoolean(
1040
1054
  opts,
@@ -1151,20 +1165,19 @@ class Config {
1151
1165
 
1152
1166
  _isCiVisibilityItrEnabled () {
1153
1167
  return coalesce(
1154
- process.env.DD_CIVISIBILITY_ITR_ENABLED,
1168
+ getEnvironmentVariable('DD_CIVISIBILITY_ITR_ENABLED'),
1155
1169
  true
1156
1170
  )
1157
1171
  }
1158
1172
 
1159
1173
  _getHostname () {
1160
- const DD_CIVISIBILITY_AGENTLESS_URL = process.env.DD_CIVISIBILITY_AGENTLESS_URL
1174
+ const DD_CIVISIBILITY_AGENTLESS_URL = getEnvironmentVariable('DD_CIVISIBILITY_AGENTLESS_URL')
1161
1175
  const url = DD_CIVISIBILITY_AGENTLESS_URL
1162
1176
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1163
1177
  : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1164
1178
  const DD_AGENT_HOST = coalesce(
1165
1179
  this._optionsArg.hostname,
1166
- process.env.DD_AGENT_HOST,
1167
- process.env.DD_TRACE_AGENT_HOSTNAME,
1180
+ getEnvironmentVariable('DD_AGENT_HOST'),
1168
1181
  '127.0.0.1'
1169
1182
  )
1170
1183
  return DD_AGENT_HOST || (url && url.hostname)
@@ -1174,17 +1187,17 @@ class Config {
1174
1187
  const DD_TRACE_SPAN_ATTRIBUTE_SCHEMA = validateNamingVersion(
1175
1188
  coalesce(
1176
1189
  this._optionsArg.spanAttributeSchema,
1177
- process.env.DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
1190
+ getEnvironmentVariable('DD_TRACE_SPAN_ATTRIBUTE_SCHEMA')
1178
1191
  )
1179
1192
  )
1180
1193
 
1181
1194
  const peerServiceSet = (
1182
1195
  this._optionsArg.hasOwnProperty('spanComputePeerService') ||
1183
- process.env.hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1196
+ getEnvironmentVariables().hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1184
1197
  )
1185
1198
  const peerServiceValue = coalesce(
1186
1199
  this._optionsArg.spanComputePeerService,
1187
- process.env.DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED
1200
+ getEnvironmentVariable('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1188
1201
  )
1189
1202
 
1190
1203
  const spanComputePeerService = (
@@ -1200,14 +1213,14 @@ class Config {
1200
1213
 
1201
1214
  _isCiVisibilityGitUploadEnabled () {
1202
1215
  return coalesce(
1203
- process.env.DD_CIVISIBILITY_GIT_UPLOAD_ENABLED,
1216
+ getEnvironmentVariable('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED'),
1204
1217
  true
1205
1218
  )
1206
1219
  }
1207
1220
 
1208
1221
  _isCiVisibilityManualApiEnabled () {
1209
1222
  return coalesce(
1210
- process.env.DD_CIVISIBILITY_MANUAL_API_ENABLED,
1223
+ getEnvironmentVariable('DD_CIVISIBILITY_MANUAL_API_ENABLED'),
1211
1224
  true
1212
1225
  )
1213
1226
  }
@@ -1218,7 +1231,7 @@ class Config {
1218
1231
 
1219
1232
  return apmTracingEnabled && coalesce(
1220
1233
  this._optionsArg.stats,
1221
- process.env.DD_TRACE_STATS_COMPUTATION_ENABLED,
1234
+ getEnvironmentVariable('DD_TRACE_STATS_COMPUTATION_ENABLED'),
1222
1235
  getIsGCPFunction() || getIsAzureFunction()
1223
1236
  )
1224
1237
  }
@@ -1226,8 +1239,7 @@ class Config {
1226
1239
  _getTraceAgentUrl () {
1227
1240
  return coalesce(
1228
1241
  this._optionsArg.url,
1229
- process.env.DD_TRACE_AGENT_URL,
1230
- process.env.DD_TRACE_URL,
1242
+ getEnvironmentVariable('DD_TRACE_AGENT_URL'),
1231
1243
  null
1232
1244
  )
1233
1245
  }
@@ -1245,8 +1257,9 @@ class Config {
1245
1257
  DD_AGENTLESS_LOG_SUBMISSION_ENABLED,
1246
1258
  DD_TEST_FAILED_TEST_REPLAY_ENABLED,
1247
1259
  DD_TEST_MANAGEMENT_ENABLED,
1248
- DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES
1249
- } = process.env
1260
+ DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
1261
+ DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED
1262
+ } = getEnvironmentVariables()
1250
1263
 
1251
1264
  if (DD_CIVISIBILITY_AGENTLESS_URL) {
1252
1265
  this._setValue(calc, 'url', new URL(DD_CIVISIBILITY_AGENTLESS_URL))
@@ -1270,6 +1283,7 @@ class Config {
1270
1283
  'testManagementAttemptToFixRetries',
1271
1284
  coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20)
1272
1285
  )
1286
+ this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED))
1273
1287
  }
1274
1288
  this._setString(calc, 'dogstatsd.hostname', this._getHostname())
1275
1289
  this._setBoolean(calc, 'isGitUploadEnabled',
@@ -1341,9 +1355,9 @@ class Config {
1341
1355
  return this._setValue(obj, name, value)
1342
1356
  }
1343
1357
 
1344
- value = parseFloat(value)
1358
+ value = Number.parseFloat(value)
1345
1359
 
1346
- if (!isNaN(value)) {
1360
+ if (!Number.isNaN(value)) {
1347
1361
  // TODO: Ignore out of range values instead of normalizing them.
1348
1362
  this._setValue(obj, name, Math.min(Math.max(value, 0), 1))
1349
1363
  }
@@ -1358,7 +1372,7 @@ class Config {
1358
1372
  value = value.split(',').map(item => {
1359
1373
  // Trim each item and remove whitespace around the colon
1360
1374
  const [key, val] = item.split(':').map(part => part.trim())
1361
- return val !== undefined ? `${key}:${val}` : key
1375
+ return val === undefined ? key : `${key}:${val}`
1362
1376
  })
1363
1377
  }
1364
1378
 
@@ -1422,13 +1436,7 @@ class Config {
1422
1436
  obj[name] = value
1423
1437
  }
1424
1438
 
1425
- // TODO: Report origin changes and errors to telemetry.
1426
- // TODO: Deeply merge configurations.
1427
- // TODO: Move change tracking to telemetry.
1428
- // for telemetry reporting, `name`s in `containers` need to be keys from:
1429
- // eslint-disable-next-line @stylistic/js/max-len
1430
- // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1431
- _merge () {
1439
+ _getContainersAndOriginsOrdered () {
1432
1440
  const containers = [
1433
1441
  this._remote,
1434
1442
  this._options,
@@ -1447,6 +1455,17 @@ class Config {
1447
1455
  'calculated',
1448
1456
  'default'
1449
1457
  ]
1458
+
1459
+ return { containers, origins }
1460
+ }
1461
+
1462
+ // TODO: Report origin changes and errors to telemetry.
1463
+ // TODO: Deeply merge configurations.
1464
+ // TODO: Move change tracking to telemetry.
1465
+ // for telemetry reporting, `name`s in `containers` need to be keys from:
1466
+ // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1467
+ _merge () {
1468
+ const { containers, origins } = this._getContainersAndOriginsOrdered()
1450
1469
  const unprocessedValues = [
1451
1470
  this._remoteUnprocessed,
1452
1471
  this._optsUnprocessed,
@@ -1483,6 +1502,18 @@ class Config {
1483
1502
  updateConfig(changes, this)
1484
1503
  }
1485
1504
 
1505
+ getOrigin (name) {
1506
+ const { containers, origins } = this._getContainersAndOriginsOrdered()
1507
+
1508
+ for (let i = 0; i < containers.length; i++) {
1509
+ const container = containers[i]
1510
+ const value = container[name]
1511
+ if (value != null || container === this._defaults) {
1512
+ return origins[i]
1513
+ }
1514
+ }
1515
+ }
1516
+
1486
1517
  // TODO: Refactor the Config class so it never produces any config objects that are incompatible with MessageChannel
1487
1518
  /**
1488
1519
  * Serializes the config object so it can be passed over a Worker Thread MessageChannel.
@@ -1505,24 +1536,24 @@ function handleOtel (tagString) {
1505
1536
  ?.replace(/(^|,)deployment\.environment=/, '$1env:')
1506
1537
  .replace(/(^|,)service\.name=/, '$1service:')
1507
1538
  .replace(/(^|,)service\.version=/, '$1version:')
1508
- .replace(/=/g, ':')
1539
+ .replaceAll('=', ':')
1509
1540
  }
1510
1541
 
1511
1542
  function parseSpaceSeparatedTags (tagString) {
1512
1543
  if (tagString && !tagString.includes(',')) {
1513
- tagString = tagString.replace(/\s+/g, ',')
1544
+ tagString = tagString.replaceAll(/\s+/g, ',')
1514
1545
  }
1515
1546
  return tagString
1516
1547
  }
1517
1548
 
1518
1549
  function maybeInt (number) {
1519
- const parsed = parseInt(number)
1520
- return isNaN(parsed) ? undefined : parsed
1550
+ const parsed = Number.parseInt(number)
1551
+ return Number.isNaN(parsed) ? undefined : parsed
1521
1552
  }
1522
1553
 
1523
1554
  function maybeFloat (number) {
1524
- const parsed = parseFloat(number)
1525
- return isNaN(parsed) ? undefined : parsed
1555
+ const parsed = Number.parseFloat(number)
1556
+ return Number.isNaN(parsed) ? undefined : parsed
1526
1557
  }
1527
1558
 
1528
1559
  function getAgentUrl (url, options) {
@@ -1533,9 +1564,8 @@ function getAgentUrl (url, options) {
1533
1564
  if (
1534
1565
  !options.hostname &&
1535
1566
  !options.port &&
1536
- !process.env.DD_AGENT_HOST &&
1537
- !process.env.DD_TRACE_AGENT_HOSTNAME &&
1538
- !process.env.DD_TRACE_AGENT_PORT &&
1567
+ !getEnvironmentVariable('DD_AGENT_HOST') &&
1568
+ !getEnvironmentVariable('DD_TRACE_AGENT_PORT') &&
1539
1569
  fs.existsSync('/var/run/datadog/apm.socket')
1540
1570
  ) {
1541
1571
  return new URL('unix:///var/run/datadog/apm.socket')