datadog 2.7.1 → 2.17.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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +310 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +10 -10
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +314 -145
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +7 -8
  16. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +61 -174
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +68 -1
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -1
  23. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  25. data/ext/datadog_profiling_native_extension/stack_recorder.c +84 -131
  26. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  27. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  28. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  29. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  30. data/ext/libdatadog_api/crashtracker.c +17 -15
  31. data/ext/libdatadog_api/crashtracker.h +5 -0
  32. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  33. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  34. data/ext/libdatadog_api/init.c +15 -0
  35. data/ext/libdatadog_api/library_config.c +122 -0
  36. data/ext/libdatadog_api/library_config.h +19 -0
  37. data/ext/libdatadog_api/macos_development.md +3 -3
  38. data/ext/libdatadog_api/process_discovery.c +117 -0
  39. data/ext/libdatadog_api/process_discovery.h +5 -0
  40. data/ext/libdatadog_extconf_helpers.rb +1 -1
  41. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  42. data/lib/datadog/appsec/actions_handler.rb +49 -0
  43. data/lib/datadog/appsec/anonymizer.rb +16 -0
  44. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  45. data/lib/datadog/appsec/api_security.rb +9 -0
  46. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  47. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  48. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  49. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  50. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  51. data/lib/datadog/appsec/autoload.rb +1 -1
  52. data/lib/datadog/appsec/component.rb +41 -33
  53. data/lib/datadog/appsec/compressed_json.rb +40 -0
  54. data/lib/datadog/appsec/configuration/settings.rb +152 -25
  55. data/lib/datadog/appsec/context.rb +74 -0
  56. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  57. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  58. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  59. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  60. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  61. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  62. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  63. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  64. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  65. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  66. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  67. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  68. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  69. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  70. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  71. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  72. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  73. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  74. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  75. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  76. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  77. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  78. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  79. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  80. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  81. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  82. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  83. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  84. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  87. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -68
  88. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  89. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  91. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  92. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  93. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  95. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  97. data/lib/datadog/appsec/event.rb +96 -135
  98. data/lib/datadog/appsec/ext.rb +12 -3
  99. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  100. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  101. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  102. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  103. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  104. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  105. data/lib/datadog/appsec/metrics.rb +13 -0
  106. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -31
  108. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  109. data/lib/datadog/appsec/processor.rb +5 -4
  110. data/lib/datadog/appsec/remote.rb +26 -12
  111. data/lib/datadog/appsec/response.rb +19 -85
  112. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  113. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  114. data/lib/datadog/appsec/security_engine.rb +9 -0
  115. data/lib/datadog/appsec/security_event.rb +39 -0
  116. data/lib/datadog/appsec/utils.rb +0 -2
  117. data/lib/datadog/appsec.rb +23 -10
  118. data/lib/datadog/auto_instrument.rb +3 -0
  119. data/lib/datadog/core/buffer/random.rb +18 -2
  120. data/lib/datadog/core/configuration/agent_settings_resolver.rb +42 -14
  121. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  122. data/lib/datadog/core/configuration/components.rb +76 -32
  123. data/lib/datadog/core/configuration/components_state.rb +23 -0
  124. data/lib/datadog/core/configuration/ext.rb +5 -1
  125. data/lib/datadog/core/configuration/option.rb +79 -43
  126. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  127. data/lib/datadog/core/configuration/options.rb +3 -3
  128. data/lib/datadog/core/configuration/settings.rb +100 -41
  129. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  130. data/lib/datadog/core/configuration.rb +43 -11
  131. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  132. data/lib/datadog/core/crashtracking/component.rb +4 -13
  133. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  134. data/lib/datadog/core/encoding.rb +17 -1
  135. data/lib/datadog/core/environment/agent_info.rb +78 -0
  136. data/lib/datadog/core/environment/cgroup.rb +10 -12
  137. data/lib/datadog/core/environment/container.rb +38 -40
  138. data/lib/datadog/core/environment/ext.rb +6 -6
  139. data/lib/datadog/core/environment/git.rb +1 -0
  140. data/lib/datadog/core/environment/identity.rb +3 -3
  141. data/lib/datadog/core/environment/platform.rb +3 -3
  142. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  143. data/lib/datadog/core/error.rb +11 -9
  144. data/lib/datadog/core/logger.rb +2 -2
  145. data/lib/datadog/core/metrics/client.rb +27 -27
  146. data/lib/datadog/core/metrics/logging.rb +5 -5
  147. data/lib/datadog/core/process_discovery.rb +32 -0
  148. data/lib/datadog/core/rate_limiter.rb +4 -2
  149. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  150. data/lib/datadog/core/remote/client.rb +107 -92
  151. data/lib/datadog/core/remote/component.rb +18 -19
  152. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  153. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  154. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  155. data/lib/datadog/core/remote/negotiation.rb +9 -9
  156. data/lib/datadog/core/remote/transport/config.rb +4 -3
  157. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  158. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  159. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  160. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  161. data/lib/datadog/core/remote/transport/http.rb +25 -94
  162. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  163. data/lib/datadog/core/remote/worker.rb +10 -7
  164. data/lib/datadog/core/runtime/metrics.rb +12 -5
  165. data/lib/datadog/core/telemetry/component.rb +84 -49
  166. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  167. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  168. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  169. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  170. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  171. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  172. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  173. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  174. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  175. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  176. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  177. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  178. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  179. data/lib/datadog/core/telemetry/event.rb +17 -383
  180. data/lib/datadog/core/telemetry/ext.rb +1 -0
  181. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  182. data/lib/datadog/core/telemetry/logger.rb +1 -1
  183. data/lib/datadog/core/telemetry/logging.rb +2 -2
  184. data/lib/datadog/core/telemetry/metric.rb +28 -6
  185. data/lib/datadog/core/telemetry/request.rb +4 -4
  186. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  187. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  188. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  189. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  190. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  191. data/lib/datadog/core/telemetry/worker.rb +128 -25
  192. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  193. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  194. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  195. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  196. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  197. data/lib/datadog/core/transport/http.rb +75 -0
  198. data/lib/datadog/core/transport/response.rb +4 -0
  199. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  200. data/lib/datadog/core/utils/duration.rb +32 -32
  201. data/lib/datadog/core/utils/forking.rb +2 -2
  202. data/lib/datadog/core/utils/network.rb +6 -6
  203. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  204. data/lib/datadog/core/utils/time.rb +20 -0
  205. data/lib/datadog/core/utils/truncation.rb +21 -0
  206. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  207. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  208. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  209. data/lib/datadog/core/worker.rb +1 -1
  210. data/lib/datadog/core/workers/async.rb +29 -12
  211. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  212. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  213. data/lib/datadog/core.rb +8 -0
  214. data/lib/datadog/di/base.rb +115 -0
  215. data/lib/datadog/di/boot.rb +34 -0
  216. data/lib/datadog/di/code_tracker.rb +26 -15
  217. data/lib/datadog/di/component.rb +23 -14
  218. data/lib/datadog/di/configuration/settings.rb +25 -1
  219. data/lib/datadog/di/contrib/active_record.rb +1 -0
  220. data/lib/datadog/di/contrib/railtie.rb +15 -0
  221. data/lib/datadog/di/contrib.rb +28 -0
  222. data/lib/datadog/di/error.rb +5 -0
  223. data/lib/datadog/di/instrumenter.rb +111 -20
  224. data/lib/datadog/di/logger.rb +30 -0
  225. data/lib/datadog/di/preload.rb +18 -0
  226. data/lib/datadog/di/probe.rb +14 -7
  227. data/lib/datadog/di/probe_builder.rb +1 -0
  228. data/lib/datadog/di/probe_manager.rb +11 -5
  229. data/lib/datadog/di/probe_notification_builder.rb +34 -8
  230. data/lib/datadog/di/probe_notifier_worker.rb +52 -26
  231. data/lib/datadog/di/redactor.rb +0 -1
  232. data/lib/datadog/di/remote.rb +147 -0
  233. data/lib/datadog/di/serializer.rb +14 -7
  234. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  235. data/lib/datadog/di/transport/http/api.rb +42 -0
  236. data/lib/datadog/di/transport/http/client.rb +47 -0
  237. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  238. data/lib/datadog/di/transport/http/input.rb +67 -0
  239. data/lib/datadog/di/transport/http.rb +57 -0
  240. data/lib/datadog/di/transport/input.rb +62 -0
  241. data/lib/datadog/di/utils.rb +103 -0
  242. data/lib/datadog/di.rb +14 -76
  243. data/lib/datadog/error_tracking/collector.rb +87 -0
  244. data/lib/datadog/error_tracking/component.rb +167 -0
  245. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  246. data/lib/datadog/error_tracking/configuration.rb +11 -0
  247. data/lib/datadog/error_tracking/ext.rb +18 -0
  248. data/lib/datadog/error_tracking/extensions.rb +16 -0
  249. data/lib/datadog/error_tracking/filters.rb +77 -0
  250. data/lib/datadog/error_tracking.rb +18 -0
  251. data/lib/datadog/kit/appsec/events.rb +15 -3
  252. data/lib/datadog/kit/identity.rb +9 -5
  253. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  254. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  255. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  256. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  257. data/lib/datadog/opentelemetry.rb +2 -1
  258. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  259. data/lib/datadog/profiling/collectors/info.rb +3 -0
  260. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  261. data/lib/datadog/profiling/component.rb +60 -76
  262. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  263. data/lib/datadog/profiling/exporter.rb +3 -4
  264. data/lib/datadog/profiling/ext.rb +0 -2
  265. data/lib/datadog/profiling/flush.rb +5 -8
  266. data/lib/datadog/profiling/http_transport.rb +6 -85
  267. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  268. data/lib/datadog/profiling/scheduler.rb +8 -1
  269. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  270. data/lib/datadog/profiling/tag_builder.rb +1 -5
  271. data/lib/datadog/profiling.rb +6 -2
  272. data/lib/datadog/tracing/analytics.rb +1 -1
  273. data/lib/datadog/tracing/component.rb +16 -12
  274. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  275. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  276. data/lib/datadog/tracing/context_provider.rb +1 -1
  277. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  278. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  279. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  280. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  281. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  283. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  284. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  285. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  286. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  287. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  288. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  289. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  290. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  291. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  292. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  293. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  294. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  295. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  296. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  297. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  298. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  299. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  300. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  301. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  302. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  303. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  304. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  305. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  306. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  307. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  308. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  309. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  310. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  311. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  313. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  314. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  315. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  316. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  317. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  318. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  319. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  320. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  321. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  322. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  323. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  324. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  325. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  326. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  327. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  328. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  329. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  331. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  332. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  334. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  335. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  336. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  337. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  338. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  339. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  340. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  341. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  342. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  343. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  344. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  345. data/lib/datadog/tracing/contrib/support.rb +28 -0
  346. data/lib/datadog/tracing/contrib.rb +1 -0
  347. data/lib/datadog/tracing/correlation.rb +9 -2
  348. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  349. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  350. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  351. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  352. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  353. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  354. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  355. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  356. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  357. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  358. data/lib/datadog/tracing/metadata.rb +2 -0
  359. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  360. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  361. data/lib/datadog/tracing/span.rb +22 -5
  362. data/lib/datadog/tracing/span_event.rb +124 -4
  363. data/lib/datadog/tracing/span_operation.rb +52 -16
  364. data/lib/datadog/tracing/sync_writer.rb +9 -5
  365. data/lib/datadog/tracing/trace_digest.rb +9 -2
  366. data/lib/datadog/tracing/trace_operation.rb +44 -24
  367. data/lib/datadog/tracing/trace_segment.rb +6 -4
  368. data/lib/datadog/tracing/tracer.rb +60 -12
  369. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  370. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  371. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  372. data/lib/datadog/tracing/transport/http.rb +13 -70
  373. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  374. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  375. data/lib/datadog/tracing/transport/traces.rb +47 -13
  376. data/lib/datadog/tracing/utils.rb +1 -1
  377. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  378. data/lib/datadog/tracing/workers.rb +5 -4
  379. data/lib/datadog/tracing/writer.rb +10 -6
  380. data/lib/datadog/tracing.rb +16 -3
  381. data/lib/datadog/version.rb +2 -2
  382. data/lib/datadog.rb +2 -0
  383. metadata +143 -50
  384. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  385. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  386. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  387. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  388. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  389. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  390. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  391. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  392. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  393. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  394. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  395. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  396. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  397. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  398. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  399. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  400. data/lib/datadog/appsec/processor/actions.rb +0 -49
  401. data/lib/datadog/appsec/processor/context.rb +0 -107
  402. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  403. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  404. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  405. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  406. data/lib/datadog/appsec/scope.rb +0 -58
  407. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  408. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  409. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  410. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  411. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  412. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  413. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  414. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  415. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  416. data/lib/datadog/di/transport.rb +0 -81
  417. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module AppSec
