dd-trace 5.53.0 → 5.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/index.d.ts +33 -16
  6. package/initialize.mjs +5 -6
  7. package/package.json +40 -38
  8. package/packages/datadog-code-origin/index.js +22 -4
  9. package/packages/datadog-core/src/utils/src/get.js +1 -1
  10. package/packages/datadog-core/src/utils/src/has.js +1 -1
  11. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  12. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  13. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  14. package/packages/datadog-core/src/utils/src/set.js +1 -1
  15. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  16. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  17. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  18. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/cassandra-driver.js +10 -10
  21. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  22. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
  23. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  24. package/packages/datadog-instrumentations/src/couchbase.js +6 -9
  25. package/packages/datadog-instrumentations/src/cucumber.js +108 -68
  26. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  27. package/packages/datadog-instrumentations/src/dns.js +5 -5
  28. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  29. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  30. package/packages/datadog-instrumentations/src/fs.js +1 -1
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
  32. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  33. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  34. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  35. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  36. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  37. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  38. package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
  39. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  40. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  41. package/packages/datadog-instrumentations/src/helpers/register.js +11 -12
  42. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  43. package/packages/datadog-instrumentations/src/jest.js +201 -143
  44. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  45. package/packages/datadog-instrumentations/src/knex.js +4 -4
  46. package/packages/datadog-instrumentations/src/koa.js +2 -3
  47. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +49 -65
  49. package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
  50. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  51. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  52. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  53. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  54. package/packages/datadog-instrumentations/src/mysql.js +30 -37
  55. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  56. package/packages/datadog-instrumentations/src/net.js +1 -1
  57. package/packages/datadog-instrumentations/src/next.js +1 -0
  58. package/packages/datadog-instrumentations/src/nyc.js +3 -2
  59. package/packages/datadog-instrumentations/src/openai.js +22 -24
  60. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  61. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  62. package/packages/datadog-instrumentations/src/pg.js +3 -5
  63. package/packages/datadog-instrumentations/src/playwright.js +123 -83
  64. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  65. package/packages/datadog-instrumentations/src/redis.js +4 -4
  66. package/packages/datadog-instrumentations/src/restify.js +9 -13
  67. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  68. package/packages/datadog-instrumentations/src/router.js +30 -32
  69. package/packages/datadog-instrumentations/src/tedious.js +2 -3
  70. package/packages/datadog-instrumentations/src/vitest.js +87 -52
  71. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  72. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  73. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  74. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  75. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  76. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  77. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  78. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  79. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  80. package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
  81. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  82. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  83. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  84. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
  85. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  86. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
  87. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
  88. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  89. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  90. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
  91. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
  92. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  93. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  94. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  95. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  96. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  97. package/packages/datadog-plugin-cucumber/src/index.js +60 -4
  98. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
  99. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  100. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  101. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  102. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  103. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  104. package/packages/datadog-plugin-express/src/index.js +10 -12
  105. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  106. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  107. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  108. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  109. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +27 -10
  110. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  111. package/packages/datadog-plugin-graphql/src/index.js +10 -8
  112. package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
  113. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  114. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  115. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  116. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  117. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  118. package/packages/datadog-plugin-http/src/client.js +23 -13
  119. package/packages/datadog-plugin-http2/src/client.js +24 -25
  120. package/packages/datadog-plugin-jest/src/index.js +26 -23
  121. package/packages/datadog-plugin-jest/src/util.js +8 -8
  122. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  123. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  124. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  125. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  126. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  127. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  128. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  129. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  130. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  131. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  132. package/packages/datadog-plugin-mocha/src/index.js +39 -14
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
  134. package/packages/datadog-plugin-mysql/src/index.js +22 -9
  135. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  136. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  137. package/packages/datadog-plugin-next/src/index.js +7 -6
  138. package/packages/datadog-plugin-openai/src/services.js +6 -10
  139. package/packages/datadog-plugin-openai/src/tracing.js +12 -18
  140. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  141. package/packages/datadog-plugin-playwright/src/index.js +25 -4
  142. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  143. package/packages/datadog-plugin-redis/src/index.js +2 -4
  144. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  145. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  146. package/packages/datadog-plugin-router/src/index.js +1 -1
  147. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  148. package/packages/datadog-plugin-vitest/src/index.js +52 -35
  149. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  150. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  151. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  152. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  153. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  154. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  158. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +5 -8
  159. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  160. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  161. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  162. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  163. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  165. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  166. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  167. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +16 -24
  168. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  169. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  170. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  171. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  172. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -8
  173. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  174. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  175. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +7 -8
  176. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  177. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +7 -7
  178. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
  179. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  180. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -28
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  185. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  186. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  187. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  188. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  189. package/packages/dd-trace/src/appsec/index.js +5 -5
  190. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  191. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  192. package/packages/dd-trace/src/appsec/reporter.js +232 -41
  193. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  194. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  195. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  196. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  197. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  198. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  199. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  200. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  201. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -4
  202. package/packages/dd-trace/src/azure_metadata.js +9 -9
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
  204. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  205. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +3 -2
  206. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +3 -2
  208. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
  209. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  211. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -5
  212. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  214. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +3 -2
  215. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
  216. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
  217. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  218. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +3 -2
  219. package/packages/dd-trace/src/config-helper.js +89 -0
  220. package/packages/dd-trace/src/config.js +159 -129
  221. package/packages/dd-trace/src/config_stable.js +10 -7
  222. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  223. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  224. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  225. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  226. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +7 -7
  227. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  228. package/packages/dd-trace/src/datastreams/size.js +1 -1
  229. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +75 -69
  230. package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
  231. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
  233. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  234. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  235. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  236. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  237. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
  239. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  240. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  241. package/packages/dd-trace/src/debugger/index.js +1 -0
  242. package/packages/dd-trace/src/dogstatsd.js +7 -6
  243. package/packages/dd-trace/src/encode/0.4.js +14 -11
  244. package/packages/dd-trace/src/encode/0.5.js +4 -6
  245. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
  246. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  247. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  248. package/packages/dd-trace/src/exporter.js +7 -6
  249. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  250. package/packages/dd-trace/src/exporters/common/docker.js +4 -3
  251. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  252. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  253. package/packages/dd-trace/src/exporters/common/util.js +4 -2
  254. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  255. package/packages/dd-trace/src/flare/file.js +1 -5
  256. package/packages/dd-trace/src/format.js +1 -1
  257. package/packages/dd-trace/src/git_properties.js +1 -1
  258. package/packages/dd-trace/src/id.js +15 -9
  259. package/packages/dd-trace/src/iitm.js +10 -22
  260. package/packages/dd-trace/src/index.js +4 -3
  261. package/packages/dd-trace/src/lambda/handler.js +7 -6
  262. package/packages/dd-trace/src/lambda/index.js +2 -1
  263. package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
  264. package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
  265. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  266. package/packages/dd-trace/src/llmobs/index.js +21 -5
  267. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  268. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  269. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  270. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  271. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  272. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  273. package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
  274. package/packages/dd-trace/src/llmobs/sdk.js +4 -3
  275. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  276. package/packages/dd-trace/src/llmobs/tagger.js +129 -102
  277. package/packages/dd-trace/src/llmobs/util.js +9 -9
  278. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  279. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  280. package/packages/dd-trace/src/log/index.js +9 -8
  281. package/packages/dd-trace/src/log/log.js +1 -1
  282. package/packages/dd-trace/src/log/writer.js +3 -4
  283. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  284. package/packages/dd-trace/src/msgpack/encoder.js +31 -31
  285. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  286. package/packages/dd-trace/src/noop/span.js +4 -6
  287. package/packages/dd-trace/src/noop/tracer.js +1 -2
  288. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  289. package/packages/dd-trace/src/opentelemetry/tracer.js +7 -6
  290. package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
  291. package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
  292. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  293. package/packages/dd-trace/src/opentracing/span.js +16 -20
  294. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  295. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  296. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  297. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  298. package/packages/dd-trace/src/pkg.js +1 -1
  299. package/packages/dd-trace/src/plugin_manager.js +4 -3
  300. package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
  301. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  302. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  303. package/packages/dd-trace/src/plugins/index.js +0 -1
  304. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  305. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  306. package/packages/dd-trace/src/plugins/producer.js +2 -2
  307. package/packages/dd-trace/src/plugins/storage.js +2 -2
  308. package/packages/dd-trace/src/plugins/util/ci.js +28 -20
  309. package/packages/dd-trace/src/plugins/util/git.js +166 -12
  310. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  311. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  313. package/packages/dd-trace/src/plugins/util/stacktrace.js +9 -2
  314. package/packages/dd-trace/src/plugins/util/test.js +315 -51
  315. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  316. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  317. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -4
  318. package/packages/dd-trace/src/plugins/util/web.js +8 -8
  319. package/packages/dd-trace/src/priority_sampler.js +64 -53
  320. package/packages/dd-trace/src/profiling/config.js +51 -35
  321. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  322. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  323. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
  324. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  325. package/packages/dd-trace/src/profiling/index.js +2 -1
  326. package/packages/dd-trace/src/profiling/profiler.js +44 -6
  327. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  328. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  329. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  330. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  331. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  332. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  333. package/packages/dd-trace/src/profiling/tagger.js +21 -13
  334. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  335. package/packages/dd-trace/src/proxy.js +9 -10
  336. package/packages/dd-trace/src/random_sampler.js +40 -0
  337. package/packages/dd-trace/src/rate_limiter.js +4 -4
  338. package/packages/dd-trace/src/remote_config/index.js +3 -7
  339. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  340. package/packages/dd-trace/src/require-package-json.js +1 -1
  341. package/packages/dd-trace/src/ritm.js +8 -8
  342. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
  343. package/packages/dd-trace/src/sampler.js +41 -4
  344. package/packages/dd-trace/src/sampling_rule.js +12 -3
  345. package/packages/dd-trace/src/scope.js +1 -1
  346. package/packages/dd-trace/src/serverless.js +11 -4
  347. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  348. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  349. package/packages/dd-trace/src/span_processor.js +5 -4
  350. package/packages/dd-trace/src/span_sampler.js +4 -1
  351. package/packages/dd-trace/src/standalone/tracesource.js +2 -3
  352. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  353. package/packages/dd-trace/src/startup-log.js +6 -18
  354. package/packages/dd-trace/src/supported-configurations.json +439 -0
  355. package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
  356. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  357. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  358. package/packages/dd-trace/src/telemetry/send-data.js +8 -7
  359. package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
  360. package/packages/dd-trace/src/tracer.js +3 -7
  361. package/packages/dd-trace/src/util.js +1 -6
  362. package/version.js +1 -0
  363. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  364. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  365. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  366. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
  367. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
  368. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -2,8 +2,7 @@
