dd-trace 5.53.0 → 5.54.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 (319) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +33 -16
  3. package/initialize.mjs +3 -4
  4. package/package.json +36 -34
  5. package/packages/datadog-core/src/utils/src/get.js +1 -1
  6. package/packages/datadog-core/src/utils/src/has.js +1 -1
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  8. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  9. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  10. package/packages/datadog-core/src/utils/src/set.js +1 -1
  11. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  12. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  13. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  14. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  15. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  16. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  17. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  18. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
  19. package/packages/datadog-instrumentations/src/couchbase.js +3 -3
  20. package/packages/datadog-instrumentations/src/cucumber.js +87 -40
  21. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  22. package/packages/datadog-instrumentations/src/dns.js +1 -1
  23. package/packages/datadog-instrumentations/src/fs.js +1 -1
  24. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  25. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  26. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  27. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  28. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  29. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  30. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  31. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  32. package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
  33. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  34. package/packages/datadog-instrumentations/src/jest.js +137 -48
  35. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  36. package/packages/datadog-instrumentations/src/knex.js +4 -4
  37. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  38. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  39. package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
  40. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  41. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  43. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  44. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  45. package/packages/datadog-instrumentations/src/net.js +1 -1
  46. package/packages/datadog-instrumentations/src/next.js +1 -0
  47. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  48. package/packages/datadog-instrumentations/src/openai.js +21 -23
  49. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  50. package/packages/datadog-instrumentations/src/pg.js +1 -2
  51. package/packages/datadog-instrumentations/src/playwright.js +112 -69
  52. package/packages/datadog-instrumentations/src/redis.js +3 -3
  53. package/packages/datadog-instrumentations/src/restify.js +2 -2
  54. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  55. package/packages/datadog-instrumentations/src/router.js +22 -25
  56. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  57. package/packages/datadog-instrumentations/src/vitest.js +77 -28
  58. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  59. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  60. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  61. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  62. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  63. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  64. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  65. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  66. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  67. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  68. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  69. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  70. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  72. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  73. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  74. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  75. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  76. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  77. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  78. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  79. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  80. package/packages/datadog-plugin-cucumber/src/index.js +57 -2
  81. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  82. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  83. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  84. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  85. package/packages/datadog-plugin-express/src/index.js +10 -12
  86. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  87. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  88. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  89. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  90. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  91. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  92. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  93. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  94. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  95. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  96. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  97. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  98. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  99. package/packages/datadog-plugin-http/src/client.js +18 -7
  100. package/packages/datadog-plugin-http2/src/client.js +20 -20
  101. package/packages/datadog-plugin-jest/src/index.js +23 -21
  102. package/packages/datadog-plugin-jest/src/util.js +8 -8
  103. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  104. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  105. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  106. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  107. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  108. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  109. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  110. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  111. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  112. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  113. package/packages/datadog-plugin-mocha/src/index.js +33 -13
  114. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  115. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  116. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  117. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  118. package/packages/datadog-plugin-next/src/index.js +6 -5
  119. package/packages/datadog-plugin-openai/src/services.js +6 -10
  120. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  121. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  122. package/packages/datadog-plugin-playwright/src/index.js +22 -2
  123. package/packages/datadog-plugin-redis/src/index.js +1 -1
  124. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  125. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  126. package/packages/datadog-plugin-router/src/index.js +1 -1
  127. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  128. package/packages/datadog-plugin-vitest/src/index.js +47 -31
  129. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  130. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  131. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  132. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  133. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  134. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  135. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  136. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  137. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  138. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  139. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  140. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  141. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  142. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  143. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  144. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  145. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  146. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  147. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  148. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  149. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  150. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  151. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  152. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  153. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  154. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  157. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  158. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  162. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  163. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  166. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  167. package/packages/dd-trace/src/appsec/index.js +1 -1
  168. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  169. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  170. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  171. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  172. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  173. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  174. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  175. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  176. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  177. package/packages/dd-trace/src/azure_metadata.js +2 -7
  178. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  179. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  180. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  181. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  182. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  183. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  184. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  185. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  186. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  187. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  188. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  189. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  192. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  193. package/packages/dd-trace/src/config.js +82 -51
  194. package/packages/dd-trace/src/config_stable.js +3 -3
  195. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  196. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  197. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  198. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  199. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  200. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  201. package/packages/dd-trace/src/datastreams/size.js +1 -1
  202. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
  203. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  204. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  205. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
  206. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  209. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  210. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  211. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  212. package/packages/dd-trace/src/dogstatsd.js +5 -4
  213. package/packages/dd-trace/src/encode/0.4.js +9 -9
  214. package/packages/dd-trace/src/encode/0.5.js +1 -1
  215. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  216. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  217. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  218. package/packages/dd-trace/src/exporter.js +6 -6
  219. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  220. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  221. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  222. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  223. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  224. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  225. package/packages/dd-trace/src/flare/file.js +1 -5
  226. package/packages/dd-trace/src/format.js +1 -1
  227. package/packages/dd-trace/src/git_properties.js +1 -1
  228. package/packages/dd-trace/src/id.js +12 -6
  229. package/packages/dd-trace/src/iitm.js +10 -22
  230. package/packages/dd-trace/src/lambda/handler.js +6 -6
  231. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  232. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  233. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  234. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  235. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  236. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  237. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  238. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  239. package/packages/dd-trace/src/llmobs/tagger.js +110 -96
  240. package/packages/dd-trace/src/llmobs/util.js +9 -9
  241. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  242. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  243. package/packages/dd-trace/src/log/index.js +4 -4
  244. package/packages/dd-trace/src/log/log.js +1 -1
  245. package/packages/dd-trace/src/log/writer.js +2 -2
  246. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  247. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  248. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  249. package/packages/dd-trace/src/noop/span.js +3 -5
  250. package/packages/dd-trace/src/noop/tracer.js +1 -2
  251. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  252. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  253. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  254. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  255. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  256. package/packages/dd-trace/src/opentracing/span.js +9 -14
  257. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  258. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  259. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  260. package/packages/dd-trace/src/pkg.js +1 -1
  261. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  262. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  263. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  264. package/packages/dd-trace/src/plugins/index.js +0 -1
  265. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  266. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  267. package/packages/dd-trace/src/plugins/producer.js +2 -2
  268. package/packages/dd-trace/src/plugins/storage.js +2 -2
  269. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  270. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  271. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  272. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  273. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  274. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  275. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  276. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  277. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  278. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  279. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  280. package/packages/dd-trace/src/priority_sampler.js +22 -22
  281. package/packages/dd-trace/src/profiling/config.js +44 -8
  282. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  283. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  284. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  285. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  286. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  287. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  288. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  289. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  290. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  291. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  292. package/packages/dd-trace/src/proxy.js +7 -9
  293. package/packages/dd-trace/src/random_sampler.js +40 -0
  294. package/packages/dd-trace/src/rate_limiter.js +4 -4
  295. package/packages/dd-trace/src/remote_config/index.js +3 -7
  296. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  297. package/packages/dd-trace/src/require-package-json.js +1 -1
  298. package/packages/dd-trace/src/ritm.js +4 -4
  299. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  300. package/packages/dd-trace/src/sampler.js +33 -4
  301. package/packages/dd-trace/src/sampling_rule.js +12 -3
  302. package/packages/dd-trace/src/scope.js +1 -1
  303. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  304. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  305. package/packages/dd-trace/src/span_processor.js +3 -3
  306. package/packages/dd-trace/src/span_sampler.js +4 -1
  307. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  308. package/packages/dd-trace/src/startup-log.js +2 -2
  309. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  310. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  311. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  312. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  313. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  314. package/packages/dd-trace/src/util.js +1 -1
  315. package/version.js +1 -0
  316. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  317. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  318. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  319. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -26,7 +26,7 @@ function getWinstonLogSubmissionParameters (config) {
26
26
  path: defaultParameters.path,
27
27
  headers: defaultParameters.headers
28
28
  }