5
+ module Contrib
6
+ module Faraday
7
+ # Patcher for Faraday
8
+ module Patcher
9
+ module_function
10
+
11
+ def patched?
12
+ Patcher.instance_variable_get(:@patched)
13
+ end
14
+
15
+ def target_version
16
+ Integration.version
17
+ end
18
+
19
+ def patch
20
+ require_relative 'ssrf_detection_middleware'
21
+ require_relative 'connection_patch'
22
+ require_relative 'rack_builder_patch'
23
+
24
+ ::Faraday::Middleware.register_middleware(datadog_appsec: SSRFDetectionMiddleware)
25
+ configure_default_faraday_connection
26
+
27
+ Patcher.instance_variable_set(:@patched, true)
28
+ end
29
+
30
+ def configure_default_faraday_connection
31
+ if target_version >= Gem::Version.new('1.0.0')
32
+ # Patch the default connection (e.g. +Faraday.get+)
33
+ ::Faraday.default_connection.use(:datadog_appsec)
34
+
35
+ # Patch new connection instances (e.g. +Faraday.new+)
36
+ ::Faraday::Connection.prepend(ConnectionPatch)
37
+ else
38
+ # Patch the default connection (e.g. +Faraday.get+)
39
+ #
40
+ # We insert our middleware before the 'adapter', which is
41
+ # always the last handler.
42
+ idx = ::Faraday.default_connection.builder.handlers.size - 1
43
+ ::Faraday.default_connection.builder.insert(idx, SSRFDetectionMiddleware)
44
+
45
+ # Patch new connection instances (e.g. +Faraday.new+)
46
+ ::Faraday::RackBuilder.prepend(RackBuilderPatch)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module AppSec
5
+ module Contrib
6
+ module Faraday
7
+ # Handles installation of our middleware if the user has *not*
8
+ # already explicitly configured it for this correction.
9
+ #
10
+ # RackBuilder class was introduced in faraday 0.9.0:
11
+ # https://github.com/lostisland/faraday/commit/77d7546d6d626b91086f427c56bc2cdd951353b3
12
+ module RackBuilderPatch
13
+ def adapter(*args)
14
+ use(:datadog_appsec) unless @handlers.any? { |h| h.klass == SSRFDetectionMiddleware }
15
+
16
+ super
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../../event'
5
+ require_relative '../../security_event'
6
+
7
+ module Datadog
8
+ module AppSec
9
+ module Contrib
10
+ module Faraday
11
+ # AppSec SSRF detection Middleware for Faraday
12
+ class SSRFDetectionMiddleware < ::Faraday::Middleware
13
+ def call(request_env)
14
+ context = AppSec.active_context
15
+
16
+ return @app.call(request_env) unless context && AppSec.rasp_enabled?
17
+
18
+ ephemeral_data = {
19
+ 'server.io.net.url' => request_env.url.to_s
20
+ }
21
+
22
+ result = context.run_rasp(Ext::RASP_SSRF, {}, ephemeral_data, Datadog.configuration.appsec.waf_timeout)
23
+
24
+ if result.match?
25
+ AppSec::Event.tag_and_keep!(context, result)
26
+
27
+ context.events.push(
28
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
29
+ )
30
+
31
+ AppSec::ActionsHandler.handle(result.actions)
32
+ end
33
+
34
+ @app.call(request_env)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ # rubocop:enable Naming/FileName
@@ -16,16 +16,10 @@ module Datadog
16
16
 