2
2
 
3
3
  const {
4
4
  channel,
5
- addHook,
6
- AsyncResource
5
+ addHook
7
6
  } = require('./helpers/instrument')
8
7
  const kebabCase = require('../../datadog-core/src/utils/src/kebabcase')
9
8
  const shimmer = require('../../datadog-shimmer')
@@ -11,18 +10,23 @@ const shimmer = require('../../datadog-shimmer')
11
10
  const { NODE_MAJOR, NODE_MINOR } = require('../../../version')
12
11
  const MIN_VERSION = ((NODE_MAJOR > 22) || (NODE_MAJOR === 22 && NODE_MINOR >= 2)) ? '>=0.5.3' : '>=0.5.0'
13
12
 
14
- const startCh = channel('apm:amqplib:command:start')
15
- const finishCh = channel('apm:amqplib:command:finish')
16
- const errorCh = channel('apm:amqplib:command:error')
13
+ const commandStartCh = channel('apm:amqplib:command:start')
14
+ const commandFinishCh = channel('apm:amqplib:command:finish')
15
+ const commandErrorCh = channel('apm:amqplib:command:error')
16
+
17
+ const consumeStartCh = channel('apm:amqplib:consume:start')
18
+ const consumeFinishCh = channel('apm:amqplib:consume:finish')
19
+
20
+ const publishStartCh = channel('apm:amqplib:publish:start')
21
+ const publishFinishCh = channel('apm:amqplib:publish:finish')
22
+ const publishErrorCh = channel('apm:amqplib:publish:error')
17
23
 
