dd-trace 5.52.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 (332) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/README.md +5 -0
  3. package/index.d.ts +87 -22
  4. package/initialize.mjs +3 -4
  5. package/package.json +36 -34
  6. package/packages/datadog-core/src/utils/src/get.js +1 -1
  7. package/packages/datadog-core/src/utils/src/has.js +1 -1
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  9. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  10. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  11. package/packages/datadog-core/src/utils/src/set.js +1 -1
  12. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  14. package/packages/datadog-instrumentations/src/amqplib.js +57 -37
  15. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  18. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  19. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
  20. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  21. package/packages/datadog-instrumentations/src/cucumber.js +126 -84
  22. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  23. package/packages/datadog-instrumentations/src/dns.js +1 -1
  24. package/packages/datadog-instrumentations/src/express.js +2 -6
  25. package/packages/datadog-instrumentations/src/fs.js +7 -6
  26. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  27. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  28. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  29. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  30. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  31. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  32. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -1
  33. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  34. package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
  35. package/packages/datadog-instrumentations/src/http/client.js +16 -21
  36. package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
  37. package/packages/datadog-instrumentations/src/jest.js +184 -87
  38. package/packages/datadog-instrumentations/src/kafkajs.js +65 -44
  39. package/packages/datadog-instrumentations/src/knex.js +4 -4
  40. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  41. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  42. package/packages/datadog-instrumentations/src/mocha/main.js +85 -59
  43. package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
  44. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  45. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  46. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  47. package/packages/datadog-instrumentations/src/mysql2.js +55 -47
  48. package/packages/datadog-instrumentations/src/net.js +4 -2
  49. package/packages/datadog-instrumentations/src/next.js +7 -14
  50. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  51. package/packages/datadog-instrumentations/src/openai.js +21 -23
  52. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +6 -13
  54. package/packages/datadog-instrumentations/src/playwright.js +170 -136
  55. package/packages/datadog-instrumentations/src/redis.js +3 -3
  56. package/packages/datadog-instrumentations/src/restify.js +2 -2
  57. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  58. package/packages/datadog-instrumentations/src/router.js +22 -25
  59. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  60. package/packages/datadog-instrumentations/src/url.js +9 -17
  61. package/packages/datadog-instrumentations/src/vitest.js +126 -97
  62. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  63. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  64. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  65. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  66. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  67. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  68. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  69. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  70. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  72. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  73. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  74. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  75. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  76. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  77. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  78. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  79. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  80. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  81. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  82. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  83. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  84. package/packages/datadog-plugin-cucumber/src/index.js +86 -20
  85. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  86. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  87. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  88. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  89. package/packages/datadog-plugin-express/src/index.js +10 -12
  90. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  91. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  92. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  94. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  95. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  96. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  97. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  98. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  99. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  100. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  101. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  102. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  103. package/packages/datadog-plugin-http/src/client.js +18 -7
  104. package/packages/datadog-plugin-http2/src/client.js +20 -20
  105. package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
  106. package/packages/datadog-plugin-jest/src/index.js +36 -28
  107. package/packages/datadog-plugin-jest/src/util.js +8 -8
  108. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  109. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  110. package/packages/datadog-plugin-kafkajs/src/producer.js +15 -7
  111. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  112. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  113. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  114. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  115. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  116. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  117. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  118. package/packages/datadog-plugin-mocha/src/index.js +88 -48
  119. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  120. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  121. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  122. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  123. package/packages/datadog-plugin-next/src/index.js +6 -5
  124. package/packages/datadog-plugin-openai/src/services.js +6 -10
  125. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  126. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  127. package/packages/datadog-plugin-playwright/src/index.js +48 -22
  128. package/packages/datadog-plugin-redis/src/index.js +9 -4
  129. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  130. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  131. package/packages/datadog-plugin-router/src/index.js +1 -1
  132. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  133. package/packages/datadog-plugin-vitest/src/index.js +99 -72
  134. package/packages/datadog-shimmer/src/shimmer.js +163 -36
  135. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  136. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  137. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  138. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  139. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  140. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  141. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  142. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  143. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  144. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  145. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  146. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  147. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  148. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  149. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  150. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  151. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  152. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  153. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  154. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  158. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  159. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  160. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  161. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  162. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  163. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  164. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  168. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  169. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  170. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  171. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  172. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  173. package/packages/dd-trace/src/appsec/index.js +15 -12
  174. package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
  175. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  176. package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
  177. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  178. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  179. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  180. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  181. package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
  182. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
  183. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  184. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  185. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -8
  186. package/packages/dd-trace/src/azure_metadata.js +2 -7
  187. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  189. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  191. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  192. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  193. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  194. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  195. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  196. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  197. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  198. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  199. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  200. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  201. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  202. package/packages/dd-trace/src/config.js +82 -51
  203. package/packages/dd-trace/src/config_stable.js +3 -3
  204. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  205. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  206. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  207. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  208. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  209. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  210. package/packages/dd-trace/src/datastreams/size.js +1 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +131 -72
  212. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  213. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  214. package/packages/dd-trace/src/debugger/devtools_client/index.js +17 -27
  215. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  216. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
  217. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
  218. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  219. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  220. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  221. package/packages/dd-trace/src/debugger/devtools_client/state.js +31 -4
  222. package/packages/dd-trace/src/dogstatsd.js +7 -4
  223. package/packages/dd-trace/src/encode/0.4.js +9 -9
  224. package/packages/dd-trace/src/encode/0.5.js +1 -1
  225. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  226. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  227. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  228. package/packages/dd-trace/src/exporter.js +6 -6
  229. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  230. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  231. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  232. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  233. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  234. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  235. package/packages/dd-trace/src/flare/file.js +1 -5
  236. package/packages/dd-trace/src/format.js +1 -1
  237. package/packages/dd-trace/src/git_properties.js +1 -1
  238. package/packages/dd-trace/src/id.js +12 -6
  239. package/packages/dd-trace/src/iitm.js +10 -22
  240. package/packages/dd-trace/src/lambda/handler.js +6 -6
  241. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  242. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  244. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  245. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  246. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  247. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  248. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  249. package/packages/dd-trace/src/llmobs/tagger.js +113 -99
  250. package/packages/dd-trace/src/llmobs/util.js +9 -9
  251. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  252. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  253. package/packages/dd-trace/src/log/index.js +4 -4
  254. package/packages/dd-trace/src/log/log.js +1 -1
  255. package/packages/dd-trace/src/log/writer.js +2 -2
  256. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  257. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  258. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  259. package/packages/dd-trace/src/noop/span.js +3 -5
  260. package/packages/dd-trace/src/noop/tracer.js +1 -2
  261. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  262. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  263. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  264. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  265. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  266. package/packages/dd-trace/src/opentracing/span.js +9 -14
  267. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  268. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  269. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  270. package/packages/dd-trace/src/pkg.js +1 -1
  271. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  272. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  273. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  274. package/packages/dd-trace/src/plugins/index.js +1 -1
  275. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  276. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  277. package/packages/dd-trace/src/plugins/producer.js +2 -2
  278. package/packages/dd-trace/src/plugins/storage.js +2 -2
  279. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  280. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  281. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  282. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  283. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  284. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  286. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  289. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  290. package/packages/dd-trace/src/priority_sampler.js +22 -22
  291. package/packages/dd-trace/src/profiling/config.js +44 -8
  292. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  293. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  294. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  295. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  296. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  297. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  298. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  299. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  300. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  301. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  302. package/packages/dd-trace/src/proxy.js +7 -13
  303. package/packages/dd-trace/src/random_sampler.js +40 -0
  304. package/packages/dd-trace/src/rate_limiter.js +4 -4
  305. package/packages/dd-trace/src/remote_config/index.js +3 -7
  306. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  307. package/packages/dd-trace/src/require-package-json.js +1 -1
  308. package/packages/dd-trace/src/ritm.js +4 -4
  309. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  310. package/packages/dd-trace/src/sampler.js +33 -4
  311. package/packages/dd-trace/src/sampling_rule.js +12 -3
  312. package/packages/dd-trace/src/scope.js +1 -1
  313. package/packages/dd-trace/src/serverless.js +0 -48
  314. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  315. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
  316. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  317. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  318. package/packages/dd-trace/src/span_processor.js +3 -3
  319. package/packages/dd-trace/src/span_sampler.js +4 -1
  320. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  321. package/packages/dd-trace/src/startup-log.js +2 -2
  322. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  323. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  324. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  325. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  326. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  327. package/packages/dd-trace/src/util.js +1 -1
  328. package/version.js +1 -0
  329. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  330. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  331. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  332. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -44,27 +44,24 @@ class AbortError extends Error {
44
44
  }