17
17
  gateway_multiplex = Gateway::Multiplex.new(multiplex)
18
18
 
19
- multiplex_return, multiplex_response = Instrumentation.gateway.push('graphql.multiplex', gateway_multiplex) do
19
+ multiplex_return, _gateway_multiplex = Instrumentation.gateway.push('graphql.multiplex', gateway_multiplex) do
20
20
  super
21
21
  end
22
22
 
23
- # Returns an error * the number of queries so that the entire multiplex is blocked
24
- if multiplex_response
25
- blocked_event = multiplex_response.find { |action, _options| action == :block }
26
- multiplex_return = AppSec::Response.graphql_response(gateway_multiplex) if blocked_event
27
- end
28
-
29
23
  multiplex_return
30
24
  end
31
25
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
+
5
+ require_relative '../../../event'
6
+ require_relative '../../../security_event'
4
7
  require_relative '../../../instrumentation/gateway'
5
- require_relative '../reactive/multiplex'
6
- require_relative '../../../reactive/operation'
7
8
 
8
9
  module Datadog
9
10
  module AppSec
@@ -19,43 +20,29 @@ module Datadog
19
20
  watch_multiplex(gateway)
20
21
  end
21
22
 
22
- # This time we don't throw but use next
23
23
  def watch_multiplex(gateway = Instrumentation.gateway)