29
- } catch (e) {
29
+ } catch {
30
30
  log.error('Could not parse DD_AGENTLESS_LOG_SUBMISSION_URL')
31
31
  return defaultParameters
32
32
  }
@@ -28,7 +28,8 @@ function getLibraryConfiguration ({
28
28
  runtimeVersion,
29
29
  branch,
30
30
  testLevel = 'suite',
31
- custom
31
+ custom,
32
+ tag
32
33
  }, done) {
33
34
  const options = {
34
35
  path: '/api/v2/libraries/tests/services/setting',
@@ -37,7 +38,7 @@ function getLibraryConfiguration ({
37
38
  'Content-Type': 'application/json'
38
39
  },
39
40
  url,
40
- timeout: 20000
41
+ timeout: 20_000
41
42
  }
42
43
 
43
44
  if (isEvpProxy) {
@@ -69,7 +70,7 @@ function getLibraryConfiguration ({
69
70
  env,
70
71
  repository_url: repositoryUrl,
71
72
  sha,
72
- branch
73
+ branch: branch || tag
73
74
  }
74
75
  }
75
76
  })
@@ -95,7 +96,8 @@ function getLibraryConfiguration ({
95
96
  flaky_test_retries_enabled: isFlakyTestRetriesEnabled,
96
97
  di_enabled: isDiEnabled,
97
98
  known_tests_enabled: isKnownTestsEnabled,
98
- test_management: testManagementConfig
99
+ test_management: testManagementConfig,
100
+ impacted_tests_enabled: isImpactedTestsEnabled
99
101
  }
100
102
  }
101
103
  } = JSON.parse(res)
