dd-trace 5.53.0 → 5.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +33 -16
  3. package/initialize.mjs +3 -4
  4. package/package.json +36 -34
  5. package/packages/datadog-core/src/utils/src/get.js +1 -1
  6. package/packages/datadog-core/src/utils/src/has.js +1 -1
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  8. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  9. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  10. package/packages/datadog-core/src/utils/src/set.js +1 -1
  11. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  12. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  13. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  14. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  15. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  16. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  17. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  18. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
  19. package/packages/datadog-instrumentations/src/couchbase.js +3 -3
  20. package/packages/datadog-instrumentations/src/cucumber.js +87 -40
  21. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  22. package/packages/datadog-instrumentations/src/dns.js +1 -1
  23. package/packages/datadog-instrumentations/src/fs.js +1 -1
  24. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  25. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  26. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  27. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  28. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  29. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  30. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  31. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  32. package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
  33. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  34. package/packages/datadog-instrumentations/src/jest.js +137 -48
  35. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  36. package/packages/datadog-instrumentations/src/knex.js +4 -4
  37. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  38. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  39. package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
  40. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  41. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  43. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  44. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  45. package/packages/datadog-instrumentations/src/net.js +1 -1
  46. package/packages/datadog-instrumentations/src/next.js +1 -0
  47. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  48. package/packages/datadog-instrumentations/src/openai.js +21 -23
  49. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  50. package/packages/datadog-instrumentations/src/pg.js +1 -2
  51. package/packages/datadog-instrumentations/src/playwright.js +112 -69
  52. package/packages/datadog-instrumentations/src/redis.js +3 -3
  53. package/packages/datadog-instrumentations/src/restify.js +2 -2
  54. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  55. package/packages/datadog-instrumentations/src/router.js +22 -25
  56. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  57. package/packages/datadog-instrumentations/src/vitest.js +77 -28
  58. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  59. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  60. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  61. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  62. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  63. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  64. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  65. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  66. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  67. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  68. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  69. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  70. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  72. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  73. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  74. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  75. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  76. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  77. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  78. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  79. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  80. package/packages/datadog-plugin-cucumber/src/index.js +57 -2
  81. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  82. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  83. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  84. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  85. package/packages/datadog-plugin-express/src/index.js +10 -12
  86. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  87. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  88. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  89. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  90. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  91. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  92. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  93. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  94. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  95. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  96. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  97. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  98. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  99. package/packages/datadog-plugin-http/src/client.js +18 -7
  100. package/packages/datadog-plugin-http2/src/client.js +20 -20
  101. package/packages/datadog-plugin-jest/src/index.js +23 -21
  102. package/packages/datadog-plugin-jest/src/util.js +8 -8
  103. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  104. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  105. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  106. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  107. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  108. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  109. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  110. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  111. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  112. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  113. package/packages/datadog-plugin-mocha/src/index.js +33 -13
  114. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  115. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  116. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  117. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  118. package/packages/datadog-plugin-next/src/index.js +6 -5
  119. package/packages/datadog-plugin-openai/src/services.js +6 -10
  120. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  121. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  122. package/packages/datadog-plugin-playwright/src/index.js +22 -2
  123. package/packages/datadog-plugin-redis/src/index.js +1 -1
  124. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  125. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  126. package/packages/datadog-plugin-router/src/index.js +1 -1
  127. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  128. package/packages/datadog-plugin-vitest/src/index.js +47 -31
  129. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  130. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  131. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  132. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  133. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  134. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  135. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  136. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  137. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  138. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  139. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  140. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  141. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  142. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  143. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  144. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  145. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  146. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  147. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  148. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  149. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  150. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  151. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  152. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  153. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  154. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  157. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  158. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  162. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  163. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  166. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  167. package/packages/dd-trace/src/appsec/index.js +1 -1
  168. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  169. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  170. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  171. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  172. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  173. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  174. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  175. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  176. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  177. package/packages/dd-trace/src/azure_metadata.js +2 -7
  178. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  179. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  180. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  181. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  182. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  183. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  184. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  185. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  186. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  187. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  188. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  189. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  192. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  193. package/packages/dd-trace/src/config.js +82 -51
  194. package/packages/dd-trace/src/config_stable.js +3 -3
  195. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  196. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  197. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  198. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  199. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  200. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  201. package/packages/dd-trace/src/datastreams/size.js +1 -1
  202. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
  203. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  204. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  205. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
  206. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  209. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  210. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  211. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  212. package/packages/dd-trace/src/dogstatsd.js +5 -4
  213. package/packages/dd-trace/src/encode/0.4.js +9 -9
  214. package/packages/dd-trace/src/encode/0.5.js +1 -1
  215. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  216. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  217. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  218. package/packages/dd-trace/src/exporter.js +6 -6
  219. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  220. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  221. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  222. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  223. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  224. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  225. package/packages/dd-trace/src/flare/file.js +1 -5
  226. package/packages/dd-trace/src/format.js +1 -1
  227. package/packages/dd-trace/src/git_properties.js +1 -1
  228. package/packages/dd-trace/src/id.js +12 -6
  229. package/packages/dd-trace/src/iitm.js +10 -22
  230. package/packages/dd-trace/src/lambda/handler.js +6 -6
  231. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  232. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  233. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  234. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  235. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  236. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  237. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  238. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  239. package/packages/dd-trace/src/llmobs/tagger.js +110 -96
  240. package/packages/dd-trace/src/llmobs/util.js +9 -9
  241. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  242. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  243. package/packages/dd-trace/src/log/index.js +4 -4
  244. package/packages/dd-trace/src/log/log.js +1 -1
  245. package/packages/dd-trace/src/log/writer.js +2 -2
  246. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  247. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  248. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  249. package/packages/dd-trace/src/noop/span.js +3 -5
  250. package/packages/dd-trace/src/noop/tracer.js +1 -2
  251. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  252. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  253. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  254. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  255. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  256. package/packages/dd-trace/src/opentracing/span.js +9 -14
  257. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  258. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  259. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  260. package/packages/dd-trace/src/pkg.js +1 -1
  261. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  262. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  263. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  264. package/packages/dd-trace/src/plugins/index.js +0 -1
  265. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  266. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  267. package/packages/dd-trace/src/plugins/producer.js +2 -2
  268. package/packages/dd-trace/src/plugins/storage.js +2 -2
  269. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  270. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  271. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  272. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  273. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  274. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  275. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  276. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  277. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  278. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  279. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  280. package/packages/dd-trace/src/priority_sampler.js +22 -22
  281. package/packages/dd-trace/src/profiling/config.js +44 -8
  282. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  283. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  284. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  285. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  286. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  287. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  288. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  289. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  290. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  291. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  292. package/packages/dd-trace/src/proxy.js +7 -9
  293. package/packages/dd-trace/src/random_sampler.js +40 -0
  294. package/packages/dd-trace/src/rate_limiter.js +4 -4
  295. package/packages/dd-trace/src/remote_config/index.js +3 -7
  296. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  297. package/packages/dd-trace/src/require-package-json.js +1 -1
  298. package/packages/dd-trace/src/ritm.js +4 -4
  299. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  300. package/packages/dd-trace/src/sampler.js +33 -4
  301. package/packages/dd-trace/src/sampling_rule.js +12 -3
  302. package/packages/dd-trace/src/scope.js +1 -1
  303. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  304. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  305. package/packages/dd-trace/src/span_processor.js +3 -3
  306. package/packages/dd-trace/src/span_sampler.js +4 -1
  307. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  308. package/packages/dd-trace/src/startup-log.js +2 -2
  309. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  310. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  311. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  312. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  313. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  314. package/packages/dd-trace/src/util.js +1 -1
  315. package/version.js +1 -0
  316. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  317. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  318. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  319. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -59,13 +59,17 @@ class RemoteConfigManager extends EventEmitter {
59
59
  targets_version: 0,
60
60
  // Use getter so `apply_*` can be updated async and still affect the content of `config_states`
61
61
  get config_states () {
62
- return Array.from(appliedConfigs.values()).map((conf) => ({
63
- id: conf.id,
64
- version: conf.version,
65
- product: conf.product,
66
- apply_state: conf.apply_state,
67
- apply_error: conf.apply_error
68
- }))
62
+ const configs = []
63
+ for (const conf of appliedConfigs.values()) {
64
+ configs.push({
65
+ id: conf.id,
66
+ version: conf.version,
67
+ product: conf.product,
68
+ apply_state: conf.apply_state,
69
+ apply_error: conf.apply_error
70
+ })
71
+ }
72
+ return configs
69
73
  },
70
74
  has_error: false,
71
75
  error: '',
@@ -125,7 +129,7 @@ class RemoteConfigManager extends EventEmitter {
125
129
  }
126
130
 
127
131
  updateProducts () {
128
- this.state.client.products = Array.from(this._handlers.keys())
132
+ this.state.client.products = [...this._handlers.keys()]
129
133
  }
130
134
 
131
135
  getPayload () {
@@ -246,11 +250,19 @@ class RemoteConfigManager extends EventEmitter {
246
250
  this.dispatch(toApply, 'apply')
247
251
  this.dispatch(toModify, 'modify')
248
252
 
249
- this.state.cached_target_files = Array.from(this.appliedConfigs.values()).map((conf) => ({
250
- path: conf.path,
251
- length: conf.length,
252
- hashes: Object.entries(conf.hashes).map((entry) => ({ algorithm: entry[0], hash: entry[1] }))
253
- }))
253
+ this.state.cached_target_files = []
254
+
255
+ for (const conf of this.appliedConfigs.values()) {
256
+ const hashes = []
257
+ for (const hash of Object.entries(conf.hashes)) {
258
+ hashes.push({ algorithm: hash[0], hash: hash[1] })
259
+ }
260
+ this.state.cached_target_files.push({
261
+ path: conf.path,
262
+ length: conf.length,
263
+ hashes
264
+ })
265
+ }
254
266
  }
255
267
  }
256
268
 
@@ -23,7 +23,7 @@ function requirePackageJson (name, module) {
23
23
  const candidate = path.join(modulePath, name, 'package.json')
24
24
  try {
25
25
  return JSON.parse(fs.readFileSync(candidate, 'utf8'))
26
- } catch (e) {
26
+ } catch {
27
27
  continue
28
28
  }
29
29
  }
@@ -60,11 +60,11 @@ function Hook (modules, options, onrequire) {
60
60
  let filename
61
61
  try {
62
62
  filename = Module._resolveFilename(request, this)
63
- } catch (resolveErr) {
63
+ } catch {
64
64
  return _origRequire.apply(this, arguments)
65
65
  }
66
66
 
67
- const core = filename.indexOf(path.sep) === -1
67
+ const core = !filename.includes(path.sep)
68
68
  let name, basedir, hooks
69
69
  // return known patched modules immediately
70
70
  if (cache[filename]) {
@@ -113,7 +113,7 @@ function Hook (modules, options, onrequire) {
113
113
  const inAWSLambda = process.env.AWS_LAMBDA_FUNCTION_NAME !== undefined
114
114
  const hasLambdaHandler = process.env.DD_LAMBDA_HANDLER !== undefined
115
115
  const segments = filename.split(path.sep)
116
- const filenameFromNodeModule = segments.lastIndexOf('node_modules') !== -1
116
+ const filenameFromNodeModule = segments.includes('node_modules')
117
117
  // decide how to assign the stat
118
118
  // first case will only happen when patching an AWS Lambda Handler
119
119
  const stat = inAWSLambda && hasLambdaHandler && !filenameFromNodeModule ? { name: filename } : parse(filename)
@@ -134,7 +134,7 @@ function Hook (modules, options, onrequire) {
134
134
  let res
135
135
  try {
136
136
  res = Module._findPath(name, [basedir, ...paths])
137
- } catch (e) {
137
+ } catch {
138
138
  // case where the file specified in package.json "main" doesn't exist
139
139
  // in this case, the file is treated as module-internal
140
140
  }
@@ -11,7 +11,7 @@ const { performance, PerformanceObserver } = require('perf_hooks')
11
11
 
12
12
  const { NODE_MAJOR, NODE_MINOR } = require('../../../../version')
13
13
  const { DD_RUNTIME_METRICS_FLUSH_INTERVAL = '10000' } = process.env
14
- const INTERVAL = parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
14
+ const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
15
15
 
16
16
  // Node >=16 has PerformanceObserver with `gc` type, but <16.7 had a critical bug.
17
17
  // See: https://github.com/nodejs/node/issues/39548
@@ -141,7 +141,7 @@ function captureCpuUsage () {
141
141
  time = process.hrtime()
142
142
  cpuUsage = process.cpuUsage()
143
143
 
144
- const elapsedMs = elapsedTime[0] * 1000 + elapsedTime[1] / 1000000
144
+ const elapsedMs = elapsedTime[0] * 1000 + elapsedTime[1] / 1_000_000
145
145
  const userPercent = 100 * elapsedUsage.user / 1000 / elapsedMs
146
146
  const systemPercent = 100 * elapsedUsage.system / 1000 / elapsedMs
147
147
  const totalPercent = userPercent + systemPercent
@@ -1,11 +1,27 @@
1
1
  'use strict'
2
2
 
3
+ // Maximum trace ID value is the maximum value for a 64-bit unsigned integer.
4
+ // Javascript cannot handle such large numbers, we will loose precision but it's fine
5
+ // as it is cast into a float64 when computing the threshold
6
+ const MAX_TRACE_ID = 2 ** 64 - 1
7
+
8
+ const UINT64_MODULO = 2n ** 64n
9
+
10
+ // Knuth's factor for the sampling algorithm
11
+ const SAMPLING_KNUTH_FACTOR = 1_111_111_111_111_111_111n
12
+
13
+ /**
14
+ * `Sampler` determines whether or not to sample a trace/span based on the trace ID.
15
+ *
16
+ * This class uses a deterministic sampling algorithm that is consistent across all languages.
17
+ */
3
18
  class Sampler {
4
19
  /**
5
- * @param rate {number}
20
+ * @param {number} rate
6
21
  */
7
22
  constructor (rate) {
8
23
  this._rate = rate
24
+ this._threshold = BigInt(Math.floor(rate * MAX_TRACE_ID))
9
25
  }
10
26
 
11
27
  /**
@@ -16,10 +32,23 @@ class Sampler {
16
32
  }
17
33
 
18
34
  /**
19
- * @returns {boolean}
35
+ * Determines whether a trace/span should be sampled based on the configured sampling rate.
36
+ *
37
+ * @param {Span|SpanContext} span - The span or span context to evaluate.
38
+ * @returns {boolean} `true` if the trace/span should be sampled, otherwise `false`.
20
39
  */
21
- isSampled () {
22
- return this._rate === 1 || Math.random() < this._rate
40
+ isSampled (span) {
41
+ if (this._rate === 1) {
42
+ return true
43
+ }
44
+
45
+ if (this._rate === 0) {
46
+ return false
47
+ }
48
+
49
+ span = typeof span.context === 'function' ? span.context() : span
50
+
51
+ return (span._traceId.toBigInt() * SAMPLING_KNUTH_FACTOR) % UINT64_MODULO <= this._threshold
23
52
  }
24
53
  }
25
54
 
@@ -69,7 +69,7 @@ function resourceLocator (span) {
69
69
  }
70
70
 
71
71
  class SamplingRule {
72
- constructor ({ name, service, resource, tags, sampleRate = 1.0, provenance = undefined, maxPerSecond } = {}) {
72
+ constructor ({ name, service, resource, tags, sampleRate = 1, provenance, maxPerSecond } = {}) {
73
73
  this.matchers = []
74
74
 
75
75
  if (name) {
@@ -112,6 +112,9 @@ class SamplingRule {
112
112
 
113
113
  match (span) {
114
114
  for (const matcher of this.matchers) {
115
+ // Rule is a special object with a .match() property.
116
+ // It has nothing to do with a regular expression.
117
+ // eslint-disable-next-line unicorn/prefer-regexp-test
115
118
  if (!matcher.match(span)) {
116
119
  return false
117
120
  }
@@ -120,8 +123,14 @@ class SamplingRule {
120
123
  return true
121
124
  }
122
125
 
123
- sample () {
124
- if (!this._sampler.isSampled()) {
126
+ /**
127
+ * Determines whether a span should be sampled based on the configured sampling rule.
128
+ *
129
+ * @param {Span|SpanContext} span - The span or span context to evaluate.
130
+ * @returns {boolean} `true` if the span should be sampled, otherwise `false`.
131
+ */
132
+ sample (span) {
133
+ if (!this._sampler.isSampled(span)) {
125
134
  return false
126
135
  }
127
136
 
@@ -52,7 +52,7 @@ class Scope {
52
52
  }
53
53
 
54
54
  _spanOrActive (span) {
55
- return span !== undefined ? span : this.active()
55
+ return span === undefined ? this.active() : span
56
56
  }
57
57
 
58
58
  _isPromise (promise) {
@@ -3,7 +3,7 @@ function identityService ({ tracerService }) {
3
3
  }
4
4
 
5
5
  function getFormattedHostString ({ host, port }) {
6
- return [host, port].filter(val => val).join(':')
6
+ return [host, port].filter(Boolean).join(':')
7
7
  }
8
8
 
9
9
  function httpPluginClientService ({ tracerService, pluginConfig, sessionDetails }) {
@@ -1,10 +1,9 @@
1
1
  const { identityService, httpPluginClientService, awsServiceV0 } = require('../util')
2
- const { DD_MAJOR } = require('../../../../../../version')
3
2
 
4
3
  const web = {
5
4
  client: {
6
5
  grpc: {
7
- opName: () => DD_MAJOR <= 2 ? 'grpc.request' : 'grpc.client',
6
+ opName: () => 'grpc.client',
8
7
  serviceName: identityService
9
8
  },
10
9
  moleculer: {
@@ -62,7 +61,7 @@ const web = {
62
61
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService
63
62
  },
64
63
  grpc: {
65
- opName: () => DD_MAJOR <= 2 ? 'grpc.request' : 'grpc.server',
64
+ opName: () => 'grpc.server',
66
65
  serviceName: identityService
67
66
  },
68
67
  moleculer: {
@@ -47,14 +47,14 @@ class SpanProcessor {
47
47
  this._gitMetadataTagger.tagGitMetadata(spanContext)
48
48
 
49
49
  for (const span of started) {
50
- if (span._duration !== undefined) {
50
+ if (span._duration === undefined) {
51
+ active.push(span)
52
+ } else {
51
53
  const formattedSpan = format(span)
52
54
  this._stats?.onSpanFinished(formattedSpan)
53
55
  formatted.push(formattedSpan)
54
56
 
55
57
  spanProcessCh.publish({ span })
56
- } else {
57
- active.push(span)
58
58
  }
59
59
  }
60
60
 
@@ -10,6 +10,9 @@ class SpanSampler {
10
10
 
11
11
  findRule (context) {
12
12
  for (const rule of this._rules) {
13
+ // Rule is a special object with a .match() property.
14
+ // It has nothing to do with a regular expression.
15
+ // eslint-disable-next-line unicorn/prefer-regexp-test
13
16
  if (rule.match(context)) {
14
17
  return rule
15
18
  }
@@ -23,7 +26,7 @@ class SpanSampler {
23
26
  const { started } = spanContext._trace
24
27
  for (const span of started) {
25
28
  const rule = this.findRule(span)
26
- if (rule && rule.sample()) {
29
+ if (rule && rule.sample(spanContext)) {
27
30
  span.context()._spanSampling = {
28
31
  sampleRate: rule.sampleRate,
29
32
  maxPerSecond: rule.maxPerSecond
@@ -5,7 +5,7 @@ const { hasOwn } = require('../util')
5
5
 
6
6
  function addTraceSourceTag (tags, product) {
7
7
  if (tags && product) {
8
- const actual = tags[TRACE_SOURCE_PROPAGATION_KEY] ? parseInt(tags[TRACE_SOURCE_PROPAGATION_KEY], 16) : 0
8
+ const actual = tags[TRACE_SOURCE_PROPAGATION_KEY] ? Number.parseInt(tags[TRACE_SOURCE_PROPAGATION_KEY], 16) : 0
9
9
  tags[TRACE_SOURCE_PROPAGATION_KEY] = ((actual | product.id) >>> 0).toString(16).padStart(2, '0')
10
10
  }
11
11
 
@@ -18,7 +18,7 @@ function getIntegrationsAndAnalytics () {
18
18
  for (const pluginName in pluginManager._pluginsByName) {
19
19
  integrations.add(pluginName)
20
20
  }
21
- extras.integrations_loaded = Array.from(integrations)
21
+ extras.integrations_loaded = [...integrations]
22
22
  return extras
23
23
  }
24
24
 
@@ -47,7 +47,7 @@ function startupLog ({ agentError } = {}) {
47
47
  if (agentError) {
48
48
  warn('DATADOG TRACER DIAGNOSTIC - Agent Error: ' + agentError.message)
49
49
  errors.agentError = {
50
- code: agentError.code ? agentError.code : '',
50
+ code: agentError.code ?? '',
51
51
  message: `Agent Error:${agentError.message}`
52
52
  }
53
53
  }
@@ -35,8 +35,8 @@ function waitAndSend (config, application, host) {
35
35
  immediate = setImmediate(() => {
36
36
  immediate = null
37
37
  if (savedDependenciesToSend.size > 0) {
38
- const dependencies = Array.from(savedDependenciesToSend.values())
39
- // if a depencdency is from the initial load, *always* send the event
38
+ const dependencies = [...savedDependenciesToSend.values()]
39
+ // if a dependency is from the initial load, *always* send the event
40
40
  // Otherwise, only send if dependencyCollection is enabled
41
41
  .filter(dep => {
42
42
  const initialLoadModule = isTrue(dep.split(' ')[2])
@@ -94,7 +94,7 @@ function onModuleLoad (data) {
94
94
  if (filename && filename.startsWith(FILE_URI_START)) {
95
95
  try {
96
96
  filename = fileURLToPath(filename)
97
- } catch (e) {
97
+ } catch {
98
98
  // cannot transform url to path
99
99
  }
100
100
  }
@@ -118,7 +118,7 @@ function onModuleLoad (data) {
118
118
 
119
119
  waitAndSend(config, application, host)
120
120
  }
121
- } catch (e) {
121
+ } catch {
122
122
  // can not read the package.json, do nothing
123
123
  }
124
124
  }
@@ -1,12 +1,12 @@
1
1
  'use strict'
2
2
 
3
3
  const log = require('../../log')
4
- const { calculateDDBasePath } = require('../../util')
4
+ const { ddBasePath } = require('../../util')
5
5
 
6
6
  const logs = new Map() // hash -> log
7
7
 
8
8
  // NOTE: Is this a reasonable number?
9
- let maxEntries = 10000
9
+ let maxEntries = 10_000
10
10
  let overflowedCount = 0
11
11
 
12
12
  function hashCode (hashSource) {
@@ -20,9 +20,9 @@ function hashCode (hashSource) {
20
20
 
21
21
  function createHash (logEntry) {
22
22
  const prime = 31
23
- let result = ((!logEntry.level) ? 0 : hashCode(logEntry.level))
24
- result = (((prime * result) | 0) + ((!logEntry.message) ? 0 : hashCode(logEntry.message))) | 0
25
- result = (((prime * result) | 0) + ((!logEntry.stack_trace) ? 0 : hashCode(logEntry.stack_trace))) | 0
23
+ let result = logEntry.level ? hashCode(logEntry.level) : 0
24
+ result = (((prime * result) | 0) + (logEntry.message ? hashCode(logEntry.message) : 0)) | 0
25
+ result = (((prime * result) | 0) + (logEntry.stack_trace ? hashCode(logEntry.stack_trace) : 0)) | 0
26
26
  return result
27
27
  }
28
28
 
@@ -30,7 +30,6 @@ function isValid (logEntry) {
30
30
  return logEntry?.level && logEntry.message
31
31
  }
32
32
 
33
- const ddBasePath = calculateDDBasePath(__dirname)
34
33
  const EOL = '\n'
35
34
  const STACK_FRAME_LINE_REGEX = /^\s*at\s/gm
36
35
 
@@ -42,7 +41,7 @@ function sanitize (logEntry) {
42
41
 
43
42
  const firstIndex = stackLines.findIndex(l => l.match(STACK_FRAME_LINE_REGEX))
44
43
 
45
- const isDDCode = firstIndex > -1 && stackLines[firstIndex].includes(ddBasePath)
44
+ const isDDCode = firstIndex !== -1 && stackLines[firstIndex].includes(ddBasePath)
46
45
  stackLines = stackLines
47
46
  .filter((line, index) => (isDDCode && index < firstIndex) || line.includes(ddBasePath))
48
47
  .map(line => line.replace(ddBasePath, ''))
@@ -78,11 +77,11 @@ const logCollector = {
78
77
  return false
79
78
  }
80
79
  const hash = createHash(logEntry)
81
- if (!logs.has(hash)) {
80
+ if (logs.has(hash)) {
81
+ logs.get(hash).count++
82
+ } else {
82
83
  logs.set(hash, logEntry)
83
84
  return true
84
- } else {
85
- logs.get(hash).count++
86
85
  }
87
86
  } catch (e) {
88
87
  log.error('Unable to add log to logCollector: %s', e.message)
@@ -19,8 +19,14 @@ function now () {
19
19
  return Date.now() / 1e3
20
20
  }
21
21
 
22
- function mapToJsonArray (map) {
23
- return Array.from(map.values()).map(v => v.toJSON())
22
+ function mapToJsonArray (map, filter) {
23
+ const array = []
24
+ for (const value of map.values()) {
25
+ if (!filter || filter(value)) {
26
+ array.push(value.toJSON())
27
+ }
28
+ }
29
+ return array
24
30
  }
25
31
 
26
32
  function hasPoints (metric) {
@@ -138,7 +144,7 @@ class RateMetric extends Metric {
138
144
 
139
145
  track (value = 1) {
140
146
  this.rate += value
141
- const rate = this.interval ? (this.rate / this.interval) : 0.0
147
+ const rate = this.interval ? (this.rate / this.interval) : 0
142
148
  this.points = [[now(), rate]]
143
149
  }
144
150
  }
@@ -169,8 +175,7 @@ class MetricsCollection extends Map {
169
175
  toJSON () {
170
176
  if (!this.size) return
171
177
 
172
- const series = mapToJsonArray(this)
173
- .filter(hasPoints)
178
+ const series = mapToJsonArray(this, hasPoints)
174
179
 
175
180
  if (!series.length) return
176
181
 
@@ -74,7 +74,7 @@ function sendData (config, application, host, reqType, payload = {}, cb = () =>
74
74
 
75
75
  const data = JSON.stringify({
76
76
  api_version: 'v2',
77
- naming_schema_version: config.spanAttributeSchema ? config.spanAttributeSchema : '',
77
+ naming_schema_version: config.spanAttributeSchema ?? '',
78
78
  request_type: reqType,
79
79
  tracer_time: Math.floor(Date.now() / 1000),
80
80
  runtime_id: config.tags['runtime-id'],
@@ -303,6 +303,25 @@ function formatMapForTelemetry (map) {
303
303
  : ''
304
304
  }
305
305
 
306
+ const nameMapping = {
307
+ sampleRate: 'DD_TRACE_SAMPLE_RATE',
308
+ logInjection: 'DD_LOG_INJECTION',
309
+ headerTags: 'DD_TRACE_HEADER_TAGS',
310
+ tags: 'DD_TAGS',
311
+ 'sampler.rules': 'DD_TRACE_SAMPLING_RULES',
312
+ traceEnabled: 'DD_TRACE_ENABLED',
313
+ url: 'DD_TRACE_AGENT_URL',
314
+ 'sampler.rateLimit': 'DD_TRACE_RATE_LIMIT',
315
+ queryStringObfuscation: 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP',
316
+ version: 'DD_VERSION',
317
+ env: 'DD_ENV',
318
+ service: 'DD_SERVICE',
319
+ clientIpHeader: 'DD_TRACE_CLIENT_IP_HEADER',
320
+ 'grpc.client.error.statuses': 'DD_GRPC_CLIENT_ERROR_STATUSES',
321
+ 'grpc.server.error.statuses': 'DD_GRPC_SERVER_ERROR_STATUSES',
322
+ traceId128BitLoggingEnabled: 'DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED'
323
+ }
324
+
306
325
  function updateConfig (changes, config) {
307
326
  if (!config.telemetry.enabled) return
308
327
  if (changes.length === 0) return
@@ -312,25 +331,6 @@ function updateConfig (changes, config) {
312
331
  const application = createAppObject(config)
313
332
  const host = createHostObject()
314
333
 
315
- const nameMapping = {
316
- sampleRate: 'DD_TRACE_SAMPLE_RATE',
317
- logInjection: 'DD_LOG_INJECTION',
318
- headerTags: 'DD_TRACE_HEADER_TAGS',
319
- tags: 'DD_TAGS',
320
- 'sampler.rules': 'DD_TRACE_SAMPLING_RULES',
321
- traceEnabled: 'DD_TRACE_ENABLED',
322
- url: 'DD_TRACE_AGENT_URL',
323
- 'sampler.rateLimit': 'DD_TRACE_RATE_LIMIT',
324
- queryStringObfuscation: 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP',
325
- version: 'DD_VERSION',
326
- env: 'DD_ENV',
327
- service: 'DD_SERVICE',
328
- clientIpHeader: 'DD_TRACE_CLIENT_IP_HEADER',
329
- 'grpc.client.error.statuses': 'DD_GRPC_CLIENT_ERROR_STATUSES',
330
- 'grpc.server.error.statuses': 'DD_GRPC_SERVER_ERROR_STATUSES',
331
- traceId128BitLoggingEnabled: 'DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED'
332
- }
333
-
334
334
  const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping'])
335
335
 
336
336
  const configuration = []
@@ -361,14 +361,14 @@ function updateConfig (changes, config) {
361
361
  return !names.includes(entry.name)
362
362
  }
363
363
 
364
- if (!configWithOrigin.length) {
365
- configWithOrigin = configuration
366
- } else {
364
+ if (configWithOrigin.length) {
367
365
  // update configWithOrigin to contain up-to-date full list of config values for app-extended-heartbeat
368
366
  configWithOrigin = configWithOrigin.filter(isNotModified)
369
- configWithOrigin = configWithOrigin.concat(configuration)
367
+ configWithOrigin = [...configWithOrigin, ...configuration]
370
368
  const { reqType, payload } = createPayload('app-client-configuration-change', { configuration })
371
369
  sendData(config, application, host, reqType, payload, updateRetryData)
370
+ } else {
371
+ configWithOrigin = configuration
372
372
  }
373
373
  }
374
374
 
@@ -382,7 +382,6 @@ function profilingEnabledToBoolean (profilingEnabled) {
382
382
  if (profilingEnabled === 'false') {
383
383
  return false
384
384
  }
385
- return undefined
386
385
  }
387
386
 
388
387
  module.exports = {
@@ -86,7 +86,7 @@ module.exports = {
86
86
  isFalse,
87
87
  isError,
88
88
  globMatch,
89
- calculateDDBasePath,
89
+ ddBasePath: calculateDDBasePath(__dirname),
90
90
  hasOwn,
91
91
  normalizeProfilingEnabledValue
92
92
  }
package/version.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  /* eslint-disable no-var */
4
+ /* eslint-disable unicorn/prefer-number-properties */
4
5
 
5
6
  var ddMatches = require('./package.json').version.match(/^(\d+)\.(\d+)\.(\d+)/)
6
7
  var nodeMatches = process.versions.node.match(/^(\d+)\.(\d+)\.(\d+)/)
@@ -1,77 +0,0 @@
1
- 'use strict'
2
-
3
- const { addHook, channel } = require('./helpers/instrument')
4
- const shimmer = require('../../datadog-shimmer')
5
-
6
- const logChannel = channel('apm:paperplane:log')
7
- const handleChannel = channel('apm:paperplane:request:handle')
8
- const routeChannel = channel('apm:paperplane:request:route')
9
-
10
- const nodeMajor = Number(process.versions.node.split('.')[0])
11
- const name = 'paperplane'
12
- const versions = nodeMajor <= 12 ? ['>=2.3.2'] : nodeMajor <= 14 ? ['>=3.1.1'] : []
13
-
14
- const wrapRoute = handler => req => {
15
- const { original, route } = req
16
-
17
- if (routeChannel.hasSubscribers) {
18
- routeChannel.publish({ req: original, route })
19
- }
20
-
21
- return handler(req)
22
- }
23
-
24
- const wrapLogger = logger => record => {
25
- const event = { message: record }
26
-
27
- logChannel.publish(event)
28
-
29
- return logger(event.message)
30
- }
31
-
32
- const wrapMount = mount => opts => {
33
- const handler = mount(opts)
34
-
35
- return function (req, res) {
36
- handleChannel.publish(req)
37
-
38
- return handler.apply(this, arguments)
39
- }
40
- }
41
-
42
- const wrapRoutes = routes => handlers => {
43
- const traced = {}
44
-
45
- for (const route in handlers) {
46
- traced[route] = wrapRoute(handlers[route])
47
- }
48
-
49
- return routes(traced)
50
- }
51
-
52
- addHook({ name, versions, file: 'lib/logger.js' }, exports => {
53
- shimmer.wrap(exports, 'logger', wrapLogger)
54
-
55
- return exports
56
- })
57
-
58
- addHook({ name, versions, file: 'lib/mount.js' }, exports => {
59
- shimmer.wrap(exports, 'mount', wrapMount)
60
-
61
- return exports
62
- })
63
-
64
- addHook({ name, versions, file: 'lib/routes.js' }, exports => {
65
- shimmer.wrap(exports, 'routes', wrapRoutes)
66
-
67
- return exports
68
- })
69
-
70
- if (nodeMajor <= 12) {
71
- addHook({ name, versions: ['2.3.0 - 2.3.1'] }, paperplane => {
72
- shimmer.wrap(paperplane, 'mount', wrapMount)
73
- shimmer.wrap(paperplane, 'routes', wrapRoutes)
74
-
75
- return paperplane
76
- })
77
- }
@@ -1,25 +0,0 @@
1
- 'use strict'
2
-
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
4
- const PaperplaneLoggerPlugin = require('./logger')
5
- const PaperplaneServerPlugin = require('./server')
6
-
7
- class PaperplanePlugin extends Plugin {
8
- static get id () {
9
- return 'paperplane'
10
- }
11
-
12
- constructor (...args) {
13
- super(...args)
14
-
15
- this.server = new PaperplaneServerPlugin(...args)
16
- this.logger = new PaperplaneLoggerPlugin(...args)
17
- }
18
-
19
- configure (config) {
20
- this.server.configure(config)
21
- this.logger.configure(config)
22
- }
23
- }
24
-
25
- module.exports = PaperplanePlugin
@@ -1,11 +0,0 @@
1
- 'use strict'
2
-
3
- const LogPlugin = require('../../dd-trace/src/plugins/log_plugin')
4
-
5
- class PaperplaneLoggerPlugin extends LogPlugin {
6
- static get id () {
7
- return 'paperplane'
8
- }
9
- }
10
-
11
- module.exports = PaperplaneLoggerPlugin