24
24
  gateway.watch('graphql.multiplex', :appsec) do |stack, gateway_multiplex|
25
- block = false
26
- event = nil
27
-
28
- scope = AppSec::Scope.active_scope
29
-
30
- if scope
31
- AppSec::Reactive::Operation.new('graphql.multiplex') do |op|
32
- GraphQL::Reactive::Multiplex.subscribe(op, scope.processor_context) do |result|
33
- event = {
34
- waf_result: result,
35
- trace: scope.trace,
36
- span: scope.service_entry_span,
37
- multiplex: gateway_multiplex,
38
- actions: result.actions
39
- }
25
+ context = AppSec::Context.active
40
26
 
41
- Datadog::AppSec::Event.tag_and_keep!(scope, result)
42
- scope.processor_context.events << event
43
- end
27
+ if context
28
+ persistent_data = {
29
+ 'graphql.server.all_resolvers' => gateway_multiplex.arguments
30
+ }
44
31
 
45
- block = GraphQL::Reactive::Multiplex.publish(op, gateway_multiplex)
46
- end
47
- end
32
+ result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
48
33
 
49
- next [nil, [[:block, event]]] if block
34
+ if result.match?
35
+ AppSec::Event.tag_and_keep!(context, result)
50
36
 
51
- ret, res = stack.call(gateway_multiplex.arguments)
37
+ context.events.push(
38
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
39
+ )
52
40
 