@@ -115,7 +117,8 @@ function getLibraryConfiguration ({
115
117
  isKnownTestsEnabled,
116
118
  isTestManagementEnabled: (testManagementConfig?.enabled ?? false),
117
119
  testManagementAttemptToFixRetries:
118
- testManagementConfig?.attempt_to_fix_retries
120
+ testManagementConfig?.attempt_to_fix_retries,
121
+ isImpactedTestsEnabled
119
122
  }
120
123
 
121
124
  log.debug(() => `Remote settings: ${JSON.stringify(settings)}`)
@@ -81,6 +81,8 @@ const TELEMETRY_GIT_REQUESTS_SETTINGS = 'git_requests.settings'
81
81
  const TELEMETRY_GIT_REQUESTS_SETTINGS_MS = 'git_requests.settings_ms'
82
82
  const TELEMETRY_GIT_REQUESTS_SETTINGS_ERRORS = 'git_requests.settings_errors'
83
83
  const TELEMETRY_GIT_REQUESTS_SETTINGS_RESPONSE = 'git_requests.settings_response'
84
+ const TELEMETRY_GIT_SHA_MATCH = 'git.commit_sha_match'
85
+ const TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY = 'git.commit_sha_discrepancy'
84
86
  const TELEMETRY_ITR_SKIPPABLE_TESTS = 'itr_skippable_tests.request'
85
87
  const TELEMETRY_ITR_SKIPPABLE_TESTS_MS = 'itr_skippable_tests.request_ms'
86
88
  const TELEMETRY_ITR_SKIPPABLE_TESTS_ERRORS = 'itr_skippable_tests.request_errors'
@@ -144,6 +146,8 @@ module.exports = {
144
146
  TELEMETRY_GIT_REQUESTS_SETTINGS_MS,
145
147
  TELEMETRY_GIT_REQUESTS_SETTINGS_ERRORS,
146
148
  TELEMETRY_GIT_REQUESTS_SETTINGS_RESPONSE,
149
+ TELEMETRY_GIT_SHA_MATCH,
150
+ TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
147
151
  TELEMETRY_ITR_SKIPPABLE_TESTS,
148
152
  TELEMETRY_ITR_SKIPPABLE_TESTS_MS,
149
153
  TELEMETRY_ITR_SKIPPABLE_TESTS_ERRORS,
@@ -16,7 +16,7 @@ function getTestManagementTests ({
16
16
  headers: {
17
17
  'Content-Type': 'application/json'
18
18
  },
19
- timeout: 20000,
19
+ timeout: 20_000,
20
20
  url
21
21
  }
22
22
 
@@ -105,7 +105,7 @@ function validateEnvVarType (envVar) {
105
105
  case 'OTEL_TRACES_SAMPLER':
106
106
  return getFromOtelSamplerMap(value, process.env.OTEL_TRACES_SAMPLER_ARG) !== undefined
107
107
  case 'OTEL_TRACES_SAMPLER_ARG':
108
- return !isNaN(parseFloat(value))
108
+ return !Number.isNaN(Number.parseFloat(value))
109
109
  case 'OTEL_SDK_DISABLED':
110
110
  return value.toLowerCase() === 'true' || value.toLowerCase() === 'false'
111
111
  case 'OTEL_TRACES_EXPORTER':
@@ -131,15 +131,12 @@ function checkIfBothOtelAndDdEnvVarSet () {
131
131
  }
132
132
  }
133
133
 
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,})'
134
+ // eslint-disable-next-line @stylistic/max-len
135
+ 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,}`
136
+ // eslint-disable-next-line @stylistic/max-len
137
+ 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`
138
+ // eslint-disable-next-line @stylistic/max-len
139
+ 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
140
  const runtimeId = uuid()
144
141
 
145
142
  function maybeFile (filepath) {
@@ -148,26 +145,23 @@ function maybeFile (filepath) {
148
145
  return fs.readFileSync(filepath, 'utf8')
149
146
  } catch (e) {
150
147
  log.error('Error reading file %s', filepath, e)
151
- return undefined
152
148
  }
153
149
  }
154
150
 
155
151
  function safeJsonParse (input) {
156
152
  try {
157
153
  return JSON.parse(input)
158
- } catch (err) {
159
- return undefined
160
- }
154
+ } catch {}
161
155
  }
162
156
 
163
- const namingVersions = ['v0', 'v1']
157
+ const namingVersions = new Set(['v0', 'v1'])
164
158
  const defaultNamingVersion = 'v0'
165
159
 