18
24
  const methods = {}
19
25
 
20
26
  addHook({ name: 'amqplib', file: 'lib/defs.js', versions: [MIN_VERSION] }, defs => {
21
27
  for (const [key, value] of Object.entries(defs)) {
22
28
  if (Number.isInteger(value) && isCamelCase(key)) {
23
- // TODO(BridgeAR): It should replace all `-` with `.`, so it has to be replaceAll or use a regex.
24
- // Example method that is not renamed properly: BasicGetEmpty = 3932232
25
- methods[value] = kebabCase(key).replace('-', '.')
29
+ methods[value] = kebabCase(key).replaceAll('-', '.')
26
30
  }
27
31
  }
28
32
  return defs
@@ -34,24 +38,29 @@ addHook({ name: 'amqplib', file: 'lib/channel_model.js', versions: [MIN_VERSION]
34
38
  if (message === null) {
35
39
  return message
36
40
  }
37
- startCh.publish({ method: 'basic.get', message, fields: message.fields, queue })
38
- // finish right away
39
- finishCh.publish()
41
+ const ctx = { method: 'basic.get', message, fields: message.fields, queue }
42
+ consumeStartCh.runStores(ctx, () => {
43
+ // finish right away
44
+ consumeFinishCh.publish(ctx)
45
+ })
40
46
  return message
41
47
  })
42
48
  })