53
- if event
54
- res ||= []
55
- res << [:monitor, event]
41
+ AppSec::ActionsHandler.handle(result.actions)
42
+ end
56
43
  end
57
44
 
58
- [ret, res]
45
+ stack.call(gateway_multiplex.arguments)
59
46
  end
60
47
  end
61
48
  end
@@ -23,7 +23,7 @@ module Datadog
23
23
  register_as :graphql, auto_patch: false
24
24
 
25
25
  def self.version
26
- Gem.loaded_specs['graphql'] && Gem.loaded_specs['graphql'].version
26
+ Gem.loaded_specs['graphql']&.version
27
27
  end
28
28
 
29
29
  def self.loaded?
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../patcher'
4
3
  require_relative 'gateway/watcher'
5
4
 
6
5
  if Gem.loaded_specs['graphql'] && Gem.loaded_specs['graphql'].version >= Gem::Version.new('2.0.19')
@@ -13,8 +12,6 @@ module Datadog
13
12
  module GraphQL
14
13
  # Patcher for AppSec on GraphQL
15
14
  module Patcher
16
- include Datadog::AppSec::Contrib::Patcher
17
-
18
15
  module_function
19
16
 
20
17
  def patched?
@@ -6,6 +6,40 @@ module Datadog
6
6
  module Rack
