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
@@ -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,17 +10,25 @@ 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')
17
16
 
18
- let methods = {}
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')
23
+
24
+ const methods = {}
19
25
 
20
26
  addHook({ name: 'amqplib', file: 'lib/defs.js', versions: [MIN_VERSION] }, defs => {
21
- methods = Object.keys(defs)
22
- .filter(key => Number.isInteger(defs[key]))
23
- .filter(key => isCamelCase(key))
24
- .reduce((acc, key) => Object.assign(acc, { [defs[key]]: kebabCase(key).replace('-', '.') }), {})
27
+ for (const [key, value] of Object.entries(defs)) {
28
+ if (Number.isInteger(value) && isCamelCase(key)) {
29
+ methods[value] = kebabCase(key).replaceAll('-', '.')
30
+ }
31
+ }
25
32
  return defs
26
33
  })
27
34
 
@@ -31,24 +38,29 @@ addHook({ name: 'amqplib', file: 'lib/channel_model.js', versions: [MIN_VERSION]
31
38
  if (message === null) {
32
39
  return message
33
40
  }
34
- startCh.publish({ method: 'basic.get', message, fields: message.fields, queue })
35
- // finish right away
36
- 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
+ })
37
46
  return message
38
47
  })
39
48
  })
40
49
  shimmer.wrap(x.Channel.prototype, 'consume', consume => function (queue, callback, options) {
41
- if (!startCh.hasSubscribers) {
50
+ if (!consumeStartCh.hasSubscribers) {
42
51
  return consume.apply(this, arguments)
43
52
  }
44
53
  arguments[1] = (message, ...args) => {
45
54
  if (message === null) {
46
55
  return callback(message, ...args)
47
56
  }
48
- startCh.publish({ method: 'basic.deliver', message, fields: message.fields, queue })
49
- const result = callback(message, ...args)
50
- finishCh.publish()
51
- 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
+ })
52
64
  }
53
65
  return consume.apply(this, arguments)
54
66
  })
