datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -4,7 +4,7 @@ if %w[1 true].include?((ENV['DD_APPSEC_ENABLED'] || '').downcase)
4
4
  begin
5
5
  require_relative 'contrib/auto_instrument'
6
6
  Datadog::AppSec::Contrib::AutoInstrument.patch_all
7
- rescue StandardError => e
7
+ rescue => e
8
8
  Kernel.warn(
9
9
  '[datadog] AppSec failed to instrument. No security check will be performed. error: ' \
10
10
  " #{e.class.name} #{e.message}"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'processor'
4
- require_relative 'processor/rule_merger'
3
+ require_relative 'security_engine/engine'
4
+ require_relative 'security_engine/runner'
5
5
  require_relative 'processor/rule_loader'
6
6
  require_relative 'actions_handler'
7
7
 
@@ -12,9 +12,28 @@ module Datadog
12
12
  class << self
13
13
  def build_appsec_component(settings, telemetry:)
14
14
  return if !settings.respond_to?(:appsec) || !settings.appsec.enabled
15
- return if incompatible_ffi_version?
16
15
 
17
- processor = create_processor(settings, telemetry)
16
+ ffi_version = Gem.loaded_specs['ffi']&.version
17
+ unless ffi_version
18
+ Datadog.logger.warn('FFI gem is not loaded, AppSec will be disabled.')
19
+ telemetry.error('AppSec: Component not loaded, due to missing FFI gem')
20
+
21
+ return
22
+ end
23
+
24
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.3') && ffi_version < Gem::Version.new('1.16.0')
25
+ Datadog.logger.warn(
26
+ 'AppSec is not supported in Ruby versions above 3.3.0 when using `ffi` versions older than 1.16.0, ' \
27
+ 'and will be forcibly disabled due to a memory leak in `ffi`. ' \
28
+ 'Please upgrade your `ffi` version to 1.16.0 or higher.'
29
+ )
30
+ telemetry.error('AppSec: Component not loaded, ffi version is leaky with ruby > 3.3.0')
31
+
32
+ return
33
+ end
34
+
35
+ require_libddwaf(telemetry: telemetry)
36
+ Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.appsec.waf_debug
18
37
 
19
38
  # We want to always instrument user events when AppSec is enabled.
20
39
  # There could be cases in which users use the DD_APPSEC_ENABLED Env variable to
@@ -24,76 +43,44 @@ module Datadog
24
43
  devise_integration = Datadog::AppSec::Contrib::Devise::Integration.new
25
44
  settings.appsec.instrument(:devise) unless devise_integration.patcher.patched?
26
45
 
27
- new(processor, telemetry)
28
- end
29
-
30
- private
31
-
32
- def incompatible_ffi_version?
33
- ffi_version = Gem.loaded_specs['ffi'] && Gem.loaded_specs['ffi'].version
34
- return true unless ffi_version
46
+ security_engine = SecurityEngine::Engine.new(appsec_settings: settings.appsec, telemetry: telemetry)
47
+ new(security_engine: security_engine, telemetry: telemetry)
48
+ rescue
49
+ Datadog.logger.warn('AppSec is disabled, see logged errors above')
35
50
 
36
- return false unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.3') &&
37
- ffi_version < Gem::Version.new('1.16.0')
38
-
39
- Datadog.logger.warn(
40
- 'AppSec is not supported in Ruby versions above 3.3.0 when using `ffi` versions older than 1.16.0, ' \
41
- 'and will be forcibly disabled due to a memory leak in `ffi`. ' \
42
- 'Please upgrade your `ffi` version to 1.16.0 or higher.'
43
- )
44
-
45
- true
51
+ nil
46
52
  end
47
53
 
48
- def create_processor(settings, telemetry)
49
- rules = AppSec::Processor::RuleLoader.load_rules(
50
- telemetry: telemetry,
51
- ruleset: settings.appsec.ruleset
52
- )
53
- return nil unless rules
54
-
55
- data = AppSec::Processor::RuleLoader.load_data(
56
- ip_denylist: settings.appsec.ip_denylist,
57
- user_id_denylist: settings.appsec.user_id_denylist,
58
- )
54
+ private
59
55
 
60
- exclusions = AppSec::Processor::RuleLoader.load_exclusions(ip_passlist: settings.appsec.ip_passlist)
56
+ def require_libddwaf(telemetry:)
57
+ require('libddwaf')
58
+ rescue LoadError => e
59
+ libddwaf_platform = Gem.loaded_specs['libddwaf']&.platform || 'unknown'
60
+ ruby_platforms = Gem.platforms.map(&:to_s)
61
61
 
62
- ruleset = AppSec::Processor::RuleMerger.merge(
63
- rules: [rules],
64
- data: data,
65
- exclusions: exclusions,
66
- telemetry: telemetry
67
- )
62
+ error_message = "libddwaf failed to load - installed platform: #{libddwaf_platform}, " \
63
+ "ruby platforms: #{ruby_platforms}"
68
64
 
69
- processor = Processor.new(ruleset: ruleset, telemetry: telemetry)
70
- return nil unless processor.ready?
65
+ Datadog.logger.error("#{error_message}, error #{e.inspect}")
66
+ telemetry.report(e, description: error_message)
71
67
 
72
- processor
68
+ raise e
73
69
  end
74
70
  end
75
71
 
76
- attr_reader :processor, :telemetry
72
+ attr_reader :security_engine, :telemetry
77
73
 
78
- def initialize(processor, telemetry)
79
- @processor = processor
74
+ def initialize(security_engine:, telemetry:)
75
+ @security_engine = security_engine
80
76
  @telemetry = telemetry
81
77
 
82
78
  @mutex = Mutex.new
83
79
  end
84
80
 
85
- def reconfigure(ruleset:, telemetry:)
81
+ def reconfigure!
86
82
  @mutex.synchronize do
87
- new_processor = Processor.new(ruleset: ruleset, telemetry: telemetry)
88
-
89
- if new_processor && new_processor.ready?
90
- old_processor = @processor
91
-
92
- @telemetry = telemetry
93
- @processor = new_processor
94
-
95
- old_processor.finalize if old_processor
96
- end
83
+ security_engine.reconfigure!
97
84
  end
98
85
  end
99
86
 
@@ -103,10 +90,8 @@ module Datadog
103
90
 
104
91
  def shutdown!
105
92
  @mutex.synchronize do
106
- if processor && processor.ready?
107
- processor.finalize
108
- @processor = nil
109
- end
93
+ security_engine.finalize!
94
+ @security_engine = nil
110
95
  end
111
96
  end
112
97
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'zlib'
5
+ require 'stringio'
6
+
7
+ require_relative '../core/utils/base64'
8
+
9
+ module Datadog
10
+ module AppSec
11
+ # Converts derivative schema payloads into JSON and compresses them into a
12
+ # base64 encoded string if the payload is worth compressing.
13
+ #
14
+ # See: https://github.com/DataDog/dd-trace-rb/pull/3177#issuecomment-1747221082
15
+ module CompressedJson
16
+ MIN_SIZE_FOR_COMPRESSION = 260
17
+
18
+ def self.dump(payload)
19
+ value = JSON.dump(payload)
20
+ return value if value.bytesize < MIN_SIZE_FOR_COMPRESSION
21
+
22
+ compress_and_encode(value)
23
+ rescue ArgumentError, Encoding::UndefinedConversionError, JSON::JSONError => e
24
+ AppSec.telemetry.report(e, description: 'AppSec: Failed to convert value into JSON')
25
+
26
+ nil
27
+ end
28
+
29
+ private_class_method def self.compress_and_encode(payload)
30
+ Core::Utils::Base64.strict_encode64(
31
+ Zlib.gzip(payload, level: Zlib::BEST_SPEED, strategy: Zlib::DEFAULT_STRATEGY)
32
+ )
33
+ rescue Zlib::Error, TypeError => e
34
+ AppSec.telemetry.report(e, description: 'AppSec: Failed to compress and encode value')
35
+
36
+ nil
37
+ end
38
+ end
39
+ end
40
+ end
@@ -80,16 +80,49 @@ module Datadog
80
80
 
81
81
  option :ip_passlist do |o|
82
82
  o.default []
83
+
84
+ o.setter do |value|
85
+ next value if value.nil? || value.empty?
86
+
87
+ Datadog::Core.log_deprecation(disallowed_next_major: false) do
88
+ 'The ip_passlist setting is deprecated and will be removed in the next release. ' \
89
+ 'Please migrate this configuration to your service settings via the Datadog UI'
90
+ end
91
+
92
+ value
93
+ end
83
94
  end
84
95
 
85
96
  option :ip_denylist do |o|
86
97
  o.type :array
87
98
  o.default []
99
+
100
+ o.setter do |value|
101
+ next value if value.nil? || value.empty?
102
+
103
+ Datadog::Core.log_deprecation(disallowed_next_major: false) do
104
+ 'The ip_denylist setting is deprecated and will be removed in the next release. ' \
105
+ 'Please migrate this configuration to your service settings via the Datadog UI'
106
+ end
107
+
108
+ value
109
+ end
88
110
  end
89
111
 
90
112
  option :user_id_denylist do |o|
91
113
  o.type :array
92
114
  o.default []
115
+
116
+ o.setter do |value|
117
+ next value if value.nil? || value.empty?
118
+
119
+ Datadog::Core.log_deprecation(disallowed_next_major: false) do
120
+ 'The user_id_denylist setting is deprecated and will be removed in the next release. ' \
121
+ 'Please migrate this configuration to your service settings via the Datadog UI'
122
+ end
123
+
124
+ value
125
+ end
93
126
  end
94
127
 
95
128
  option :waf_timeout do |o|
@@ -131,9 +164,12 @@ module Datadog
131
164
  o.type :string, nilable: true
132
165
  o.setter do |value|
133
166
  if value
134
- raise(ArgumentError, "appsec.templates.html: file not found: #{value}") unless File.exist?(value)
167
+ unless File.exist?(value)
168
+ raise(ArgumentError,
169
+ "appsec.templates.html: file not found: #{value}")
170
+ end
135
171
 
136
- File.open(value, 'rb', &:read) || ''
172
+ File.binread(value) || ''
137
173
  end
138
174
  end
139
175
  end
@@ -143,9 +179,12 @@ module Datadog
143
179
  o.type :string, nilable: true
144
180
  o.setter do |value|
145
181
  if value
146
- raise(ArgumentError, "appsec.templates.json: file not found: #{value}") unless File.exist?(value)
182
+ unless File.exist?(value)
183
+ raise(ArgumentError,
184
+ "appsec.templates.json: file not found: #{value}")
185
+ end
147
186
 
148
- File.open(value, 'rb', &:read) || ''
187
+ File.binread(value) || ''
149
188
  end
150
189
  end
151
190
  end
@@ -155,15 +194,78 @@ module Datadog
155
194
  o.type :string, nilable: true
156
195
  o.setter do |value|
157
196
  if value
158
- raise(ArgumentError, "appsec.templates.text: file not found: #{value}") unless File.exist?(value)
197
+ unless File.exist?(value)
198
+ raise(ArgumentError,
199
+ "appsec.templates.text: file not found: #{value}")
200
+ end
159
201
 
160
- File.open(value, 'rb', &:read) || ''
202
+ File.binread(value) || ''
161
203
  end
162
204
  end
163
205
  end
164
206
  end
165
207
  end
166
208
 
209
+ settings :stack_trace do
210
+ option :enabled do |o|
211
+ o.type :bool
212
+ o.env 'DD_APPSEC_STACK_TRACE_ENABLED'
213
+ o.default true
214
+ end
215
+
216
+ # The maximum number of stack trace frames to collect for each stack trace.
217
+ #
218
+ # If the stack trace exceeds this limit, the frames are dropped from the middle of the stack trace:
219
+ # 75% of the frames are kept from the top of the stack trace and 25% from the bottom
220
+ # (this percentage is also configurable).
221
+ #
222
+ # Minimum value is 10.
223
+ # Set to zero if you don't want any frames to be dropped.
224
+ #
225
+ # Default value is 32
226
+ option :max_depth do |o|
227
+ o.type :int
228
+ o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH'
229
+ o.default 32
230
+
231
+ o.setter do |value|
232
+ value = 0 if value < 0
233
+ value
234
+ end
235
+ end
236
+
237
+ # The percentage of frames to keep from the top of the stack trace.
238
+ #
239
+ # Default value is 75
240
+ option :top_percentage do |o|
241
+ o.type :int
242
+ o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH_TOP_PERCENT'
243
+ o.default 75
244
+
245
+ o.setter do |value|
246
+ value = 100 if value > 100
247
+ value = 0 if value.negative?
248
+ value
249
+ end
250
+ end
251
+
252
+ # Maximum number of stack traces to collect per span.
253
+ #
254
+ # Set to zero if you want to collect all stack traces.
255
+ #
256
+ # Default value is 2
257
+ option :max_stack_traces do |o|
258
+ o.type :int
259
+ o.env 'DD_APPSEC_MAX_STACK_TRACES'
260
+ o.default 2
261
+
262
+ o.setter do |value|
263
+ value = 0 if value < 0
264
+ value
265
+ end
266
+ end
267
+ end
268
+
167
269
  settings :auto_user_instrumentation do
168
270
  define_method(:enabled?) { get_option(:mode) != DISABLED_AUTO_USER_INSTRUMENTATION_MODE }
169
271
 
@@ -177,11 +279,11 @@ module Datadog
177
279
 
178
280
  Datadog.logger.warn(
179
281
  'The appsec.auto_user_instrumentation.mode value provided is not supported. ' \
180
- "Supported values are: #{AUTO_USER_INSTRUMENTATION_MODES.join(' | ')}. " \
181
- "Using default value: #{IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE}."
282
+ "Supported values are: #{AUTO_USER_INSTRUMENTATION_MODES.join(" | ")}. " \
283
+ "Using value: #{DISABLED_AUTO_USER_INSTRUMENTATION_MODE}."
182
284
  )
183
285
 
184
- IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
286
+ DISABLED_AUTO_USER_INSTRUMENTATION_MODE
185
287
  end
186
288
  end
187
289
  end
@@ -199,11 +301,13 @@ module Datadog
199
301
  APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES.include?(env_value.strip.downcase)
200
302
  end
201
303
  end
202
- o.after_set do
203
- Core.log_deprecation(key: :appsec_track_user_events_enabled) do
204
- 'The appsec.track_user_events.enabled setting has been deprecated for removal. ' \
205
- 'Please remove it from your Datadog.configure block and use ' \
206
- 'appsec.auto_user_instrumentation.mode instead.'
304
+ o.after_set do |_, _, precedence|
305
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
306
+ Core.log_deprecation(key: :appsec_track_user_events_enabled) do
307
+ 'The appsec.track_user_events.enabled setting is deprecated. ' \
308
+ 'Please remove it from your Datadog.configure block and use ' \
309
+ 'appsec.auto_user_instrumentation.mode instead.'
310
+ end
207
311
  end
208
312
  end
209
313
  end
@@ -220,30 +324,48 @@ module Datadog
220
324
  else
221
325
  Datadog.logger.warn(
222
326
  'The appsec.track_user_events.mode value provided is not supported.' \
223
- "Supported values are: #{APPSEC_VALID_TRACK_USER_EVENTS_MODE.join(' | ')}." \
327
+ "Supported values are: #{APPSEC_VALID_TRACK_USER_EVENTS_MODE.join(" | ")}." \
224
328
  "Using default value: #{SAFE_TRACK_USER_EVENTS_MODE}."
225
329
  )
226
330
 
227
331
  SAFE_TRACK_USER_EVENTS_MODE
228
332
  end
229
333
  end
230
- o.after_set do
231
- Core.log_deprecation(key: :appsec_track_user_events_mode) do
232
- 'The appsec.track_user_events.mode setting has been deprecated for removal. ' \
233
- 'Please remove it from your Datadog.configure block and use ' \
234
- 'appsec.auto_user_instrumentation.mode instead.'
334
+ o.after_set do |_, _, precedence|
335
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
336
+ Core.log_deprecation(key: :appsec_track_user_events_mode) do
337
+ 'The appsec.track_user_events.mode setting is deprecated. ' \
338
+ 'Please remove it from your Datadog.configure block and use ' \
339
+ 'appsec.auto_user_instrumentation.mode instead.'
340
+ end
235
341
  end
236
342
  end
237
343
  end
238
344
  end
239
345
 
240
346
  settings :api_security do
347
+ define_method(:enabled?) { get_option(:enabled) }
348
+
241
349
  option :enabled do |o|
242
350
  o.type :bool
243
- o.env 'DD_EXPERIMENTAL_API_SECURITY_ENABLED'
244
- o.default false
351
+ o.env 'DD_API_SECURITY_ENABLED'
352
+ o.default true
245
353
  end
246
354
 
355
+ # NOTE: Unfortunately, we have to go with Float due to other libs
356
+ # setup, even tho we don't plan to support sub-second delays.
357
+ #
358
+ # WARNING: The value will be converted to Integer.
359
+ option :sample_delay do |o|
360
+ o.type :float
361
+ o.env 'DD_API_SECURITY_SAMPLE_DELAY'
362
+ o.default 30
363
+ o.setter do |value|
364
+ value.to_i
365
+ end
366
+ end
367
+
368
+ # DEV-3.0: Remove `api_security.sample_rate` option
247
369
  option :sample_rate do |o|
248
370
  o.type :float
249
371
  o.env 'DD_API_SECURITY_REQUEST_SAMPLE_RATE'
@@ -252,6 +374,15 @@ module Datadog
252
374
  value = 1 if value > 1
253
375
  SampleRate.new(value)
254
376
  end
377
+ o.after_set do |_, _, precedence|
378
+ next if precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
379
+
380
+ Core.log_deprecation(key: :appsec_api_security_sample_rate) do
381
+ 'The appsec.api_security.sample_rate setting is deprecated. ' \
382
+ 'Please remove it from your Datadog.configure block and use ' \
383
+ 'appsec.api_security.sample_delay instead.'
384
+ end
385
+ end
255
386
  end
256
387
  end
257
388
 
@@ -259,14 +390,6 @@ module Datadog
259
390
  o.type :bool, nilable: true
260
391
  o.env 'DD_APPSEC_SCA_ENABLED'
261
392
  end
262
-
263
- settings :standalone do
264
- option :enabled do |o|
265
- o.type :bool
266
- o.env 'DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED'
267
- o.default false
268
- end
269
- end
270
393
  end
271
394
  end
272
395
  end
@@ -9,6 +9,7 @@ module Datadog
9
9
  class Context
10
10
  ActiveContextError = Class.new(StandardError)
11
11
 
12
+ # TODO: add delegators for active trace span
12
13
  attr_reader :trace, :span, :events
13
14
 
14
15
  class << self
@@ -20,7 +21,7 @@ module Datadog
20
21
  end
21
22
 
22
23
  def deactivate
23
- active&.finalize
24
+ active&.finalize!
24
25
  ensure
25
26
  Thread.current[Ext::ACTIVE_CONTEXT_KEY] = nil
26
27
  end
@@ -30,12 +31,11 @@ module Datadog
30
31
  end
31
32
  end
32
33
 
33
- def initialize(trace, span, security_engine)
34
+ def initialize(trace, span, waf_runner)
34
35
  @trace = trace
35
36
  @span = span
36
37
  @events = []
37
- @security_engine = security_engine
38
- @waf_runner = security_engine.new_runner
38
+ @waf_runner = waf_runner
39
39
  @metrics = Metrics::Collector.new
40
40
  end
41
41
 
@@ -56,7 +56,7 @@ module Datadog
56
56
  end
57
57
 
58
58
  def extract_schema
59
- @waf_runner.run({ 'waf.context.processor' => { 'extract-schema' => true } }, {})
59
+ @waf_runner.run({'waf.context.processor' => {'extract-schema' => true}}, {})
60
60
  end
61
61
 
62
62
  def export_metrics
@@ -66,8 +66,8 @@ module Datadog
66
66
  Metrics::Exporter.export_rasp_metrics(@metrics.rasp, @span)
67
67
  end
68
68
 
69
- def finalize
70
- @waf_runner.finalize
69
+ def finalize!
70
+ @waf_runner.finalize!
71
71
  end
72
72
  end
73
73
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../event'
4
+ require_relative '../../security_event'
5
+
3
6
  module Datadog
4
7
  module AppSec
5
8
  module Contrib
@@ -28,18 +31,13 @@ module Datadog
28
31
  result = context.run_rasp(Ext::RASP_SQLI, {}, ephemeral_data, waf_timeout)
29
32
 
30
33
  if result.match?
31
- Datadog::AppSec::Event.tag_and_keep!(context, result)
32
-
33
- event = {
34
- waf_result: result,
35
- trace: context.trace,
36
- span: context.span,
37
- sql: sql,
38
- actions: result.actions
39
- }
40
- context.events << event
41
-
42
- ActionsHandler.handle(result.actions)
34
+ AppSec::Event.tag_and_keep!(context, result)
35
+
36
+ context.events.push(
37
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
38
+ )
39
+
40
+ AppSec::ActionsHandler.handle(result.actions)
43
41
  end
44
42
  end
45
43
 
@@ -13,10 +13,10 @@ module Datadog
13
13
 
14
14
  MINIMUM_VERSION = Gem::Version.new('4')
15
15
 
16
- register_as :active_record, auto_patch: false
16
+ register_as :active_record, auto_patch: true
17
17
 
18
18
  def self.version
19
- Gem.loaded_specs['activerecord'] && Gem.loaded_specs['activerecord'].version
19
+ Gem.loaded_specs['activerecord']&.version
20
20
  end
21
21
 
22
22
  def self.loaded?
@@ -53,43 +53,43 @@ module Datadog
53
53
 
54
54
  def patch_sqlite3_adapter
55
55
  instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
56
- Instrumentation::InternalExecQueryAdapterPatch
57
- elsif ::ActiveRecord.gem_version.segments.first == 4
58
- Instrumentation::Rails4ExecQueryAdapterPatch
59
- else
60
- Instrumentation::ExecQueryAdapterPatch
61
- end
56
+ Instrumentation::InternalExecQueryAdapterPatch
57
+ elsif ::ActiveRecord.gem_version.segments.first == 4
58
+ Instrumentation::Rails4ExecQueryAdapterPatch
59
+ else
60
+ Instrumentation::ExecQueryAdapterPatch
61
+ end
62
62
 
63
63
  ::ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(instrumentation_module)
64
64
  end
65
65
 
66
66
  def patch_mysql2_adapter
67
67
  instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
68
- Instrumentation::InternalExecQueryAdapterPatch
69
- elsif ::ActiveRecord.gem_version.segments.first == 4
70
- Instrumentation::Rails4ExecQueryAdapterPatch
71
- else
72
- Instrumentation::ExecQueryAdapterPatch
73
- end
68
+ Instrumentation::InternalExecQueryAdapterPatch
69
+ elsif ::ActiveRecord.gem_version.segments.first == 4
70
+ Instrumentation::Rails4ExecQueryAdapterPatch
71
+ else
72
+ Instrumentation::ExecQueryAdapterPatch
73
+ end
74
74
 
75
75
  ::ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(instrumentation_module)
76
76
  end
77
77
 
78
78
  def patch_postgresql_adapter
79
79
  instrumentation_module = if ::ActiveRecord.gem_version.segments.first == 4
80
- Instrumentation::Rails4ExecuteAndClearAdapterPatch
81
- else
82
- Instrumentation::ExecuteAndClearAdapterPatch
83
- end
80
+ Instrumentation::Rails4ExecuteAndClearAdapterPatch
81
+ else
82
+ Instrumentation::ExecuteAndClearAdapterPatch
83
+ end
84
84
 
85
85
  if defined?(::ActiveRecord::ConnectionAdapters::JdbcAdapter)
86
86
  instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
87
- Instrumentation::InternalExecQueryAdapterPatch
88
- elsif ::ActiveRecord.gem_version.segments.first == 4
89
- Instrumentation::Rails4ExecQueryAdapterPatch
90
- else
91
- Instrumentation::ExecQueryAdapterPatch
92
- end
87
+ Instrumentation::InternalExecQueryAdapterPatch
88
+ elsif ::ActiveRecord.gem_version.segments.first == 4
89
+ Instrumentation::Rails4ExecQueryAdapterPatch
90
+ else
91
+ Instrumentation::ExecQueryAdapterPatch
92
+ end
93
93
  end
94
94
 
95
95
  ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(instrumentation_module)
@@ -9,7 +9,7 @@ module Datadog
9
9
  def self.patch_all
10
10
  integrations = []
11
11
 
12
- Datadog::AppSec::Contrib::Integration.registry.each do |_name, integration|
12
+ Datadog::AppSec::Contrib::Integration.registry.each_value do |integration|
13
13
  next unless integration.klass.auto_instrument?
14
14
 
15
15
  integrations << integration.name