7
7
  # Rack integration constants
8
8
  module Ext
9
+ COLLECTABLE_REQUEST_HEADERS = [
10
+ 'accept',
11
+ 'akamai-user-risk',
12
+ 'cf-ray',
13
+ 'cloudfront-viewer-ja3-fingerprint',
14
+ 'content-type',
15
+ 'user-agent',
16
+ 'x-amzn-trace-Id',
17
+ 'x-appgw-trace-id',
18
+ 'x-cloud-trace-context',
19
+ 'x-sigsci-requestid',
20
+ 'x-sigsci-tags'
21
+ ].freeze
22
+
23
+ IDENTITY_COLLECTABLE_REQUEST_HEADERS = [
24
+ 'accept-encoding',
25
+ 'accept-language',
26
+ 'cf-connecting-ip',
27
+ 'cf-connecting-ipv6',
28
+ 'content-encoding',
29
+ 'content-language',
30
+ 'content-length',
31
+ 'fastly-client-ip',
32
+ 'forwarded',
33
+ 'forwarded-for',
34
+ 'host',
35
+ 'true-client-ip',
36
+ 'via',
37
+ 'x-client-ip',
38
+ 'x-cluster-client-ip',
39
+ 'x-forwarded',
40
+ 'x-forwarded-for',
41
+ 'x-real-ip'
42
+ ].freeze
9
43
  end
10
44
  end
11
45
  end
@@ -9,14 +9,14 @@ module Datadog
9
9
  module Gateway
10
10
  # Gateway Response argument.
11
11
  class Response < Instrumentation::Gateway::Argument
12
- attr_reader :body, :status, :headers, :scope
12
+ attr_reader :body, :status, :headers, :context
13
13
 
14
- def initialize(body, status, headers, scope:)
14
+ def initialize(body, status, headers, context:)
15
15
  super()
16
16
  @body = body
17
17
  @status = status
18
18
  @headers = headers.each_with_object({}) { |(k, v), h| h[k.downcase] = v }
19
- @scope = scope
19
+ @context = context
20
20
  end
21
21
 
22
22
  def response
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../instrumentation/gateway'
4
- require_relative '../../../reactive/operation'
5
- require_relative '../reactive/request'
6
- require_relative '../reactive/request_body'
7
- require_relative '../reactive/response'
3
+ require_relative '../ext'
8
4
  require_relative '../../../event'
5
+ require_relative '../../../security_event'
6
+ require_relative '../../../instrumentation/gateway'
9
7
 
10
8
  module Datadog
11
9
  module AppSec
@@ -21,130 +19,112 @@ module Datadog
21
19
  watch_request(gateway)
22
20
  watch_response(gateway)
23
21
  watch_request_body(gateway)
22
+ watch_request_finish(gateway)
24
23
  end
25
24
 
26
25
  def watch_request(gateway = Instrumentation.gateway)
27
26
  gateway.watch('rack.request', :appsec) do |stack, gateway_request|
28
- block = false
29
- event = nil
30
- scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
31
-
32
- AppSec::Reactive::Operation.new('rack.request') do |op|
33
- Rack::Reactive::Request.subscribe(op, scope.processor_context) do |result|
34
- if result.status == :match
35
- # TODO: should this hash be an Event instance instead?
36
- event = {
37
- waf_result: result,
38
- trace: scope.trace,
39
- span: scope.service_entry_span,
40
- request: gateway_request,
41
- actions: result.actions
42
- }
43
-
44
- # We want to keep the trace in case of security event
45
- scope.trace.keep! if scope.trace
46
- Datadog::AppSec::Event.tag_and_keep!(scope, result)
47
- scope.processor_context.events << event
48
- end
49
- end
50
-
51
- block = Rack::Reactive::Request.publish(op, gateway_request)
27
+ context = gateway_request.env[AppSec::Ext::CONTEXT_KEY]
28
+
29
+ persistent_data = {
30
+ 'server.request.cookies' => gateway_request.cookies,
31
+ 'server.request.query' => gateway_request.query,
32
+ 'server.request.uri.raw' => gateway_request.fullpath,
33
+ 'server.request.headers' => gateway_request.headers,
34
+ 'server.request.headers.no_cookies' => gateway_request.headers.dup.tap { |h| h.delete('cookie') },
35
+ 'http.client_ip' => gateway_request.client_ip,
36
+ 'server.request.method' => gateway_request.method
37
+ }
38
+
39
+ result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
40
+
41
+ if result.match? || !result.derivatives.empty?
42
+ context.events.push(
43
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
44
+ )
52
45
  end