166
160
  function validateNamingVersion (versionString) {
167
161
  if (!versionString) {
168
162
  return defaultNamingVersion
169
163
  }
170
- if (!namingVersions.includes(versionString)) {
164
+ if (!namingVersions.has(versionString)) {
171
165
  log.warn(
172
166
  `Unexpected input for config.spanAttributeSchema, picked default ${defaultNamingVersion}`
173
167
  )
@@ -245,8 +239,8 @@ class Config {
245
239
 
246
240
  options = {
247
241
  ...options,
248
- appsec: options.appsec != null ? options.appsec : options.experimental?.appsec,
249
- iast: options.iast != null ? options.iast : options.experimental?.iast
242
+ appsec: options.appsec == null ? options.experimental?.appsec : options.appsec,
243
+ iast: options.iast == null ? options.experimental?.iast : options.iast
250
244
  }
251
245
 
252
246
  // Configure the logger first so it can be used to warn about other configs
@@ -429,8 +423,7 @@ class Config {
429
423
  )
430
424
  const defaultPropagationStyle = ['datadog', 'tracecontext']
431
425
  if (isTrue(DD_TRACE_B3_ENABLED)) {
432
- defaultPropagationStyle.push('b3')
433
- defaultPropagationStyle.push('b3 single header')
426
+ defaultPropagationStyle.push('b3', 'b3 single header')
434
427
  }
435
428
  return defaultPropagationStyle
436
429
  }
@@ -460,16 +453,20 @@ class Config {
460
453
  this._setBoolean(defaults, 'apmTracingEnabled', true)
461
454
  this._setValue(defaults, 'appsec.apiSecurity.enabled', true)
462
455
  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)
456
+ this._setValue(defaults, 'appsec.blockedTemplateGraphql')
457
+ this._setValue(defaults, 'appsec.blockedTemplateHtml')
458
+ this._setValue(defaults, 'appsec.blockedTemplateJson')
459
+ this._setValue(defaults, 'appsec.enabled')
467
460
  this._setValue(defaults, 'appsec.eventTracking.mode', 'identification')
461
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.enabled', false)
462
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.redaction', true)
463
+ this._setValue(defaults, 'appsec.extendedHeadersCollection.maxHeaders', 50)
468
464
  this._setValue(defaults, 'appsec.obfuscatorKeyRegex', defaultWafObfuscatorKeyRegex)
469
465
  this._setValue(defaults, 'appsec.obfuscatorValueRegex', defaultWafObfuscatorValueRegex)
470
466
  this._setValue(defaults, 'appsec.rasp.enabled', true)
467
+ this._setValue(defaults, 'appsec.rasp.bodyCollection', false)
471
468
  this._setValue(defaults, 'appsec.rateLimit', 100)
472
- this._setValue(defaults, 'appsec.rules', undefined)
469
+ this._setValue(defaults, 'appsec.rules')
473
470
  this._setValue(defaults, 'appsec.sca.enabled', null)
474
471
  this._setValue(defaults, 'appsec.stackTrace.enabled', true)
475
472
  this._setValue(defaults, 'appsec.stackTrace.maxDepth', 32)
@@ -477,6 +474,7 @@ class Config {
477
474
  this._setValue(defaults, 'appsec.wafTimeout', 5e3) // µs
478
475
  this._setValue(defaults, 'baggageMaxBytes', 8192)
479
476
  this._setValue(defaults, 'baggageMaxItems', 64)
477
+ this._setValue(defaults, 'baggageTagKeys', 'user.id,session.id,account.id')
480
478
  this._setValue(defaults, 'ciVisibilityTestSessionName', '')
481
479
  this._setValue(defaults, 'clientIpEnabled', false)
482
480
  this._setValue(defaults, 'clientIpHeader', null)
@@ -490,9 +488,9 @@ class Config {
490
488
  this._setValue(defaults, 'dynamicInstrumentation.enabled', false)
491
489
  this._setValue(defaults, 'dynamicInstrumentation.redactedIdentifiers', [])
492
490
  this._setValue(defaults, 'dynamicInstrumentation.redactionExcludedIdentifiers', [])
493
- this._setValue(defaults, 'env', undefined)
491
+ this._setValue(defaults, 'env')
494
492
  this._setValue(defaults, 'experimental.enableGetRumData', false)
495
- this._setValue(defaults, 'experimental.exporter', undefined)
493
+ this._setValue(defaults, 'experimental.exporter')
496
494
  this._setValue(defaults, 'experimental.runtimeId', false)
497
495
  this._setValue(defaults, 'flushInterval', 2000)
498
496
  this._setValue(defaults, 'flushMinSpans', 1000)
@@ -525,10 +523,10 @@ class Config {
525
523
  this._setValue(defaults, 'isIntelligentTestRunnerEnabled', false)
526
524
  this._setValue(defaults, 'isManualApiEnabled', false)
527
525
  this._setValue(defaults, 'langchain.spanCharLimit', 128)
528
- this._setValue(defaults, 'langchain.spanPromptCompletionSampleRate', 1.0)
529
- this._setValue(defaults, 'llmobs.agentlessEnabled', undefined)
526
+ this._setValue(defaults, 'langchain.spanPromptCompletionSampleRate', 1)
527
+ this._setValue(defaults, 'llmobs.agentlessEnabled')
530
528
  this._setValue(defaults, 'llmobs.enabled', false)
531
- this._setValue(defaults, 'llmobs.mlApp', undefined)
529
+ this._setValue(defaults, 'llmobs.mlApp')
532
530
  this._setValue(defaults, 'ciVisibilityTestSessionName', '')
533
531
  this._setValue(defaults, 'ciVisAgentlessLogSubmissionEnabled', false)
534
532
  this._setValue(defaults, 'legacyBaggageEnabled', true)
@@ -536,8 +534,9 @@ class Config {
536
534
  this._setValue(defaults, 'isServiceUserProvided', false)
537
535
  this._setValue(defaults, 'testManagementAttemptToFixRetries', 20)
538
536
  this._setValue(defaults, 'isTestManagementEnabled', false)
537
+ this._setValue(defaults, 'isImpactedTestsEnabled', false)
539
538
  this._setValue(defaults, 'logInjection', false)
540
- this._setValue(defaults, 'lookup', undefined)
539
+ this._setValue(defaults, 'lookup')
541
540
  this._setValue(defaults, 'inferredProxyServicesEnabled', false)
542
541
  this._setValue(defaults, 'memcachedCommandEnabled', false)
543
542
  this._setValue(defaults, 'middlewareTracingEnabled', true)
@@ -546,21 +545,21 @@ class Config {
546
545
  this._setValue(defaults, 'peerServiceMapping', {})
547
546
  this._setValue(defaults, 'plugins', true)
548
547
  this._setValue(defaults, 'port', '8126')
549
- this._setValue(defaults, 'profiling.enabled', undefined)
548
+ this._setValue(defaults, 'profiling.enabled')
550
549
  this._setValue(defaults, 'profiling.exporters', 'agent')
551
550
  this._setValue(defaults, 'profiling.sourceMap', true)
552
- this._setValue(defaults, 'profiling.longLivedThreshold', undefined)
551
+ this._setValue(defaults, 'profiling.longLivedThreshold')
553
552
  this._setValue(defaults, 'protocolVersion', '0.4')
554
553
  this._setValue(defaults, 'queryStringObfuscation', qsRegex)
555
554
  this._setValue(defaults, 'remoteConfig.enabled', true)
556
555
  this._setValue(defaults, 'remoteConfig.pollInterval', 5) // seconds
557
556
  this._setValue(defaults, 'reportHostname', false)
558
557
  this._setValue(defaults, 'runtimeMetrics', false)
559
- this._setValue(defaults, 'sampleRate', undefined)
558
+ this._setValue(defaults, 'sampleRate')
560
559
  this._setValue(defaults, 'sampler.rateLimit', 100)
561
560
  this._setValue(defaults, 'sampler.rules', [])
562
561
  this._setValue(defaults, 'sampler.spanSamplingRules', [])
563
- this._setValue(defaults, 'scope', undefined)
562
+ this._setValue(defaults, 'scope')
564
563
  this._setValue(defaults, 'service', service)
565
564
  this._setValue(defaults, 'serviceMapping', {})
566
565
  this._setValue(defaults, 'site', 'datadoghq.com')
@@ -575,7 +574,7 @@ class Config {
575
574
  this._setValue(defaults, 'telemetry.debug', false)
576
575
  this._setValue(defaults, 'telemetry.dependencyCollection', true)
577
576
  this._setValue(defaults, 'telemetry.enabled', true)
578
- this._setValue(defaults, 'telemetry.heartbeatInterval', 60000)
577
+ this._setValue(defaults, 'telemetry.heartbeatInterval', 60_000)
579
578
  this._setValue(defaults, 'telemetry.logCollection', true)
580
579
  this._setValue(defaults, 'telemetry.metrics', true)
581
580
  this._setValue(defaults, 'traceEnabled', true)
@@ -587,13 +586,13 @@ class Config {
587
586
  this._setValue(defaults, 'tracePropagationStyle.extract', ['datadog', 'tracecontext', 'baggage'])
588
587
  this._setValue(defaults, 'tracePropagationStyle.otelPropagators', false)
589
588
  this._setValue(defaults, 'tracing', true)
590
- this._setValue(defaults, 'url', undefined)
589
+ this._setValue(defaults, 'url')
591
590
  this._setValue(defaults, 'version', pkg.version)
592
- this._setValue(defaults, 'instrumentation_config_id', undefined)
591
+ this._setValue(defaults, 'instrumentation_config_id')
593
592
  this._setValue(defaults, 'vertexai.spanCharLimit', 128)
594
- this._setValue(defaults, 'vertexai.spanPromptCompletionSampleRate', 1.0)
593
+ this._setValue(defaults, 'vertexai.spanPromptCompletionSampleRate', 1)
595
594
  this._setValue(defaults, 'trace.aws.addSpanPointers', true)
596
- this._setValue(defaults, 'trace.dynamoDb.tablePrimaryKeys', undefined)
595
+ this._setValue(defaults, 'trace.dynamoDb.tablePrimaryKeys')
597
596
  this._setValue(defaults, 'trace.nativeSpanEvents', false)
598
597
  }
599
598
 
@@ -645,10 +644,13 @@ class Config {
645
644
  DD_APM_TRACING_ENABLED,
646
645
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
647
646
  DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING,
647
+ DD_APPSEC_COLLECT_ALL_HEADERS,
648
648
  DD_APPSEC_ENABLED,
649
649
  DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON,
650
+ DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED,
650
651
  DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML,
651
652
  DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON,
653
+ DD_APPSEC_MAX_COLLECTED_HEADERS,
652
654
  DD_APPSEC_MAX_STACK_TRACES,
653
655
  DD_APPSEC_MAX_STACK_TRACE_DEPTH,
654
656
  DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP,
@@ -657,6 +659,7 @@ class Config {
657
659
  DD_APPSEC_SCA_ENABLED,
658
660
  DD_APPSEC_STACK_TRACE_ENABLED,
659
661
  DD_APPSEC_RASP_ENABLED,
662
+ DD_APPSEC_RASP_COLLECT_REQUEST_BODY,
660
663
  DD_APPSEC_TRACE_RATE_LIMIT,
661
664
  DD_APPSEC_WAF_TIMEOUT,
662
665
  DD_CRASHTRACKING_ENABLED,
@@ -727,6 +730,7 @@ class Config {
727
730
  DD_TRACE_AWS_ADD_SPAN_POINTERS,
728
731
  DD_TRACE_BAGGAGE_MAX_BYTES,
729
732
  DD_TRACE_BAGGAGE_MAX_ITEMS,
733
+ DD_TRACE_BAGGAGE_TAG_KEYS,
730
734
  DD_TRACE_CLIENT_IP_ENABLED,
731
735
  DD_TRACE_CLIENT_IP_HEADER,
732
736
  DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS,
@@ -803,9 +807,18 @@ class Config {
803
807
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
804
808
  DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING // TODO: remove in next major
805
809
  ))
810
+ this._setBoolean(env, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
811
+ this._setBoolean(
812
+ env,
813
+ 'appsec.extendedHeadersCollection.redaction',
814
+ DD_APPSEC_HEADER_COLLECTION_REDACTION_ENABLED
815
+ )
816
+ this._setValue(env, 'appsec.extendedHeadersCollection.maxHeaders', maybeInt(DD_APPSEC_MAX_COLLECTED_HEADERS))
817
+ this._envUnprocessed['appsec.extendedHeadersCollection.maxHeaders'] = DD_APPSEC_MAX_COLLECTED_HEADERS
806
818
  this._setString(env, 'appsec.obfuscatorKeyRegex', DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP)
807
819
  this._setString(env, 'appsec.obfuscatorValueRegex', DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP)
808
820
  this._setBoolean(env, 'appsec.rasp.enabled', DD_APPSEC_RASP_ENABLED)
821
+ this._setBoolean(env, 'appsec.rasp.bodyCollection', DD_APPSEC_RASP_COLLECT_REQUEST_BODY)
809
822
  this._setValue(env, 'appsec.rateLimit', maybeInt(DD_APPSEC_TRACE_RATE_LIMIT))
810
823
  this._envUnprocessed['appsec.rateLimit'] = DD_APPSEC_TRACE_RATE_LIMIT
811
824
  this._setString(env, 'appsec.rules', DD_APPSEC_RULES)
@@ -820,6 +833,7 @@ class Config {
820
833
  this._envUnprocessed['appsec.wafTimeout'] = DD_APPSEC_WAF_TIMEOUT
821
834
  this._setValue(env, 'baggageMaxBytes', DD_TRACE_BAGGAGE_MAX_BYTES)
822
835
  this._setValue(env, 'baggageMaxItems', DD_TRACE_BAGGAGE_MAX_ITEMS)
836
+ this._setValue(env, 'baggageTagKeys', DD_TRACE_BAGGAGE_TAG_KEYS)
823
837
  this._setBoolean(env, 'clientIpEnabled', DD_TRACE_CLIENT_IP_ENABLED)
824
838
  this._setString(env, 'clientIpHeader', DD_TRACE_CLIENT_IP_HEADER?.toLowerCase())
825
839
  this._setBoolean(env, 'crashtracking.enabled', coalesce(
@@ -893,7 +907,7 @@ class Config {
893
907
  this._setValue(env, 'openai.spanCharLimit', maybeInt(DD_OPENAI_SPAN_CHAR_LIMIT))
894
908
  this._envUnprocessed.openaiSpanCharLimit = DD_OPENAI_SPAN_CHAR_LIMIT
895
909
  if (DD_TRACE_PEER_SERVICE_MAPPING) {
896
- this._setValue(env, 'peerServiceMapping', fromEntries(
910
+ this._setValue(env, 'peerServiceMapping', Object.fromEntries(
897
911
  DD_TRACE_PEER_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
898
912
  ))
899
913
  this._envUnprocessed.peerServiceMapping = DD_TRACE_PEER_SERVICE_MAPPING
@@ -941,7 +955,7 @@ class Config {
941
955
  this._setString(env, 'scope', DD_TRACE_SCOPE)
942
956
  this._setString(env, 'service', DD_SERVICE || DD_SERVICE_NAME || tags.service || OTEL_SERVICE_NAME)
943
957
  if (DD_SERVICE_MAPPING) {
944
- this._setValue(env, 'serviceMapping', fromEntries(
958
+ this._setValue(env, 'serviceMapping', Object.fromEntries(
945
959
  process.env.DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
946
960
  ))
947
961
  }
@@ -1018,9 +1032,24 @@ class Config {
1018
1032
  this._optsUnprocessed['appsec.blockedTemplateJson'] = options.appsec?.blockedTemplateJson
1019
1033
  this._setBoolean(opts, 'appsec.enabled', options.appsec?.enabled)
1020
1034
  this._setString(opts, 'appsec.eventTracking.mode', options.appsec?.eventTracking?.mode)
1035
+ this._setBoolean(
1036
+ opts,
1037
+ 'appsec.extendedHeadersCollection.enabled',
1038
+ options.appsec?.extendedHeadersCollection?.enabled
1039
+ )
1040
+ this._setBoolean(
1041
+ opts,
1042
+ 'appsec.extendedHeadersCollection.redaction',
1043
+ options.appsec?.extendedHeadersCollection?.redaction
1044
+ )
1045
+ this._setValue(opts,
1046
+ 'appsec.extendedHeadersCollection.maxHeaders',
1047
+ options.appsec?.extendedHeadersCollection?.maxHeaders
1048
+ )
1021
1049
  this._setString(opts, 'appsec.obfuscatorKeyRegex', options.appsec?.obfuscatorKeyRegex)
1022
1050
  this._setString(opts, 'appsec.obfuscatorValueRegex', options.appsec?.obfuscatorValueRegex)
1023
1051
  this._setBoolean(opts, 'appsec.rasp.enabled', options.appsec?.rasp?.enabled)
1052
+ this._setBoolean(opts, 'appsec.rasp.bodyCollection', options.appsec?.rasp?.bodyCollection)
1024
1053
  this._setValue(opts, 'appsec.rateLimit', maybeInt(options.appsec?.rateLimit))
1025
1054
  this._optsUnprocessed['appsec.rateLimit'] = options.appsec?.rateLimit
1026
1055
  this._setString(opts, 'appsec.rules', options.appsec?.rules)
@@ -1035,6 +1064,7 @@ class Config {
1035
1064
  this._setString(opts, 'clientIpHeader', options.clientIpHeader?.toLowerCase())
1036
1065
  this._setValue(opts, 'baggageMaxBytes', options.baggageMaxBytes)
1037
1066
  this._setValue(opts, 'baggageMaxItems', options.baggageMaxItems)
1067
+ this._setValue(opts, 'baggageTagKeys', options.baggageTagKeys)
1038
1068
  this._setBoolean(opts, 'codeOriginForSpans.enabled', options.codeOriginForSpans?.enabled)
1039
1069
  this._setBoolean(
1040
1070
  opts,
@@ -1245,7 +1275,8 @@ class Config {
1245
1275
  DD_AGENTLESS_LOG_SUBMISSION_ENABLED,
1246
1276
  DD_TEST_FAILED_TEST_REPLAY_ENABLED,
1247
1277
  DD_TEST_MANAGEMENT_ENABLED,
1248
- DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES
1278
+ DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
1279
+ DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED
1249
1280
  } = process.env
1250
1281
 
1251
1282
  if (DD_CIVISIBILITY_AGENTLESS_URL) {
@@ -1270,6 +1301,7 @@ class Config {
1270
1301
  'testManagementAttemptToFixRetries',
1271
1302
  coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20)
1272
1303
  )
1304
+ this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED))
1273
1305
  }
1274
1306
  this._setString(calc, 'dogstatsd.hostname', this._getHostname())
1275
1307
  this._setBoolean(calc, 'isGitUploadEnabled',
@@ -1341,9 +1373,9 @@ class Config {
1341
1373
  return this._setValue(obj, name, value)
1342
1374
  }
1343
1375
 
1344
- value = parseFloat(value)
1376
+ value = Number.parseFloat(value)
1345
1377
 
1346
- if (!isNaN(value)) {
1378
+ if (!Number.isNaN(value)) {
1347
1379
  // TODO: Ignore out of range values instead of normalizing them.
1348
1380
  this._setValue(obj, name, Math.min(Math.max(value, 0), 1))
1349
1381
  }
@@ -1358,7 +1390,7 @@ class Config {
1358
1390
  value = value.split(',').map(item => {
1359
1391
  // Trim each item and remove whitespace around the colon
1360
1392
  const [key, val] = item.split(':').map(part => part.trim())
1361
- return val !== undefined ? `${key}:${val}` : key
1393
+ return val === undefined ? key : `${key}:${val}`
1362
1394
  })
1363
1395
  }
1364
1396
 
@@ -1426,7 +1458,6 @@ class Config {
1426
1458
  // TODO: Deeply merge configurations.
1427
1459
  // TODO: Move change tracking to telemetry.
1428
1460
  // for telemetry reporting, `name`s in `containers` need to be keys from:
1429
- // eslint-disable-next-line @stylistic/js/max-len
1430
1461
  // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1431
1462
  _merge () {
1432
1463
  const containers = [
@@ -1516,13 +1547,13 @@ function parseSpaceSeparatedTags (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) {
@@ -27,7 +27,7 @@ class StableConfig {
27
27
  try {
28
28
  libdatadog = require('@datadog/libdatadog')
29
29
  this.wasm_loaded = true
30
- } catch (e) {
30
+ } catch {
31
31
  this.warnings.push('Can\'t load libdatadog library')
32
32
  return
33
33
  }
@@ -78,8 +78,8 @@ class StableConfig {
78
78
  fleetConfigPath = '/opt/datadog-agent/etc/managed/datadog-agent/stable/application_monitoring.yaml'
79
79
  break
80
80
  case 'win32':
81
- localConfigPath = 'C:\\ProgramData\\Datadog\\application_monitoring.yaml'
82
- fleetConfigPath = 'C:\\ProgramData\\Datadog\\managed\\datadog-agent\\stable\\application_monitoring.yaml'
81
+ localConfigPath = String.raw`C:\ProgramData\Datadog\application_monitoring.yaml`
82
+ fleetConfigPath = String.raw`C:\ProgramData\Datadog\managed\datadog-agent\stable\application_monitoring.yaml`
83
83
  break
84
84
  default:
85
85
  break
@@ -6,10 +6,10 @@ function encodeVarint (v) {
6
6
  // we leave the least significant bit for the sign.
7
7
  const double = Math.abs(v) * 2
8
8
  if (double > Number.MAX_SAFE_INTEGER) {
9
- return undefined
9
+ return
10
10
  }
11
- const high = Math.floor(double / 0x100000000)
12
- const low = (double & 0xffffffff) | sign
11
+ const high = Math.floor(double / 0x1_00_00_00_00)
12
+ const low = (double & 0xFF_FF_FF_FF) | sign
13
13
  return encodeUvarint64(low, high)
14
14
  }
15
15
 
@@ -21,7 +21,7 @@ function decodeVarint (b) {
21
21
  return [undefined, bytes]
22
22
  }
23
23
  const positive = (low & 1) === 0
24
- const abs = (low >>> 1) + high * 0x80000000
24
+ const abs = (low >>> 1) + high * 0x80_00_00_00
25
25
  return [positive ? abs : -abs, bytes]
26
26
  }
27
27
 
@@ -32,13 +32,13 @@ function encodeUvarint64 (low, high) {
32
32
  let i = 0
33
33
  // if first byte is 1, the number is negative in javascript, but we want to interpret it as positive
34
34
  while ((high !== 0 || low < 0 || low > 0x80) && i < maxVarLen64 - 1) {
35
- result[i] = (low & 0x7f) | 0x80
35
+ result[i] = (low & 0x7F) | 0x80
36
36
  low >>>= 7
37
- low |= (high & 0x7f) << 25
37
+ low |= (high & 0x7F) << 25
38
38
  high >>>= 7
39
39
  i++
40
40
  }
41
- result[i] = low & 0x7f
41
+ result[i] = low & 0x7F
42
42
  return result.slice(0, i + 1)
43
43
  }
44
44
 
@@ -64,11 +64,11 @@ function decodeUvarint64 (
64
64
  return [low, high, bytes]
65
65
  }
66
66
  if (s < 32) {
67
- low |= (n & 0x7f) << s
67
+ low |= (n & 0x7F) << s
68
68
  }
69
69
  if (s > 0) {
70
70
  high |=
71
- s - 32 > 0 ? (n & 0x7f) << (s - 32) : (n & 0x7f) >> (32 - s)
71
+ s - 32 > 0 ? (n & 0x7F) << (s - 32) : (n & 0x7F) >> (32 - s)
72
72
  }
73
73
  s += 7
74
74
  }
@@ -12,7 +12,7 @@ function fnv (data, hvalInit, fnvPrime, fnvSize) {
12
12
 
13
13
  function fnv64 (data) {
14
14
  if (!Buffer.isBuffer(data)) {
15
- data = Buffer.from(data, 'utf-8')
15
+ data = Buffer.from(data, 'utf8')
16
16
  }
17
17
  const byteArray = new Uint8Array(data)
18
18
  return fnv(byteArray, FNV1_64_INIT, FNV_64_PRIME, 2n ** 64n)
@@ -77,19 +77,19 @@ function decodePathwayContextBase64 (pathwayContext) {
77
77
  return decodePathwayContext(encodedPathway)
78
78
  }
79
79
 
80
- class DsmPathwayCodec {
80
+ const DsmPathwayCodec = {
81
81
  // we use a class for encoding / decoding in case we update our encoding/decoding. A class will make updates easier
82
82
  // instead of using individual functions.
83
- static encode (dataStreamsContext, carrier) {
83
+ encode (dataStreamsContext, carrier) {
84
84
  if (!dataStreamsContext || !dataStreamsContext.hash) {
85
85
  return
86
86
  }
87
87
  carrier[CONTEXT_PROPAGATION_KEY_BASE64] = encodePathwayContextBase64(dataStreamsContext)
88
88
 
89
89
  log.debug(() => `Injected into DSM carrier: ${JSON.stringify(pick(carrier, logKeys))}.`)
90
- }
90
+ },
91
91
 
92
- static decode (carrier) {
92
+ decode (carrier) {
93
93
  log.debug(() => `Attempting extract from DSM carrier: ${JSON.stringify(pick(carrier, logKeys))}.`)
94
94
 
95
95
  if (carrier == null) return
@@ -103,10 +103,8 @@ class StatsBucket {
103
103
  forBacklog (backlogData) {
104
104
  const backlog = new Backlog(backlogData)
105
105
  const existingBacklog = this._backlogs.get(backlog.hash)
106
- if (existingBacklog !== undefined) {
107
- if (existingBacklog.offset > backlog.offset) {
108
- return existingBacklog
109
- }
106
+ if (existingBacklog !== undefined && existingBacklog.offset > backlog.offset) {
107
+ return existingBacklog
110
108
  }
111
109
  this._backlogs.set(backlog.hash, backlog)
112
110
  return backlog
@@ -205,7 +203,9 @@ class DataStreamsProcessor {
205
203
  let parentHash = ENTRY_PARENT_HASH
206
204
  let closestOppositeDirectionHash = ENTRY_PARENT_HASH
207
205
  let closestOppositeDirectionEdgeStart = nowNs
208
- if (ctx != null) {
206
+ if (ctx == null) {
207
+ log.debug(() => 'Setting DSM Checkpoint with empty parent context.')
208
+ } else {
209
209
  pathwayStartNs = ctx.pathwayStartNs
210
210
  edgeStartNs = ctx.edgeStartNs
211
211
  parentHash = ctx.hash
@@ -229,8 +229,6 @@ class DataStreamsProcessor {
229
229
  log.debug(
230
230
  () => `Setting DSM Checkpoint from extracted parent context with hash: ${parentHash} and edge tags: ${edgeTags}`
231
231
  )
232
- } else {
233
- log.debug(() => 'Setting DSM Checkpoint with empty parent context.')
234
232
  }
235
233
  const hash = computePathwayHash(this.service, this.env, edgeTags, parentHash)
236
234
  const edgeLatencyNs = nowNs - edgeStartNs
@@ -20,7 +20,7 @@ class SchemaBuilder {
20
20
  static getSchemaDefinition (schema) {
21
21
  const noNones = convertToJsonCompatible(schema)
22
22
  const definition = jsonStringify(noNones)
23
- const id = fnv64(Buffer.from(definition, 'utf-8')).toString()
23
+ const id = fnv64(Buffer.from(definition, 'utf8')).toString()
24
24
  return new Schema(definition, id)
25
25
  }
26
26
 
@@ -8,12 +8,10 @@ class SchemaSampler {
8
8
 
9
9
  trySample (currentTimeMs) {
10
10
  if (currentTimeMs >= this.lastSampleMs + SAMPLE_INTERVAL_MILLIS) {
11
- if (currentTimeMs >= this.lastSampleMs + SAMPLE_INTERVAL_MILLIS) {
12
- this.lastSampleMs = currentTimeMs
13
- const weight = this.weight
14
- this.weight = 0
15
- return weight
16
- }
11
+ this.lastSampleMs = currentTimeMs
12
+ const weight = this.weight
13
+ this.weight = 0
14
+ return weight
17
15
  }
18
16
  return 0
19
17
  }
@@ -4,7 +4,7 @@ const { types } = require('util')
4
4
 
5
5
  function getSizeOrZero (obj) {
6
6
  if (typeof obj === 'string') {
7
- return Buffer.from(obj, 'utf-8').length
7
+ return Buffer.from(obj, 'utf8').length
8
8
  }
9
9
  if (types.isArrayBuffer(obj)) {
10
10
  return obj.byteLength