45
45
  }
46
46
 
47
+ const types = new Set(['query', 'mutation', 'subscription'])
48
+
47
49
  function getOperation (document, operationName) {
48
50
  if (!document || !Array.isArray(document.definitions)) {
49
51
  return
50
52
  }
51
53
 
52
- const definitions = document.definitions.filter(def => def)
53
- const types = ['query', 'mutation', 'subscription']
54
-
55
- if (operationName) {
56
- return definitions
57
- .filter(def => types.indexOf(def.operation) !== -1)
58
- .find(def => operationName === (def.name && def.name.value))
59
- } else {
60
- return definitions.find(def => types.indexOf(def.operation) !== -1)
54
+ for (const definition of document.definitions) {
55
+ if (definition && types.has(definition.operation) && (!operationName || definition.name?.value === operationName)) {
56
+ return definition
57
+ }
61
58
  }
62
59
  }
63
60
 
64
61
  function normalizeArgs (args, defaultFieldResolver) {
65
62
  if (args.length !== 1) return normalizePositional(args, defaultFieldResolver)
66
63
 
67
- args[0].contextValue = args[0].contextValue || {}
64
+ args[0].contextValue ||= {}
68
65
  args[0].fieldResolver = wrapResolve(args[0].fieldResolver || defaultFieldResolver)
69
66
 
70
67
  return args[0]
@@ -4,8 +4,6 @@ const types = require('./types')
4
4
  const { addHook, channel } = require('../helpers/instrument')
5
5
  const shimmer = require('../../../datadog-shimmer')
6
6
 
7
- const nodeMajor = parseInt(process.versions.node.split('.')[0])
8
-
9
7
  const patched = new WeakSet()
10
8
  const instances = new WeakMap()
11
9
 
@@ -98,7 +96,7 @@ function wrapMethod (method, path, type, hasPeer) {
98
96
  return wrapped
99
97
  }
100
98
 
101
- function wrapCallback (ctx, callback = () => { }) {
99
+ function wrapCallback (ctx, callback = () => {}) {
102
100
  return shimmer.wrapFunction(callback, callback => function (err) {
103
101
  if (err) {
104
102
  ctx.error = err
@@ -112,18 +110,18 @@ function wrapCallback (ctx, callback = () => { }) {
112
110
  })
113
111
  }
114
112
 
115
- function createWrapEmit (ctx, hasPeer = false) {
116
- const onStatusWithPeer = function (ctx, arg1, thisArg) {
117
- ctx.result = arg1
118
- ctx.peer = thisArg.getPeer()
119
- finishChannel.publish(ctx)
120
- }
113
+ const onStatusWithPeer = function (ctx, arg1, thisArg) {
114
+ ctx.result = arg1
115
+ ctx.peer = thisArg.getPeer()
116
+ finishChannel.publish(ctx)
117
+ }
121
118
 
122
- const onStatusWithoutPeer = function (ctx, arg1, thisArg) {
123
- ctx.result = arg1
124
- finishChannel.publish(ctx)
125
- }
119
+ const onStatusWithoutPeer = function (ctx, arg1) {
120
+ ctx.result = arg1
121
+ finishChannel.publish(ctx)
122
+ }
126
123
 
124
+ function createWrapEmit (ctx, hasPeer = false) {
127
125
  const onStatus = hasPeer ? onStatusWithPeer : onStatusWithoutPeer
128
126
 
129
127
  return function wrapEmit (emit) {
@@ -245,16 +243,6 @@ function patch (hasPeer = false) {
245
243
  }
246
244
  }
247
245
 
248
- if (nodeMajor <= 14) {
249
- addHook({ name: 'grpc', versions: ['>=1.24.3'] }, patch(true))
250
-
251
- addHook({ name: 'grpc', versions: ['>=1.24.3'], file: 'src/client.js' }, client => {
252
- shimmer.wrap(client, 'makeClientConstructor', createWrapMakeClientConstructor(true))
253
-
254
- return client
255
- })
256
- }
257
-
258
246
  addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3 <1.1.4'] }, patch(false))
259
247
 
260
248
  addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3 <1.1.4'], file: 'build/src/make-client.js' }, client => {
@@ -4,8 +4,6 @@ const types = require('./types')
4
4
  const { channel, addHook } = require('../helpers/instrument')
5
5
  const shimmer = require('../../../datadog-shimmer')
6
6
 
7
- const nodeMajor = parseInt(process.versions.node.split('.')[0])
8
-
9
7
  const startChannel = channel('apm:grpc:server:request:start')
10
8
  const asyncStartChannel = channel('apm:grpc:server:request:asyncStart')
11
9
  const errorChannel = channel('apm:grpc:server:request:error')
@@ -17,17 +15,14 @@ const emitChannel = channel('apm:grpc:server:request:emit')
17
15
  const OK = 0
18
16
  const CANCELLED = 1
19
17
 
20
- function wrapHandler (func, name) {
21
- const isValid = (server, args) => {
22
- if (!startChannel.hasSubscribers) return false
23
- if (!server || !server.type) return false
24
- if (!args[0]) return false
25
- if (server.type !== 'unary' && !isEmitter(args[0])) return false
26
- if (server.type === 'unary' && typeof args[1] !== 'function') return false
27
-
28
- return true
29
- }
18
+ const isValid = (server, args) => {
19
+ return Boolean(startChannel.hasSubscribers &&
20
+ server?.type &&
21
+ args[0] &&
22
+ (server.type === 'unary' ? typeof args[1] === 'function' : isEmitter(args[0])))
23
+ }
30
24
 
25
+ function wrapHandler (func, name) {
31
26
  return function (call, callback) {
32
27
  if (!isValid(this, arguments)) return func.apply(this, arguments)
33
28
 
@@ -152,14 +147,6 @@ function isEmitter (obj) {
152
147
  return typeof obj.emit === 'function' && typeof obj.once === 'function'
153
148
  }
154
149
 
155
- if (nodeMajor <= 14) {
156
- addHook({ name: 'grpc', versions: ['>=1.24.3'], file: 'src/server.js' }, server => {
157
- shimmer.wrap(server.Server.prototype, 'register', wrapRegister)
158
-
159
- return server
160
- })
161
- }
162
-
163
150
  addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3'], file: 'build/src/server.js' }, server => {
164
151
  shimmer.wrap(server.Server.prototype, 'register', wrapRegister)
165
152
 
@@ -10,27 +10,33 @@ const NM = 'node_modules/'
10
10
  */
11
11
  module.exports = function extractPackageAndModulePath (fullPath) {
12
12
  const nm = fullPath.lastIndexOf(NM)
13
- if (nm < 0) {
13
+ if (nm === -1) {
14
14
  return { pkg: null, path: null }
15
15
  }
16
16
 
17
- const subPath = fullPath.substring(nm + NM.length)
17
+ const subPath = fullPath.slice(nm + NM.length)
18
18
  const firstSlash = subPath.indexOf('/')
19
19
 
20
- const firstPath = fullPath.substring(fullPath[0], nm + NM.length)
20
+ const firstPath = fullPath.slice(0, nm + NM.length)
21
+
22
+ const firstSlashSubPath = subPath.slice(Math.max(0, firstSlash + 1))
21
23
 
22
24
  if (subPath[0] === '@') {
23
- const secondSlash = subPath.substring(firstSlash + 1).indexOf('/')
25
+ const secondSlash = firstSlashSubPath.indexOf('/')
26
+ const pkg = subPath.slice(0, Math.max(0, firstSlash + 1 + secondSlash))
27
+
24
28
  return {
25
- pkg: subPath.substring(0, firstSlash + 1 + secondSlash),
26
- path: subPath.substring(firstSlash + 1 + secondSlash + 1),
27
- pkgJson: firstPath + subPath.substring(0, firstSlash + 1 + secondSlash) + '/package.json'
29
+ pkg,
30
+ path: subPath.slice(Math.max(0, firstSlash + 1 + secondSlash + 1)),
31
+ pkgJson: firstPath + pkg + '/package.json'
28
32
  }
29
33
  }
30
34
 
35
+ const pkg = subPath.slice(0, Math.max(0, firstSlash))
36
+
31
37
  return {
32
- pkg: subPath.substring(0, firstSlash),
33
- path: subPath.substring(firstSlash + 1),
34
- pkgJson: firstPath + subPath.substring(0, firstSlash) + '/package.json'
38
+ pkg,
39
+ path: firstSlashSubPath,
40
+ pkgJson: firstPath + pkg + '/package.json'
35
41
  }
36
42
  }
@@ -22,7 +22,7 @@ function Hook (modules, hookOptions, onrequire) {
22
22
  this._patched = Object.create(null)
23
23
 
24
24
  const safeHook = (moduleExports, moduleName, moduleBaseDir, moduleVersion) => {
25
- const parts = [moduleBaseDir, moduleName].filter(v => v)
25
+ const parts = [moduleBaseDir, moduleName].filter(Boolean)
26
26
  const filename = path.join(...parts)
27
27
 
28
28
  if (this._patched[filename]) return moduleExports
@@ -61,6 +61,7 @@ module.exports = {
61
61
  http2: () => require('../http2'),
62
62
  https: () => require('../http'),
63
63
  ioredis: () => require('../ioredis'),
64
+ iovalkey: () => require('../iovalkey'),
64
65
  'jest-circus': () => require('../jest'),
65
66
  'jest-config': () => require('../jest'),
66
67
  'jest-environment-node': () => require('../jest'),
@@ -104,7 +105,6 @@ module.exports = {
104
105
  nyc: () => require('../nyc'),
105
106
  oracledb: () => require('../oracledb'),
106
107
  openai: { esmFirst: true, fn: () => require('../openai') },
107
- paperplane: () => require('../paperplane'),
108
108
  passport: () => require('../passport'),
109
109
  'passport-http': () => require('../passport-http'),
110
110
  'passport-local': () => require('../passport-local'),
@@ -1,7 +1,6 @@
1
1
  'use strict'
2
2
 
3
3
  const dc = require('dc-polyfill')
4
- const satisfies = require('semifies')
5
4
  const instrumentations = require('./instrumentations')
6
5
  const { AsyncResource } = require('async_hooks')
7
6
 
@@ -34,43 +33,4 @@ exports.addHook = function addHook ({ name, versions, file, filePattern }, hook)
34
33
  }
35
34
  }
36
35
 
37
- // AsyncResource.bind exists and binds `this` properly only from 17.8.0 and up.
38
- // https://nodejs.org/api/async_context.html#asyncresourcebindfn-thisarg
39
- if (satisfies(process.versions.node, '>=17.8.0')) {
40
- exports.AsyncResource = AsyncResource
41
- } else {
42
- exports.AsyncResource = class extends AsyncResource {
43
- static bind (fn, type, thisArg) {
44
- type = type || fn.name
45
- return (new exports.AsyncResource(type || 'bound-anonymous-fn')).bind(fn, thisArg)
46
- }
47
-
48
- bind (fn, thisArg) {
49
- let bound
50
- if (thisArg === undefined) {
51
- const resource = this
52
- bound = function (...args) {
53
- args.unshift(fn, this)
54
- return Reflect.apply(resource.runInAsyncScope, resource, args)
55
- }
56
- } else {
57
- bound = this.runInAsyncScope.bind(this, fn, thisArg)
58
- }
59
- Object.defineProperties(bound, {
60
- length: {
61
- configurable: true,
62
- enumerable: false,
63
- value: fn.length,
64
- writable: false
65
- },
66
- asyncResource: {
67
- configurable: true,
68
- enumerable: true,
69
- value: this,
70
- writable: true
71
- }
72
- })
73
- return bound
74
- }
75
- }
76
- }
36
+ exports.AsyncResource = AsyncResource
@@ -26,7 +26,7 @@ const disabledInstrumentations = new Set(
26
26
  // Check for DD_TRACE_<INTEGRATION>_ENABLED environment variables
27
27
  for (const [key, value] of Object.entries(process.env)) {
28
28
  const match = key.match(/^DD_TRACE_(.+)_ENABLED$/)
29
- if (match && (value.toLowerCase() === 'false' || value === '0')) {
29
+ if (match && (value?.toLowerCase() === 'false' || value === '0')) {
30
30
  const integration = match[1].toLowerCase()
31
31
  disabledInstrumentations.add(integration)
32
32
  }
@@ -43,7 +43,7 @@ if (!disabledInstrumentations.has('process')) {
43
43
  require('../process')
44
44
  }
45
45
 
46
- const HOOK_SYMBOL = Symbol('hookExportsMap')
46
+ const HOOK_SYMBOL = Symbol('hookExportsSet')
47
47
 
48
48
  if (DD_TRACE_DEBUG && DD_TRACE_DEBUG.toLowerCase() !== 'false') {
49
49
  checkRequireCache.checkForRequiredModules()
@@ -89,12 +89,13 @@ for (const packageName of names) {
89
89
  fullFilePattern = filename(name, fullFilePattern)
90
90
  }
91
91
 
92
- // Create a WeakMap associated with the hook function so that patches on the same moduleExport only happens once
92
+ // Create a WeakSet associated with the hook function so that patches on the same moduleExport only happens once
93
93
  // for example by instrumenting both dns and node:dns double the spans would be created
94
- // since they both patch the same moduleExport, this WeakMap is used to mitigate that
95
- if (!hook[HOOK_SYMBOL]) {
96
- hook[HOOK_SYMBOL] = new WeakMap()
97
- }
94
+ // since they both patch the same moduleExport, this WeakSet is used to mitigate that
95
+ // TODO(BridgeAR): Instead of using a WeakSet here, why not just use aliases for the hook in register?
96
+ // That way it would also not be duplicated. The actual name being used has to be identified else wise.
97
+ // Maybe it is also not important to know what name was actually used?
98
+ hook[HOOK_SYMBOL] ??= new WeakSet()
98
99
  let matchesFile = false
99
100
 
100
101
  matchesFile = moduleName === fullFilename
@@ -114,7 +115,7 @@ for (const packageName of names) {
114
115
  log.error('Error getting version for "%s": %s', name, e.message, e)
115
116
  continue
116
117
  }
117
- if (typeof namesAndSuccesses[`${name}@${version}`] === 'undefined') {
118
+ if (namesAndSuccesses[`${name}@${version}`] === undefined && !file) {
118
119
  // TODO If `file` is present, we might elsewhere instrument the result of the module
119
120
  // for a version range that actually matches, so we can't assume that we're _not_
120
121
  // going to instrument that. However, the way the data model around instrumentation
@@ -122,9 +123,7 @@ for (const packageName of names) {
122
123
  // ignore this if there is a `file` in the hook. The thing to do here is rework
123
124
  // everything so that we can be sure that there are _no_ instrumentations that it
124
125
  // could match.
125
- if (!file) {
126
- namesAndSuccesses[`${name}@${version}`] = false
127
- }
126
+ namesAndSuccesses[`${name}@${version}`] = false
128
127
  }
129
128
 
130
129
  if (matchVersion(version, versions)) {
@@ -140,12 +139,16 @@ for (const packageName of names) {
140
139
  loadChannel.publish({ name, version, file })
141
140
  // Send the name and version of the module back to the callback because now addHook
142
141
  // takes in an array of names so by passing the name the callback will know which module name is being used
143
- moduleExports = hook(moduleExports, version, name)
144
- // Set the moduleExports in the hooks weakmap
145
- hook[HOOK_SYMBOL].set(moduleExports, name)
142
+ // TODO(BridgeAR): This is only true in case the name is identical
143
+ // in all loads. If they deviate, the deviating name would not be
144
+ // picked up due to the unification. Check what modules actually use the name.
145
+ // TODO(BridgeAR): Only replace moduleExports if the hook returns a new value.
146
+ // This allows to reduce the instrumentation code (no return needed).
147
+ moduleExports = hook(moduleExports, version, name) ?? moduleExports
148
+ // Set the moduleExports in the hooks WeakSet
149
+ hook[HOOK_SYMBOL].add(moduleExports)
146
150
  } catch (e) {
147
- log.info('Error during ddtrace instrumentation of application, aborting.')
148
- log.info(e)
151
+ log.info('Error during ddtrace instrumentation of application, aborting.', e)
149
152
  telemetry('error', [
150
153
  `error_type:${e.constructor.name}`,
151
154
  `integration:${name}`,
@@ -185,7 +188,7 @@ function getVersion (moduleBaseDir) {
185
188
  }
186
189
 
187
190
  function filename (name, file) {
188
- return [name, file].filter(val => val).join('/')
191
+ return [name, file].filter(Boolean).join('/')
189
192
  }
190
193
 
191
194
  // This function captures the instrumentation file name for a given package by parsing the hook require
@@ -212,7 +215,7 @@ function parseHookInstrumentationFileName (packageName) {
212
215
  let moduleName = match[1]
213
216
  // Remove leading '../' if present
214
217
  if (moduleName.startsWith('../')) {
215
- moduleName = moduleName.substring(3)
218
+ moduleName = moduleName.slice(3)
216
219
  }
217
220
  return moduleName
218
221
  }
@@ -3,6 +3,7 @@
3
3
  /* eslint-disable no-fallthrough */
4
4
 
5
5
  const url = require('url')
6
+ const { errorMonitor } = require('events')
6
7
  const { channel, addHook } = require('../helpers/instrument')
7
8
  const shimmer = require('../../../datadog-shimmer')
8
9
 
@@ -25,6 +26,19 @@ function hookFn (http) {
25
26
  return http
26
27
  }
27
28
 
29
+ function combineOptions (inputURL, inputOptions) {
30
+ return inputOptions !== null && typeof inputOptions === 'object'
31
+ ? Object.assign(inputURL || {}, inputOptions)
32
+ : inputURL
33
+ }
34
+ function normalizeHeaders (options) {
35
+ options.headers ??= {}
36
+ }
37
+
38
+ function normalizeCallback (inputOptions, callback, inputURL) {
39
+ return typeof inputOptions === 'function' ? [inputOptions, inputURL || {}] : [callback, inputOptions]
40
+ }
41
+
28
42
  function patch (http, methodName) {
29
43
  shimmer.wrap(http, methodName, instrumentRequest)
30
44
 
@@ -88,7 +102,7 @@ function patch (http, methodName) {
88
102
  const res = arg
89
103
  ctx.res = res
90
104
  res.on('end', finish)
91
- res.on('error', finish)
105
+ res.on(errorMonitor, finish)
92
106
  break
93
107
  }
94
108
  case 'connect':
@@ -142,30 +156,11 @@ function patch (http, methodName) {
142
156
  return { uri, options, callback, originalUrl }
143
157
  }
144
158
 
145
- function combineOptions (inputURL, inputOptions) {
146
- if (inputOptions !== null && typeof inputOptions === 'object') {
147
- return Object.assign(inputURL || {}, inputOptions)
148
- } else {
149
- return inputURL
150
- }
151
- }
152
- function normalizeHeaders (options) {
153
- options.headers = options.headers || {}
154
- }
155
-
156
- function normalizeCallback (inputOptions, callback, inputURL) {
157
- if (typeof inputOptions === 'function') {
158
- return [inputOptions, inputURL || {}]
159
- } else {
160
- return [callback, inputOptions]
161
- }
162
- }
163
-
164
159
  function normalizeOptions (inputURL) {
165
160
  if (typeof inputURL === 'string') {
166
161
  try {
167
162
  return urlToOptions(new url.URL(inputURL))
168
- } catch (e) {
163
+ } catch {
169
164
  // eslint-disable-next-line n/no-deprecated-api
170
165
  return url.parse(inputURL)
171
166
  }
@@ -0,0 +1,51 @@
1
+ 'use strict'
2
+
3
+ const {
4
+ channel,
5
+ addHook,
6
+ AsyncResource
7
+ } = require('./helpers/instrument')
8
+ const shimmer = require('../../datadog-shimmer')
9
+
10
+ const startCh = channel('apm:iovalkey:command:start')
11
+ const finishCh = channel('apm:iovalkey:command:finish')
12
+ const errorCh = channel('apm:iovalkey:command:error')
13
+
14
+ addHook({ name: 'iovalkey', versions: ['>=0.0.1'] }, Valkey => {
15
+ shimmer.wrap(Valkey.prototype, 'sendCommand', sendCommand => function (command, stream) {
16
+ if (!startCh.hasSubscribers) return sendCommand.apply(this, arguments)
17
+
18
+ if (!command?.promise) return sendCommand.apply(this, arguments)
19
+
20
+ const options = this.options || {}
21
+ const connectionName = options.connectionName
22
+ const db = options.db
23
+ const connectionOptions = { host: options.host, port: options.port }
24
+
25
+ const asyncResource = new AsyncResource('bound-anonymous-fn')
26
+ return asyncResource.runInAsyncScope(() => {
27
+ startCh.publish({ db, command: command.name, args: command.args, connectionOptions, connectionName })
28
+
29
+ const onResolve = asyncResource.bind(() => finishCh.publish())
30
+ const onReject = asyncResource.bind(err => finish(finishCh, errorCh, err))
31
+
32
+ command.promise.then(onResolve, onReject)
33
+
34
+ try {
35
+ return sendCommand.apply(this, arguments)
36
+ } catch (err) {
37
+ errorCh.publish(err)
38
+
39
+ throw err
40
+ }
41
+ })
42
+ })
43
+ return Valkey
44
+ })
45
+
46
+ function finish (finishCh, errorCh, error) {
47
+ if (error) {
48
+ errorCh.publish(error)
49
+ }
50
+ finishCh.publish()
51
+ }