53
46
 
54
- next [nil, [[:block, event]]] if block
55
-
56
- ret, res = stack.call(gateway_request.request)
57
-
58
- if event
59
- res ||= []
60
- res << [:monitor, event]
47
+ if result.match?
48
+ AppSec::Event.tag_and_keep!(context, result)
49
+ AppSec::ActionsHandler.handle(result.actions)
61
50
  end
62
51
 
63
- [ret, res]
52
+ stack.call(gateway_request.request)
64
53
  end
65
54
  end
66
55
 
67
56
  def watch_response(gateway = Instrumentation.gateway)
68
57
  gateway.watch('rack.response', :appsec) do |stack, gateway_response|
69
- block = false
70
-
71
- event = nil
72
- scope = gateway_response.scope
73
-
74
- AppSec::Reactive::Operation.new('rack.response') do |op|
75
- Rack::Reactive::Response.subscribe(op, scope.processor_context) do |result|
76
- if result.status == :match
77
- # TODO: should this hash be an Event instance instead?
78
- event = {
79
- waf_result: result,
80
- trace: scope.trace,
81
- span: scope.service_entry_span,
82
- response: gateway_response,
83
- actions: result.actions
84
- }
85
-
86
- # We want to keep the trace in case of security event
87
- scope.trace.keep! if scope.trace
88
- Datadog::AppSec::Event.tag_and_keep!(scope, result)
89
- scope.processor_context.events << event
90
- end
91
- end
58
+ context = gateway_response.context
92
59
 
93
- block = Rack::Reactive::Response.publish(op, gateway_response)
94
- end
60
+ persistent_data = {
61
+ 'server.response.status' => gateway_response.status.to_s,
62
+ 'server.response.headers' => gateway_response.headers,
63
+ 'server.response.headers.no_cookies' => gateway_response.headers.dup.tap { |h| h.delete('set-cookie') }
64
+ }
95
65
 
96
- next [nil, [[:block, event]]] if block
66
+ result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
97
67
 
98
- ret, res = stack.call(gateway_response.response)
68
+ if result.match?
69
+ AppSec::Event.tag_and_keep!(context, result)
99
70
 
100
- if event
101
- res ||= []
102
- res << [:monitor, event]
71
+ context.events.push(
72
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
73
+ )
74
+
75
+ AppSec::ActionsHandler.handle(result.actions)
103
76
  end
104
77
 
105
- [ret, res]
78
+ stack.call(gateway_response.response)
106
79
  end
107
80
  end
108
81
 
109
82
  def watch_request_body(gateway = Instrumentation.gateway)
110
83
  gateway.watch('rack.request.body', :appsec) do |stack, gateway_request|
111
- block = false
112
-
113
- event = nil
114
- scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
115
-
116
- AppSec::Reactive::Operation.new('rack.request.body') do |op|
117
- Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result|
118
- if result.status == :match
119
- # TODO: should this hash be an Event instance instead?
120
- event = {
121
- waf_result: result,
122
- trace: scope.trace,
123
- span: scope.service_entry_span,
124
- request: gateway_request,
125
- actions: result.actions
126
- }
127
-
128
- # We want to keep the trace in case of security event
129
- scope.trace.keep! if scope.trace
130
- Datadog::AppSec::Event.tag_and_keep!(scope, result)
131
- scope.processor_context.events << event
132
- end
133
- end
84
+ context = gateway_request.env[AppSec::Ext::CONTEXT_KEY]
134
85
 