43
49
  shimmer.wrap(x.Channel.prototype, 'consume', consume => function (queue, callback, options) {
44
- if (!startCh.hasSubscribers) {
50
+ if (!consumeStartCh.hasSubscribers) {
45
51
  return consume.apply(this, arguments)
46
52
  }
47
53
  arguments[1] = (message, ...args) => {
48
54
  if (message === null) {
49
55
  return callback(message, ...args)
50
56
  }
51
- startCh.publish({ method: 'basic.deliver', message, fields: message.fields, queue })
52
- const result = callback(message, ...args)
53
- finishCh.publish()
54
- return result
57
+ const ctx = { method: 'basic.deliver', message, fields: message.fields, queue }
58
+ return consumeStartCh.runStores(ctx, () => {
59
+ // finish right away
60
+ const result = callback(message, ...args)
61
+ consumeFinishCh.publish(ctx)
62
+ return result
63
+ })
55
64
  }
56
65
  return consume.apply(this, arguments)
57
66
  })
@@ -60,32 +69,36 @@ addHook({ name: 'amqplib', file: 'lib/channel_model.js', versions: [MIN_VERSION]
60
69
 
61
70
  addHook({ name: 'amqplib', file: 'lib/callback_model.js', versions: [MIN_VERSION] }, channel => {
62
71
  shimmer.wrap(channel.Channel.prototype, 'get', getMessage => function (queue, options, callback) {
63
- if (!startCh.hasSubscribers) {
72
+ if (!commandStartCh.hasSubscribers) {
64
73
  return getMessage.apply(this, arguments)
65
74
  }
66
75
  arguments[2] = (error, message, ...args) => {
67
76
  if (error !== null || message === null) {
68
77
  return callback(error, message, ...args)
69
78
  }
70
- startCh.publish({ method: 'basic.get', message, fields: message.fields, queue })
71
- const result = callback(error, message, ...args)
72
- finishCh.publish()
73
- return result
79
+ const ctx = { method: 'basic.get', message, fields: message.fields, queue }
80
+ return consumeStartCh.runStores(ctx, () => {
81
+ const result = callback(error, message, ...args)
82
+ consumeFinishCh.publish(ctx)
83
+ return result
84
+ })
74
85
  }
75
86
  return getMessage.apply(this, arguments)
76
87
  })
77
88
  shimmer.wrap(channel.Channel.prototype, 'consume', consume => function (queue, callback) {
78
- if (!startCh.hasSubscribers) {
89
+ if (!consumeStartCh.hasSubscribers) {
79
90
  return consume.apply(this, arguments)
80
91
  }
81
92
  arguments[1] = (message, ...args) => {
82
93
  if (message === null) {
83
94
  return callback(message, ...args)
84
95
  }
85
- startCh.publish({ method: 'basic.deliver', message, fields: message.fields, queue })
86
- const result = callback(message, ...args)
87
- finishCh.publish()
88
- return result
96
+ const ctx = { method: 'basic.deliver', message, fields: message.fields, queue }
97
+ return consumeStartCh.runStores(ctx, () => {
98
+ const result = callback(message, ...args)
99
+ consumeFinishCh.publish(ctx)
100
+ return result
101
+ })
89
102
  }
90
103
  return consume.apply(this, arguments)
91
104
  })
@@ -94,32 +107,36 @@ addHook({ name: 'amqplib', file: 'lib/callback_model.js', versions: [MIN_VERSION
94
107
 
95
108
  addHook({ name: 'amqplib', file: 'lib/channel.js', versions: [MIN_VERSION] }, channel => {
96
109
  shimmer.wrap(channel.Channel.prototype, 'sendImmediately', sendImmediately => function (method, fields) {
97
- return instrument(sendImmediately, this, arguments, methods[method], fields)
110
+ return instrument(
111
+ sendImmediately, this, arguments, methods[method], fields, null, commandStartCh, commandFinishCh, commandErrorCh
112
+ )
98
113
  })
99
114
 
100
115
  shimmer.wrap(channel.Channel.prototype, 'sendMessage', sendMessage => function (fields) {
101
- return instrument(sendMessage, this, arguments, 'basic.publish', fields, arguments[2])
116
+ return instrument(
117
+ sendMessage, this, arguments, 'basic.publish', fields, arguments[2],
118
+ publishStartCh, publishFinishCh, publishErrorCh
119
+ )
102
120
  })
103
121
  return channel
104
122
  })
105
123
 
106
- function instrument (send, channel, args, method, fields, message) {
124
+ function instrument (send, channel, args, method, fields, message, startCh, finishCh, errorCh) {
107
125
  if (!startCh.hasSubscribers || method === 'basic.get') {
108
126
  return send.apply(channel, args)
109
127
  }
110
128
 
111
- const asyncResource = new AsyncResource('bound-anonymous-fn')
112
- return asyncResource.runInAsyncScope(() => {
113
- startCh.publish({ channel, method, fields, message })
114
-
129
+ const ctx = { channel, method, fields, message }
130
+ return startCh.runStores(ctx, () => {
115
131
  try {
116
132
  return send.apply(channel, args)
117
133
  } catch (err) {
118
- errorCh.publish(err)
134
+ ctx.error = err
135
+ errorCh.publish(ctx)
119
136
 
120
137
  throw err
121
138
  } finally {
122
- finishCh.publish()
139
+ finishCh.publish(ctx)
123
140
  }
124
141
  })
125
142
  }
@@ -42,7 +42,7 @@ function wrapRecordExceptions (recordExceptions) {
42
42
  // this is mimicking apollo-gateways internal instrumentation
43
43
  // TODO: should we consider a mechanism to report all exceptions? since this method aggregates all exceptions
44
44
  // where as a span can only have one exception set on it at a time
45
- generalErrorCh.publish({ error: errors[errors.length - 1] })
45
+ generalErrorCh.publish({ error: errors.at(-1) })
46
46
  return recordExceptions.apply(this, args)
47
47
  }
48
48
  }
@@ -50,7 +50,7 @@ function wrapRecordExceptions (recordExceptions) {
50
50
  function wrapStartActiveSpan (startActiveSpan) {
51
51
  return function (...args) {
52
52
  const firstArg = args[0]
53
- const cb = args[args.length - 1]
53
+ const cb = args.at(-1)
54
54
  if (typeof firstArg !== 'string' || typeof cb !== 'function') return startActiveSpan.apply(this, args)
55
55
 
56
56
  const method = CHANNELS[firstArg]
@@ -54,7 +54,7 @@ function wrapDeserialize (deserialize, channelSuffix) {
54
54
 
55
55
  function wrapSmithySend (send) {
56
56
  return function (command, ...args) {
57
- const cb = args[args.length - 1]
57
+ const cb = args.at(-1)
58
58
  const innerAr = new AsyncResource('apm:aws:request:inner')
59
59
  const outerAr = new AsyncResource('apm:aws:request:outer')
60
60
  const serviceIdentifier = this.config.serviceId.toLowerCase()
@@ -34,13 +34,12 @@ addHook({ name: 'cassandra-driver', versions: ['>=3.0.0'] }, cassandra => {
34
34
  const res = batch.apply(this, arguments)
35
35
  if (typeof res === 'function' || !res) {
36
36
  return wrapCallback(finishCh, errorCh, asyncResource, res)
37
- } else {
38
- const promiseAsyncResource = new AsyncResource('bound-anonymous-fn')
39
- return res.then(
40
- promiseAsyncResource.bind(() => finish(finishCh, errorCh)),
41
- promiseAsyncResource.bind(err => finish(finishCh, errorCh, err))
42
- )
43
37
  }
38
+ const promiseAsyncResource = new AsyncResource('bound-anonymous-fn')
39
+ return res.then(
40
+ promiseAsyncResource.bind(() => finish(finishCh, errorCh)),
41
+ promiseAsyncResource.bind(err => finish(finishCh, errorCh, err))
42
+ )
44
43
  } catch (e) {
45
44
  finish(finishCh, errorCh, e)
46
45
  throw e
@@ -73,6 +72,10 @@ addHook({ name: 'cassandra-driver', versions: ['>=4.4'] }, cassandra => {
73
72
  return cassandra
74
73
  })
75
74
 
75
+ const isValid = (args) => {
76
+ return args.length === 4 || typeof args[3] === 'function'
77
+ }
78
+
76
79
  addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, cassandra => {
77
80
  shimmer.wrap(cassandra.Client.prototype, '_innerExecute', _innerExecute =>
78
81
  function (query, params, execOptions, callback) {
@@ -81,9 +84,6 @@ addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, cassandra => {
81
84
  }
82
85
  const callbackResource = new AsyncResource('bound-anonymous-fn')
83
86
  const asyncResource = new AsyncResource('bound-anonymous-fn')
84
- const isValid = (args) => {
85
- return args.length === 4 || typeof args[3] === 'function'
86
- }
87
87
 
88
88
  if (!isValid(arguments)) {
89
89
  return _innerExecute.apply(this, arguments)
@@ -176,7 +176,7 @@ function finish (finishCh, errorCh, error) {
176
176
  if (error) {
177
177
  errorCh.publish(error)
178
178
  }
179
- finishCh.publish(undefined)
179
+ finishCh.publish()
180
180
  }
181
181
 
182
182
  function wrapCallback (finishCh, errorCh, asyncResource, callback) {
@@ -233,8 +233,7 @@ function wrapChildProcessAsyncMethod (ChildProcess, shell = false) {
233
233
  childProcessChannel.error.publish(e)
234
234
  })
235
235
 
236
- childProcess.on('close', (code) => {
237
- code = code || 0
236
+ childProcess.on('close', (code = 0) => {
238
237
  if (!errorExecuted && code !== 0) {
239
238
  childProcessChannel.error.publish()
240
239
  }
@@ -2,8 +2,7 @@
2
2
 
3
3
  const {
4
4
  addHook,
5
- channel,
6
- AsyncResource
5
+ channel
7
6
  } = require('./helpers/instrument')
8
7
  const shimmer = require('../../datadog-shimmer')
9
8
 
@@ -32,7 +31,6 @@ const disabledHeaderWeakSet = new WeakSet()
32
31
  // we need to store the offset per partition per topic for the consumer to track offsets for DSM
33
32
  const latestConsumerOffsets = new Map()
34
33
 
35
- // Customize the instrumentation for Confluent Kafka JavaScript
36
34
  addHook({ name: '@confluentinc/kafka-javascript', versions: ['>=1.0.0'] }, (module) => {
37
35
  // Hook native module classes first
38
36
  instrumentBaseModule(module)
@@ -55,30 +53,32 @@ function instrumentBaseModule (module) {
55
53
  // Hook the produce method
56
54
  if (typeof producer?.produce === 'function') {
57
55
  shimmer.wrap(producer, 'produce', function wrapProduce (produce) {
58
- return function wrappedProduce (topic, partition, message, key, timestamp, opaque) {
56
+ return function wrappedProduce (topic, partition, message, key, timestamp, opaque, headers) {
59
57
  if (!channels.producerStart.hasSubscribers) {
60
58
  return produce.apply(this, arguments)
61
59
  }
62
60
 
63
61
  const brokers = this.globalConfig?.['bootstrap.servers']
64
62
 
65
- const asyncResource = new AsyncResource('bound-anonymous-fn')
66
- return asyncResource.runInAsyncScope(() => {
67
- try {
68
- channels.producerStart.publish({
69
- topic,
70
- messages: [{ key, value: message }],
71
- bootstrapServers: brokers
72
- })
63
+ const ctx = {
64
+ topic,
65
+ messages: [{ key, value: message }],
66
+ bootstrapServers: brokers
67
+ }
73
68
 
74
- const result = produce.apply(this, arguments)
69
+ return channels.producerStart.runStores(ctx, () => {
70
+ try {
71
+ const headers = convertHeaders(ctx.messages[0].headers)
72
+ const result = produce.apply(this, [topic, partition, message, key, timestamp, opaque, headers])
75
73
 
76
- channels.producerCommit.publish(undefined)
77
- channels.producerFinish.publish(undefined)
74
+ ctx.result = result
75
+ channels.producerCommit.publish(ctx)
76
+ channels.producerFinish.publish(ctx)
78
77
  return result
79
78
  } catch (error) {
80
- channels.producerError.publish(error)
81
- channels.producerFinish.publish(undefined)
79
+ ctx.error = error
80
+ channels.producerError.publish(ctx)
81
+ channels.producerFinish.publish(ctx)
82
82
  throw error
83
83
  }
84
84
  })
@@ -110,32 +110,39 @@ function instrumentBaseModule (module) {
110
110
  callback = numMessages
111
111
  }
112
112
 
113
+ const ctx = {
114
+ groupId
115
+ }
113
116
  // Handle callback-based consumption
114
117
  if (typeof callback === 'function') {
115
118
  return consume.call(this, numMessages, function wrappedCallback (err, messages) {
116
119
  if (messages && messages.length > 0) {
117
120
  messages.forEach(message => {
118
- channels.consumerStart.publish({
119
- topic: message?.topic,
120
- partition: message?.partition,
121
- message,
122
- groupId
123
- })
121
+ ctx.topic = message?.topic
122
+ ctx.partition = message?.partition
123
+ ctx.message = message
124
+
125
+ // TODO: We should be using publish here instead of runStores but we need bindStart to be called
126
+ channels.consumerStart.runStores(ctx, () => {})
124
127
  updateLatestOffset(message?.topic, message?.partition, message?.offset, groupId)
125
128
  })
126
129
  }
127
130
 
128
131
  if (err) {
129
- channels.consumerError.publish(err)
132
+ ctx.error = err
133
+ channels.consumerError.publish(ctx)
130
134
  }
131
135
 
132
136
  try {
133
137
  const result = callback.apply(this, arguments)
134
- channels.consumerFinish.publish(undefined)
138
+ if (messages && messages.length > 0) {
139
+ channels.consumerFinish.publish(ctx)
140
+ }
135
141
  return result
136
142
  } catch (error) {
137
- channels.consumerError.publish(error)
138
- channels.consumerFinish.publish(undefined)
143
+ ctx.error = error
144
+ channels.consumerError.publish(ctx)
145
+ channels.consumerFinish.publish(ctx)
139
146
  throw error
140
147
  }
141
148
  })
@@ -204,45 +211,44 @@ function instrumentKafkaJS (kafkaJS) {
204
211
  return send.apply(this, arguments)
205
212
  }
206
213
 
207
- const asyncResource = new AsyncResource('bound-anonymous-fn')
208
- return asyncResource.runInAsyncScope(() => {
209
- try {
210
- channels.producerStart.publish({
211
- topic: payload?.topic,
212
- messages: payload?.messages || [],
213
- bootstrapServers: kafka._ddBrokers,
214
- disableHeaderInjection: disabledHeaderWeakSet.has(producer)
215
- })
214
+ const ctx = {
215
+ topic: payload?.topic,
216
+ messages: payload?.messages || [],
217
+ bootstrapServers: kafka._ddBrokers,
218
+ disableHeaderInjection: disabledHeaderWeakSet.has(producer)
219
+ }
216
220
 
221
+ return channels.producerStart.runStores(ctx, () => {
222
+ try {
217
223
  const result = send.apply(this, arguments)
218
224
 
219
- result.then(
220
- asyncResource.bind(res => {
221
- channels.producerCommit.publish(res)
222
- channels.producerFinish.publish(undefined)
223
- }),
224
- asyncResource.bind(err => {
225
- if (err) {
226
- // Fixes bug where we would inject message headers for kafka brokers
227
- // that don't support headers (version <0.11). On the error, we disable
228
- // header injection. Tnfortunately the error name / type is not more specific.
229
- // This approach is implemented by other tracers as well.
230
- if (err.name === 'KafkaJSError' && err.type === 'ERR_UNKNOWN') {
231
- disabledHeaderWeakSet.add(producer)
232
- log.error('Kafka Broker responded with UNKNOWN_SERVER_ERROR (-1). ' +
233
- 'Please look at broker logs for more information. ' +
234
- 'Tracer message header injection for Kafka is disabled.')
235
- }
236
- channels.producerError.publish(err)
225
+ result.then((res) => {
226
+ ctx.result = res
227
+ channels.producerCommit.publish(ctx)
228
+ channels.producerFinish.publish(ctx)
229
+ }, (err) => {
230
+ if (err) {
231
+ // Fixes bug where we would inject message headers for kafka brokers
232
+ // that don't support headers (version <0.11). On the error, we disable
233
+ // header injection. Tnfortunately the error name / type is not more specific.
234
+ // This approach is implemented by other tracers as well.
235
+ if (err.name === 'KafkaJSError' && err.type === 'ERR_UNKNOWN') {
236
+ disabledHeaderWeakSet.add(producer)
237
+ log.error('Kafka Broker responded with UNKNOWN_SERVER_ERROR (-1). ' +
238
+ 'Please look at broker logs for more information. ' +
239
+ 'Tracer message header injection for Kafka is disabled.')
237
240
  }
238
- channels.producerFinish.publish(undefined)
239
- })
240
- )
241
+ ctx.error = err
242
+ channels.producerError.publish(ctx)
243
+ }
244
+ channels.producerFinish.publish(ctx)
245
+ })
241
246
 
242
247
  return result
243
248
  } catch (e) {
244
- channels.producerError.publish(e)
245
- channels.producerFinish.publish(undefined)
249
+ ctx.error = e
250
+ channels.producerError.publish(ctx)
251
+ channels.producerFinish.publish(ctx)
246
252
  throw e
247
253
  }
248
254
  })
@@ -350,10 +356,11 @@ function wrapKafkaCallback (callback, { startCh, commitCh, finishCh, errorCh },
350
356
  return function wrappedKafkaCallback (payload) {
351
357
  const commitPayload = getPayload(payload)
352
358
 
353
- const asyncResource = new AsyncResource('bound-anonymous-fn')
354
- return asyncResource.runInAsyncScope(() => {
355
- startCh.publish(commitPayload)
359
+ const ctx = {
360
+ extractedArgs: commitPayload
361
+ }
356
362
 
363
+ return startCh.runStores(ctx, () => {
357
364
  updateLatestOffset(commitPayload?.topic, commitPayload?.partition, commitPayload?.offset, commitPayload?.groupId)
358
365
 
359
366
  try {
@@ -361,22 +368,24 @@ function wrapKafkaCallback (callback, { startCh, commitCh, finishCh, errorCh },
361
368
 
362
369
  if (result && typeof result.then === 'function') {
363
370
  return result
364
- .then(asyncResource.bind(res => {
365
- finishCh.publish(undefined)
371
+ .then((res) => {
372
+ ctx.result = res
373
+ finishCh.publish(ctx)
366
374
  return res
367
- }))
368
- .catch(asyncResource.bind(err => {
369
- errorCh.publish(err)
370
- finishCh.publish(undefined)
375
+ })
376
+ .catch((err) => {
377
+ ctx.error = err
378
+ errorCh.publish(ctx)
379
+ finishCh.publish(ctx)
371
380
  throw err
372
- }))
373
- } else {
374
- finishCh.publish(undefined)
375
- return result
381
+ })
376
382
  }
383
+ finishCh.publish(ctx)
384
+ return result
377
385
  } catch (error) {
378
- errorCh.publish(error)
379
- finishCh.publish(undefined)
386
+ ctx.error = error
387
+ errorCh.publish(ctx)
388
+ finishCh.publish(ctx)
380
389
  throw error
381
390
  }
382
391
  })
@@ -402,5 +411,10 @@ function updateLatestOffset (topic, partition, offset, groupId) {
402
411
  }
403
412
 
404
413
  function getLatestOffsets () {
405
- return Array.from(latestConsumerOffsets.values())
414
+ return [...latestConsumerOffsets.values()]
415
+ }
416
+
417
+ function convertHeaders (headers) {
418
+ // convert headers from object to array of objects with 1 key and value per array entry
419
+ return Object.entries(headers).map(([key, value]) => ({ [key.toString()]: value.toString() }))
406
420
  }
@@ -10,7 +10,7 @@ function publishRequestCookieAndNext (req, res, next) {
10
10
  if (cookieParserReadCh.hasSubscribers && req) {
11
11
  const abortController = new AbortController()
12
12
 
13
- const mergedCookies = Object.assign({}, req.cookies, req.signedCookies)
13
+ const mergedCookies = { ...req.cookies, ...req.signedCookies }
14
14
 
15
15
  cookieParserReadCh.publish({ req, res, abortController, cookies: mergedCookies })
16
16
 
@@ -32,7 +32,7 @@ function wrapMaybeInvoke (_maybeInvoke) {
32
32
  const callbackIndex = args.length - 1
33
33
  const callback = args[callbackIndex]
34
34
 
35
- if (callback instanceof Function) {
35
+ if (typeof callback === 'function') {
36
36
  args[callbackIndex] = AsyncResource.bind(callback)
37
37
  }
38
38
 
@@ -43,14 +43,11 @@ function wrapMaybeInvoke (_maybeInvoke) {
43
43
 
44
44
  function wrapQuery (query) {
45
45
  const wrapped = function (q, params, callback) {
46
- callback = AsyncResource.bind(arguments[arguments.length - 1])
47
-
48
- if (typeof callback === 'function') {
49
- arguments[arguments.length - 1] = callback
46
+ if (typeof arguments[arguments.length - 1] === 'function') {
47
+ arguments[arguments.length - 1] = AsyncResource.bind(arguments[arguments.length - 1])
50
48
  }
51
49
 
52
- const res = query.apply(this, arguments)
53
- return res
50
+ return query.apply(this, arguments)
54
51
  }
55
52
  return wrapped
56
53
  }
@@ -184,12 +181,12 @@ addHook({ name: 'couchbase', file: 'lib/bucket.js', versions: ['^2.6.12'] }, Buc
184
181
  startCh.publish({ resource: n1qlQuery, bucket: { name: this.name || this._name }, seedNodes: this._dd_hosts })
185
182
 
186
183
  emitter.once('rows', asyncResource.bind(() => {
187
- finishCh.publish(undefined)
184
+ finishCh.publish()
188
185
  }))
189
186
 
190
187
  emitter.once(errorMonitor, asyncResource.bind((error) => {
191
188
  errorCh.publish(error)
192
- finishCh.publish(undefined)
189
+ finishCh.publish()
193
190
  }))
194
191
 
195
192
  try {