@@ -57,32 +69,36 @@ addHook({ name: 'amqplib', file: 'lib/channel_model.js', versions: [MIN_VERSION]
57
69
 
58
70
  addHook({ name: 'amqplib', file: 'lib/callback_model.js', versions: [MIN_VERSION] }, channel => {
59
71
  shimmer.wrap(channel.Channel.prototype, 'get', getMessage => function (queue, options, callback) {
60
- if (!startCh.hasSubscribers) {
72
+ if (!commandStartCh.hasSubscribers) {
61
73
  return getMessage.apply(this, arguments)
62
74
  }
63
75
  arguments[2] = (error, message, ...args) => {
64
76
  if (error !== null || message === null) {
65
77
  return callback(error, message, ...args)
66
78
  }
67
- startCh.publish({ method: 'basic.get', message, fields: message.fields, queue })
68
- const result = callback(error, message, ...args)
69
- finishCh.publish()
70
- 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
+ })
71
85
  }
72
86
  return getMessage.apply(this, arguments)
73
87
  })
74
88
  shimmer.wrap(channel.Channel.prototype, 'consume', consume => function (queue, callback) {
75
- if (!startCh.hasSubscribers) {
89
+ if (!consumeStartCh.hasSubscribers) {
76
90
  return consume.apply(this, arguments)
77
91
  }
78
92
  arguments[1] = (message, ...args) => {
79
93
  if (message === null) {
80
94
  return callback(message, ...args)
81
95
  }
82
- startCh.publish({ method: 'basic.deliver', message, fields: message.fields, queue })
83
- const result = callback(message, ...args)
84
- finishCh.publish()
85
- 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
+ })
86
102
  }
87
103
  return consume.apply(this, arguments)
88
104
  })
@@ -91,32 +107,36 @@ addHook({ name: 'amqplib', file: 'lib/callback_model.js', versions: [MIN_VERSION
91
107
 
92
108
  addHook({ name: 'amqplib', file: 'lib/channel.js', versions: [MIN_VERSION] }, channel => {
93
109
  shimmer.wrap(channel.Channel.prototype, 'sendImmediately', sendImmediately => function (method, fields) {
94
- return instrument(sendImmediately, this, arguments, methods[method], fields)
110
+ return instrument(
111
+ sendImmediately, this, arguments, methods[method], fields, null, commandStartCh, commandFinishCh, commandErrorCh
112
+ )
95
113
  })
96
114
 
97
115
  shimmer.wrap(channel.Channel.prototype, 'sendMessage', sendMessage => function (fields) {
98
- 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
+ )
99
120
  })
100
121
  return channel
101
122
  })
102
123
 
103
- function instrument (send, channel, args, method, fields, message) {
124
+ function instrument (send, channel, args, method, fields, message, startCh, finishCh, errorCh) {
104
125
  if (!startCh.hasSubscribers || method === 'basic.get') {
105
126
  return send.apply(channel, args)
106
127
  }
107
128
 
108
- const asyncResource = new AsyncResource('bound-anonymous-fn')
109
- return asyncResource.runInAsyncScope(() => {
110
- startCh.publish({ channel, method, fields, message })
111
-
129
+ const ctx = { channel, method, fields, message }
130
+ return startCh.runStores(ctx, () => {
112
131
  try {
113
132
  return send.apply(channel, args)
114
133
  } catch (err) {
115
- errorCh.publish(err)
134
+ ctx.error = err
135
+ errorCh.publish(ctx)
116
136
 
117
137
  throw err
118
138
  } finally {
119
- finishCh.publish()
139
+ finishCh.publish(ctx)
120
140
  }
121
141
  })
122
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()
@@ -73,6 +73,10 @@ addHook({ name: 'cassandra-driver', versions: ['>=4.4'] }, cassandra => {
73
73
  return cassandra
74
74
  })
75
75
 
76
+ const isValid = (args) => {
77
+ return args.length === 4 || typeof args[3] === 'function'
78
+ }
79
+
76
80
  addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, cassandra => {
77
81
  shimmer.wrap(cassandra.Client.prototype, '_innerExecute', _innerExecute =>
78
82
  function (query, params, execOptions, callback) {
@@ -81,9 +85,6 @@ addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, cassandra => {
81
85
  }
82
86
  const callbackResource = new AsyncResource('bound-anonymous-fn')
83
87
  const asyncResource = new AsyncResource('bound-anonymous-fn')
84
- const isValid = (args) => {
85
- return args.length === 4 || typeof args[3] === 'function'
86
- }
87
88
 
88
89
  if (!isValid(arguments)) {
89
90
  return _innerExecute.apply(this, arguments)
@@ -176,7 +177,7 @@ function finish (finishCh, errorCh, error) {
176
177
  if (error) {
177
178
  errorCh.publish(error)
178
179
  }
179
- finishCh.publish(undefined)
180
+ finishCh.publish()
180
181
  }
181
182
 
182
183
  function wrapCallback (finishCh, errorCh, asyncResource, callback) {
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { errorMonitor } = require('events')
3
4
  const util = require('util')
4
5
 
5
6
  const {
@@ -227,13 +228,12 @@ function wrapChildProcessAsyncMethod (ChildProcess, shell = false) {
227
228
  if (childProcess) {
228
229
  let errorExecuted = false
229
230
 
230
- childProcess.on('error', (e) => {
231
+ childProcess.on(errorMonitor, (e) => {
231
232
  errorExecuted = true
232
233
  childProcessChannel.error.publish(e)
233
234
  })
234
235
 
235
- childProcess.on('close', (code) => {
236
- code = code || 0
236
+ childProcess.on('close', (code = 0) => {
237
237
  if (!errorExecuted && code !== 0) {
238
238
  childProcessChannel.error.publish()
239
239
  }
@@ -2,11 +2,12 @@
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
 
9
+ const log = require('../../dd-trace/src/log')
10
+
10
11
  // Create channels for Confluent Kafka JavaScript
11
12
  const channels = {
12
13
  producerStart: channel('apm:@confluentinc/kafka-javascript:produce:start'),
@@ -25,10 +26,11 @@ const channels = {
25
26
  batchConsumerCommit: channel('apm:@confluentinc/kafka-javascript:consume-batch:commit')
26
27
  }
27
28
 
29
+ const disabledHeaderWeakSet = new WeakSet()
30
+
28
31
  // we need to store the offset per partition per topic for the consumer to track offsets for DSM
29
32
  const latestConsumerOffsets = new Map()
30
33
 
31
- // Customize the instrumentation for Confluent Kafka JavaScript
32
34
  addHook({ name: '@confluentinc/kafka-javascript', versions: ['>=1.0.0'] }, (module) => {
33
35
  // Hook native module classes first
34
36
  instrumentBaseModule(module)
@@ -51,30 +53,32 @@ function instrumentBaseModule (module) {
51
53
  // Hook the produce method
52
54
  if (typeof producer?.produce === 'function') {
53
55
  shimmer.wrap(producer, 'produce', function wrapProduce (produce) {
54
- return function wrappedProduce (topic, partition, message, key, timestamp, opaque) {
56
+ return function wrappedProduce (topic, partition, message, key, timestamp, opaque, headers) {
55
57
  if (!channels.producerStart.hasSubscribers) {
56
58
  return produce.apply(this, arguments)
57
59
  }
58
60
 
59
61
  const brokers = this.globalConfig?.['bootstrap.servers']
60
62
 
61
- const asyncResource = new AsyncResource('bound-anonymous-fn')
62
- return asyncResource.runInAsyncScope(() => {
63
- try {
64
- channels.producerStart.publish({
65
- topic,
66
- messages: [{ key, value: message }],
67
- bootstrapServers: brokers
68
- })
63
+ const ctx = {
64
+ topic,
65
+ messages: [{ key, value: message }],
66
+ bootstrapServers: brokers
67
+ }
69
68
 
70
- 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])
71
73
 
72
- channels.producerCommit.publish(undefined)
73
- channels.producerFinish.publish(undefined)
74
+ ctx.result = result
75
+ channels.producerCommit.publish(ctx)
76
+ channels.producerFinish.publish(ctx)
74
77
  return result
75
78
  } catch (error) {
76
- channels.producerError.publish(error)
77
- channels.producerFinish.publish(undefined)
79
+ ctx.error = error
80
+ channels.producerError.publish(ctx)
81
+ channels.producerFinish.publish(ctx)
78
82
  throw error
79
83
  }
80
84
  })
@@ -106,32 +110,39 @@ function instrumentBaseModule (module) {
106
110
  callback = numMessages
107
111
  }
108
112
 
113
+ const ctx = {
114
+ groupId
115
+ }
109
116
  // Handle callback-based consumption
110
117
  if (typeof callback === 'function') {
111
118
  return consume.call(this, numMessages, function wrappedCallback (err, messages) {
112
119
  if (messages && messages.length > 0) {
113
120
  messages.forEach(message => {
114
- channels.consumerStart.publish({
115
- topic: message?.topic,
116
- partition: message?.partition,
117
- message,
118
- groupId
119
- })
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, () => {})
120
127
  updateLatestOffset(message?.topic, message?.partition, message?.offset, groupId)
121
128
  })
122
129
  }
123
130
 
124
131
  if (err) {
125
- channels.consumerError.publish(err)
132
+ ctx.error = err
133
+ channels.consumerError.publish(ctx)
126
134
  }
127
135
 
128
136
  try {
129
137
  const result = callback.apply(this, arguments)
130
- channels.consumerFinish.publish(undefined)
138
+ if (messages && messages.length > 0) {
139
+ channels.consumerFinish.publish(ctx)
140
+ }
131
141
  return result
132
142
  } catch (error) {
133
- channels.consumerError.publish(error)
134
- channels.consumerFinish.publish(undefined)
143
+ ctx.error = error
144
+ channels.consumerError.publish(ctx)
145
+ channels.consumerFinish.publish(ctx)
135
146
  throw error
136
147
  }
137
148
  })
@@ -200,34 +211,44 @@ function instrumentKafkaJS (kafkaJS) {
200
211
  return send.apply(this, arguments)
201
212
  }
202
213
 
203
- const asyncResource = new AsyncResource('bound-anonymous-fn')
204
- return asyncResource.runInAsyncScope(() => {
205
- try {
206
- channels.producerStart.publish({
207
- topic: payload?.topic,
208
- messages: payload?.messages || [],
209
- bootstrapServers: kafka._ddBrokers
210
- })
214
+ const ctx = {
215
+ topic: payload?.topic,
216
+ messages: payload?.messages || [],
217
+ bootstrapServers: kafka._ddBrokers,
218
+ disableHeaderInjection: disabledHeaderWeakSet.has(producer)
219
+ }
211
220
 
221
+ return channels.producerStart.runStores(ctx, () => {
222
+ try {
212
223
  const result = send.apply(this, arguments)
213
224
 
214
- result.then(
215
- asyncResource.bind(res => {
216
- channels.producerCommit.publish(res)
217
- channels.producerFinish.publish(undefined)
218
- }),
219
- asyncResource.bind(err => {
220
- if (err) {
221
- 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.')
222
240
  }
223
- channels.producerFinish.publish(undefined)
224
- })
225
- )
241
+ ctx.error = err
242
+ channels.producerError.publish(ctx)
243
+ }
244
+ channels.producerFinish.publish(ctx)
245
+ })
226
246
 
227
247
  return result
228
248
  } catch (e) {
229
- channels.producerError.publish(e)
230
- channels.producerFinish.publish(undefined)
249
+ ctx.error = e
250
+ channels.producerError.publish(ctx)
251
+ channels.producerFinish.publish(ctx)
231
252
  throw e
232
253
  }
233
254
  })
@@ -335,10 +356,11 @@ function wrapKafkaCallback (callback, { startCh, commitCh, finishCh, errorCh },
335
356
  return function wrappedKafkaCallback (payload) {
336
357
  const commitPayload = getPayload(payload)
337
358
 
338
- const asyncResource = new AsyncResource('bound-anonymous-fn')
339
- return asyncResource.runInAsyncScope(() => {
340
- startCh.publish(commitPayload)
359
+ const ctx = {
360
+ extractedArgs: commitPayload
361
+ }
341
362
 
363
+ return startCh.runStores(ctx, () => {
342
364
  updateLatestOffset(commitPayload?.topic, commitPayload?.partition, commitPayload?.offset, commitPayload?.groupId)
343
365
 
344
366
  try {
@@ -346,22 +368,25 @@ function wrapKafkaCallback (callback, { startCh, commitCh, finishCh, errorCh },
346
368
 
347
369
  if (result && typeof result.then === 'function') {
348
370
  return result
349
- .then(asyncResource.bind(res => {
350
- finishCh.publish(undefined)
371
+ .then((res) => {
372
+ ctx.result = res
373
+ finishCh.publish(ctx)
351
374
  return res
352
- }))
353
- .catch(asyncResource.bind(err => {
354
- errorCh.publish(err)
355
- finishCh.publish(undefined)
375
+ })
376
+ .catch((err) => {
377
+ ctx.error = err
378
+ errorCh.publish(ctx)
379
+ finishCh.publish(ctx)
356
380
  throw err
357
- }))
381
+ })
358
382
  } else {
359
- finishCh.publish(undefined)
383
+ finishCh.publish(ctx)
360
384
  return result
361
385
  }
362
386
  } catch (error) {
363
- errorCh.publish(error)
364
- finishCh.publish(undefined)
387
+ ctx.error = error
388
+ errorCh.publish(ctx)
389
+ finishCh.publish(ctx)
365
390
  throw error
366
391
  }
367
392
  })
@@ -387,5 +412,10 @@ function updateLatestOffset (topic, partition, offset, groupId) {
387
412
  }
388
413
 
389
414
  function getLatestOffsets () {
390
- return Array.from(latestConsumerOffsets.values())
415
+ return [...latestConsumerOffsets.values()]
416
+ }
417
+
418
+ function convertHeaders (headers) {
419
+ // convert headers from object to array of objects with 1 key and value per array entry
420
+ return Object.entries(headers).map(([key, value]) => ({ [key.toString()]: value.toString() }))
391
421
  }
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { errorMonitor } = require('events')
3
4
  const {
4
5
  channel,
5
6
  addHook,
@@ -31,7 +32,7 @@ function wrapMaybeInvoke (_maybeInvoke) {
31
32
  const callbackIndex = args.length - 1
32
33
  const callback = args[callbackIndex]
33
34
 
34
- if (callback instanceof Function) {
35
+ if (typeof callback === 'function') {
35
36
  args[callbackIndex] = AsyncResource.bind(callback)
36
37
  }
37
38
 
@@ -183,12 +184,12 @@ addHook({ name: 'couchbase', file: 'lib/bucket.js', versions: ['^2.6.12'] }, Buc
183
184
  startCh.publish({ resource: n1qlQuery, bucket: { name: this.name || this._name }, seedNodes: this._dd_hosts })
184
185
 
185
186
  emitter.once('rows', asyncResource.bind(() => {
186
- finishCh.publish(undefined)
187
+ finishCh.publish()
187
188
  }))
188
189
 
189
- emitter.once('error', asyncResource.bind((error) => {
190
+ emitter.once(errorMonitor, asyncResource.bind((error) => {
190
191
  errorCh.publish(error)
191
- finishCh.publish(undefined)
192
+ finishCh.publish()
192
193
  }))
193
194
 
194
195
  try {