135
- block = Rack::Reactive::RequestBody.publish(op, gateway_request)
86
+ persistent_data = {
87
+ 'server.request.body' => gateway_request.form_hash
88
+ }
89
+
90
+ result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
91
+
92
+ if result.match?
93
+ AppSec::Event.tag_and_keep!(context, result)
94
+
95
+ context.events.push(
96
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
97
+ )
98
+
99
+ AppSec::ActionsHandler.handle(result.actions)
136
100
  end
137
101
 
138
- next [nil, [[:block, event]]] if block
102
+ stack.call(gateway_request.request)
103
+ end
104
+ end
105
+
106
+ # NOTE: In the current state we unable to substibe twice to the same
107
+ # event within the same group. Ideally this code should live
108
+ # somewhere closer to identity related monitor.
109
+ # WARNING: The Gateway is a subject of refactoring
110
+ def watch_request_finish(gateway = Instrumentation.gateway)
111
+ gateway.watch('rack.request.finish', :appsec) do |stack, gateway_request|
112
+ context = gateway_request.env[AppSec::Ext::CONTEXT_KEY]
139
113
 
140
- ret, res = stack.call(gateway_request.request)
114
+ if context.span.nil? || !gateway.pushed?('appsec.events.user_lifecycle')
115
+ next stack.call(gateway_request.request)
116
+ end
117
+
118
+ gateway_request.headers.each do |name, value|
119
+ if !Ext::COLLECTABLE_REQUEST_HEADERS.include?(name) &&
120
+ !Ext::IDENTITY_COLLECTABLE_REQUEST_HEADERS.include?(name)
121
+ next
122
+ end
141
123
 
142
- if event
143
- res ||= []
144
- res << [:monitor, event]
124
+ context.span["http.request.headers.#{name}"] ||= value
145
125
  end
146
126
 
147
- [ret, res]
127
+ stack.call(gateway_request.request)
148
128
  end
149
129
  end
150
130
  end
@@ -19,7 +19,7 @@ module Datadog
19
19
  register_as :rack, auto_patch: false
20
20
 
21
21
  def self.version
22
- Gem.loaded_specs['rack'] && Gem.loaded_specs['rack'].version
22
+ Gem.loaded_specs['rack']&.version
23
23
  end
24
24
 
25
25
  def self.loaded?
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../patcher'
4
3
  require_relative '../../monitor'
5
4
  require_relative 'gateway/watcher'
6
5
 
@@ -10,8 +9,6 @@ module Datadog
10
9
  module Rack
11
10
  # Patcher for Rack integration
12
11
  module Patcher
13
- include Datadog::AppSec::Contrib::Patcher
14
-
15
12
  module_function
16
13
 
17
14
  def patched?
@@ -17,25 +17,24 @@ module Datadog
17
17
  end
18
18
 
19
19
  def call(env)
20
- context = env[Datadog::AppSec::Ext::SCOPE_KEY]
20
+ context = env[Datadog::AppSec::Ext::CONTEXT_KEY]
21
21
 
22
22
  return @app.call(env) unless context
23
23
 
24
24
  # TODO: handle exceptions, except for @app.call
25
25
 
26
- request_return, request_response = Instrumentation.gateway.push(
27
- 'rack.request.body',
28
- Gateway::Request.new(env)
29
- ) do
30
- @app.call(env)
31
- end
26
+ http_response = nil
27
+ interrupt_params = catch(::Datadog::AppSec::Ext::INTERRUPT) do
28
+ http_response, _request = Instrumentation.gateway.push('rack.request.body', Gateway::Request.new(env)) do
29
+ @app.call(env)
30
+ end
32
31
 
33
- if request_response
34
- blocked_event = request_response.find { |action, _event| action == :block }
35
- request_return = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_rack if blocked_event
32
+ nil
36
33
  end
37
34
 
38
- request_return
35
+ return AppSec::Response.from_interrupt_params(interrupt_params, env['HTTP_ACCEPT']).to_rack if interrupt_params
36
+
37
+ http_response
39
38
  end
40
39
  end
41
40
  end