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
@@ -1,60 +0,0 @@
1
- # rubocop:disable Style/StderrPuts
2
-
3
- if RUBY_ENGINE != "ruby" || Gem.win_platform?
4
- $stderr.puts(
5
- "WARN: Skipping build of Datadog profiling loader. See Datadog profiling native extension note for details."
6
- )
7
-
8
- File.write("Makefile", "all install clean: # dummy makefile that does nothing")
9
- exit
10
- end
11
-
12
- require "mkmf"
13
-
14
- # Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
15
- # But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
16
- append_cflags "-Werror" if ENV["DATADOG_GEM_CI"] == "true"
17
-
18
- # Older gcc releases may not default to C99 and we need to ask for this. This is also used:
19
- # * by upstream Ruby -- search for gnu99 in the codebase
20
- # * by msgpack, another datadog gem dependency
21
- # (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
22
- append_cflags "-std=gnu99"
23
-
24
- # Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
25
- append_cflags "-Wno-unused-function"
26
-
27
- # Allow defining variables at any point in a function
28
- append_cflags "-Wno-declaration-after-statement"
29
-
30
- # If we forget to include a Ruby header, the function call may still appear to work, but then
31
- # cause a segfault later. Let's ensure that never happens.
32
- append_cflags "-Werror-implicit-function-declaration"
33
-
34
- # Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
35
- append_cflags "-Wunused-parameter"
36
-
37
- # The native extension is not intended to expose any symbols/functions for other native libraries to use;
38
- # the sole exception being `Init_datadog_profiling_loader` which needs to be visible for Ruby to call it when
39
- # it `dlopen`s the library.
40
- #
41
- # By setting this compiler flag, we tell it to assume that everything is private unless explicitly stated.
42
- # For more details see https://gcc.gnu.org/wiki/Visibility
43
- append_cflags "-fvisibility=hidden"
44
-
45
- # Avoid legacy C definitions
46
- append_cflags "-Wold-style-definition"
47
-
48
- # Enable all other compiler warnings
49
- append_cflags "-Wall"
50
- append_cflags "-Wextra"
51
-
52
- # Tag the native extension library with the Ruby version and Ruby platform.
53
- # This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
54
- # the wrong library is never loaded.
55
- # When requiring, we need to use the exact same string, including the version and the platform.
56
- EXTENSION_NAME = "datadog_profiling_loader.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze
57
-
58
- create_makefile(EXTENSION_NAME)
59
-
60
- # rubocop:enable Style/StderrPuts
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Devise
7
- # Class to extract event information from the resource
8
- class Event
9
- UUID_REGEX = /^\h{8}-\h{4}-\h{4}-\h{4}-\h{12}$/.freeze
10
-
11
- SAFE_MODE = 'safe'
12
- EXTENDED_MODE = 'extended'
13
-
14
- attr_reader :user_id
15
-
16
- def initialize(resource, mode)
17
- @resource = resource
18
- @mode = mode
19
- @user_id = nil
20
- @email = nil
21
- @username = nil
22
-
23
- extract if @resource
24
- end
25
-
26
- def to_h
27
- return @event if defined?(@event)
28
-
29
- @event = {}
30
- @event[:email] = @email if @email
31
- @event[:username] = @username if @username
32
- @event
33
- end
34
-
35
- private
36
-
37
- def extract
38
- @user_id = @resource.id
39
-
40
- case @mode
41
- when EXTENDED_MODE
42
- @email = @resource.email
43
- @username = @resource.username
44
- when SAFE_MODE
45
- @user_id = nil unless @user_id && @user_id.to_s =~ UUID_REGEX
46
- else
47
- Datadog.logger.warn(
48
- "Invalid automated user evenst mode: `#{@mode}`. "\
49
- 'Supported modes are: `safe` and `extended`.'
50
- )
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../tracking'
4
- require_relative '../resource'
5
- require_relative '../event'
6
-
7
- module Datadog
8
- module AppSec
9
- module Contrib
10
- module Devise
11
- module Patcher
12
- # Hook in devise validate method
13
- module AuthenticatablePatch
14
- # rubocop:disable Metrics/MethodLength
15
- def validate(resource, &block)
16
- result = super
17
- return result unless AppSec.enabled?
18
- return result if @_datadog_skip_track_login_event
19
-
20
- track_user_events_configuration = Datadog.configuration.appsec.track_user_events
21
-
22
- return result unless track_user_events_configuration.enabled
23
-
24
- automated_track_user_events_mode = track_user_events_configuration.mode
25
-
26
- appsec_scope = Datadog::AppSec.active_scope
27
-
28
- return result unless appsec_scope
29
-
30
- devise_resource = resource ? Resource.new(resource) : nil
31
-
32
- event_information = Event.new(devise_resource, automated_track_user_events_mode)
33
-
34
- if result
35
- if event_information.user_id
36
- Datadog.logger.debug { 'User Login Event success' }
37
- else
38
- Datadog.logger.debug { 'User Login Event success, but can\'t extract user ID. Tracking empty event' }
39
- end
40
-
41
- Tracking.track_login_success(
42
- appsec_scope.trace,
43
- appsec_scope.service_entry_span,
44
- user_id: event_information.user_id,
45
- **event_information.to_h
46
- )
47
-
48
- return result
49
- end
50
-
51
- user_exists = nil
52
-
53
- if resource
54
- user_exists = true
55
- Datadog.logger.debug { 'User Login Event failure users exists' }
56
- else
57
- user_exists = false
58
- Datadog.logger.debug { 'User Login Event failure user do not exists' }
59
- end
60
-
61
- Tracking.track_login_failure(
62
- appsec_scope.trace,
63
- appsec_scope.service_entry_span,
64
- user_id: event_information.user_id,
65
- user_exists: user_exists,
66
- **event_information.to_h
67
- )
68
-
69
- result
70
- end
71
- # rubocop:enable Metrics/MethodLength
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../tracking'
4
- require_relative '../resource'
5
- require_relative '../event'
6
-
7
- module Datadog
8
- module AppSec
9
- module Contrib
10
- module Devise
11
- module Patcher
12
- # Hook in devise registration controller
13
- module RegistrationControllerPatch
14
- def create
15
- return super unless AppSec.enabled?
16
-
17
- track_user_events_configuration = Datadog.configuration.appsec.track_user_events
18
-
19
- return super unless track_user_events_configuration.enabled
20
-
21
- automated_track_user_events_mode = track_user_events_configuration.mode
22
-
23
- appsec_scope = Datadog::AppSec.active_scope
24
- return super unless appsec_scope
25
-
26
- super do |resource|
27
- if resource.persisted?
28
- devise_resource = Resource.new(resource)
29
-
30
- event_information = Event.new(devise_resource, automated_track_user_events_mode)
31
-
32
- if event_information.user_id
33
- Datadog.logger.debug { 'User Signup Event' }
34
- else
35
- Datadog.logger.warn { 'User Signup Event, but can\'t extract user ID. Tracking empty event' }
36
- end
37
-
38
- Tracking.track_signup(
39
- appsec_scope.trace,
40
- appsec_scope.service_entry_span,
41
- user_id: event_information.user_id,
42
- **event_information.to_h
43
- )
44
- end
45
-
46
- yield resource if block_given?
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Devise
7
- # Class to encpasulate extracting information from a Devise resource
8
- # Normally a devise resource would be an Active::Record instance
9
- class Resource
10
- def initialize(resource)
11
- @resource = resource
12
- end
13
-
14
- def id
15
- extract(:id) || extract(:uuid)
16
- end
17
-
18
- def email
19
- extract(:email)
20
- end
21
-
22
- def username
23
- extract(:username)
24
- end
25
-
26
- private
27
-
28
- def extract(method)
29
- @resource.send(method) if @resource.respond_to?(method)
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../kit/identity'
4
-
5
- module Datadog
6
- module AppSec
7
- module Contrib
8
- module Devise
9
- # Internal module to track user events
10
- module Tracking
11
- LOGIN_SUCCESS_EVENT = 'users.login.success'
12
- LOGIN_FAILURE_EVENT = 'users.login.failure'
13
- SIGNUP_EVENT = 'users.signup'
14
-
15
- def self.track_login_success(trace, span, user_id:, **others)
16
- return if trace.nil? || span.nil?
17
-
18
- track(LOGIN_SUCCESS_EVENT, trace, span, **others)
19
-
20
- Kit::Identity.set_user(trace, span, id: user_id.to_s, **others) if user_id
21
- end
22
-
23
- def self.track_login_failure(trace, span, user_id:, user_exists:, **others)
24
- return if trace.nil? || span.nil?
25
-
26
- track(LOGIN_FAILURE_EVENT, trace, span, **others)
27
-
28
- span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
29
- span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists)
30
- end
31
-
32
- def self.track_signup(trace, span, user_id:, **others)
33
- return if trace.nil? || span.nil?
34
-
35
- track(SIGNUP_EVENT, trace, span, **others)
36
- Kit::Identity.set_user(trace, id: user_id.to_s, **others) if user_id
37
- end
38
-
39
- def self.track(event, trace, span, **others)
40
- return if trace.nil? || span.nil?
41
-
42
- span.set_tag("appsec.events.#{event}.track", 'true')
43
- span.set_tag("_dd.appsec.events.#{event}.auto.mode", Datadog.configuration.appsec.track_user_events.mode)
44
-
45
- others.each do |k, v|
46
- raise ArgumentError, 'key cannot be :track' if k.to_sym == :track
47
-
48
- span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
49
- end
50
-
51
- trace.keep!
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module GraphQL
7
- module Reactive
8
- # Dispatch data from a GraphQL resolve query to the WAF context
9
- module Multiplex
10
- ADDRESSES = [
11
- 'graphql.server.all_resolvers'
12
- ].freeze
13
- private_constant :ADDRESSES
14
-
15
- def self.publish(op, gateway_multiplex)
16
- catch(:block) do
17
- op.publish('graphql.server.all_resolvers', gateway_multiplex.arguments)
18
-
19
- nil
20
- end
21
- end
22
-
23
- def self.subscribe(op, waf_context)
24
- op.subscribe(*ADDRESSES) do |*values|
25
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
26
- arguments = values[0]
27
-
28
- persistent_data = {
29
- 'graphql.server.all_resolvers' => arguments
30
- }
31
-
32
- waf_timeout = Datadog.configuration.appsec.waf_timeout
33
- result = waf_context.run(persistent_data, {}, waf_timeout)
34
-
35
- next if result.status != :match
36
-
37
- yield result
38
- throw(:block, true) unless result.actions.empty?
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- # Common patcher code for AppSec integrations
7
- # TODO: empty implementation, check with tracer shareable code
8
- module Patcher
9
- end
10
- end
11
- end
12
- end
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Rack
7
- module Reactive
8
- # Dispatch data from a Rack request to the WAF context
9
- module Request
10
- ADDRESSES = [
11
- 'request.headers',
12
- 'request.uri.raw',
13
- 'request.query',
14
- 'request.cookies',
15
- 'request.client_ip',
16
- 'server.request.method'
17
- ].freeze
18
- private_constant :ADDRESSES
19
-
20
- def self.publish(op, gateway_request)
21
- catch(:block) do
22
- op.publish('request.query', gateway_request.query)
23
- op.publish('request.headers', gateway_request.headers)
24
- op.publish('request.uri.raw', gateway_request.fullpath)
25
- op.publish('request.cookies', gateway_request.cookies)
26
- op.publish('request.client_ip', gateway_request.client_ip)
27
- op.publish('server.request.method', gateway_request.method)
28
-
29
- nil
30
- end
31
- end
32
-
33
- def self.subscribe(op, waf_context)
34
- op.subscribe(*ADDRESSES) do |*values|
35
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
36
-
37
- headers = values[0]
38
- headers_no_cookies = headers.dup.tap { |h| h.delete('cookie') }
39
- uri_raw = values[1]
40
- query = values[2]
41
- cookies = values[3]
42
- client_ip = values[4]
43
- request_method = values[5]
44
-
45
- persistent_data = {
46
- 'server.request.cookies' => cookies,
47
- 'server.request.query' => query,
48
- 'server.request.uri.raw' => uri_raw,
49
- 'server.request.headers' => headers,
50
- 'server.request.headers.no_cookies' => headers_no_cookies,
51
- 'http.client_ip' => client_ip,
52
- 'server.request.method' => request_method,
53
- }
54
-
55
- waf_timeout = Datadog.configuration.appsec.waf_timeout
56
- result = waf_context.run(persistent_data, {}, waf_timeout)
57
-
58
- next if result.status != :match
59
-
60
- yield result
61
- throw(:block, true) unless result.actions.empty?
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Rack
7
- module Reactive
8
- # Dispatch data from a Rack request to the WAF context
9
- module RequestBody
10
- ADDRESSES = [
11
- 'request.body',
12
- ].freeze
13
- private_constant :ADDRESSES
14
-
15
- def self.publish(op, gateway_request)
16
- catch(:block) do
17
- # params have been parsed from the request body
18
- op.publish('request.body', gateway_request.form_hash)
19
-
20
- nil
21
- end
22
- end
23
-
24
- def self.subscribe(op, waf_context)
25
- op.subscribe(*ADDRESSES) do |*values|
26
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
27
- body = values[0]
28
-
29
- persistent_data = {
30
- 'server.request.body' => body,
31
- }
32
-
33
- waf_timeout = Datadog.configuration.appsec.waf_timeout
34
- result = waf_context.run(persistent_data, {}, waf_timeout)
35
-
36
- next if result.status != :match
37
-
38
- yield result
39
- throw(:block, true) unless result.actions.empty?
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Rack
7
- module Reactive
8
- # Dispatch data from a Rack response to the WAF context
9
- module Response
10
- ADDRESSES = [
11
- 'response.status',
12
- 'response.headers',
13
- ].freeze
14
- private_constant :ADDRESSES
15
-
16
- def self.publish(op, gateway_response)
17
- catch(:block) do
18
- op.publish('response.status', gateway_response.status)
19
- op.publish('response.headers', gateway_response.headers)
20
-
21
- nil
22
- end
23
- end
24
-
25
- def self.subscribe(op, waf_context)
26
- op.subscribe(*ADDRESSES) do |*values|
27
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
28
-
29
- response_status = values[0]
30
- response_headers = values[1]
31
- response_headers_no_cookies = response_headers.dup.tap { |h| h.delete('set-cookie') }
32
-
33
- persistent_data = {
34
- 'server.response.status' => response_status.to_s,
35
- 'server.response.headers' => response_headers,
36
- 'server.response.headers.no_cookies' => response_headers_no_cookies,
37
- }
38
-
39
- waf_timeout = Datadog.configuration.appsec.waf_timeout
40
- result = waf_context.run(persistent_data, {}, waf_timeout)
41
-
42
- next if result.status != :match
43
-
44
- yield result
45
- throw(:block, true) unless result.actions.empty?
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../request'
4
-
5
- module Datadog
6
- module AppSec
7
- module Contrib
8
- module Rails
9
- module Reactive
10
- # Dispatch data from a Rails request to the WAF context
11
- module Action
12
- ADDRESSES = [
13
- 'rails.request.body',
14
- 'rails.request.route_params',
15
- ].freeze
16
- private_constant :ADDRESSES
17
-
18
- def self.publish(op, gateway_request)
19
- catch(:block) do
20
- # params have been parsed from the request body
21
- op.publish('rails.request.body', gateway_request.parsed_body)
22
- op.publish('rails.request.route_params', gateway_request.route_params)
23
-
24
- nil
25
- end
26
- end
27
-
28
- def self.subscribe(op, waf_context)
29
- op.subscribe(*ADDRESSES) do |*values|
30
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
31
- body = values[0]
32
- path_params = values[1]
33
-
34
- persistent_data = {
35
- 'server.request.body' => body,
36
- 'server.request.path_params' => path_params,
37
- }
38
-
39
- waf_timeout = Datadog.configuration.appsec.waf_timeout
40
- result = waf_context.run(persistent_data, {}, waf_timeout)
41
-
42
- next if result.status != :match
43
-
44
- yield result
45
- throw(:block, true) unless result.actions.empty?
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Sinatra
7
- # Sinatra integration constants
8
- module Ext
9
- ROUTE_INTERRUPT = :datadog_appsec_contrib_sinatra_route_interrupt
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Sinatra
7
- module Reactive
8
- # Dispatch data from a Sinatra request to the WAF context
9
- module Routed
10
- ADDRESSES = [
11
- 'sinatra.request.route_params',
12
- ].freeze
13
- private_constant :ADDRESSES
14
-
15
- def self.publish(op, data)
16
- _request, route_params = data
17
-
18
- catch(:block) do
19
- op.publish('sinatra.request.route_params', route_params.params)
20
-
21
- nil
22
- end
23
- end
24
-
25
- def self.subscribe(op, waf_context)
26
- op.subscribe(*ADDRESSES) do |*values|
27
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
28
- path_params = values[0]
29
-
30
- persistent_data = {
31
- 'server.request.path_params' => path_params,
32
- }
33
-
34
- waf_timeout = Datadog.configuration.appsec.waf_timeout
35
- result = waf_context.run(persistent_data, {}, waf_timeout)
36
-
37
- next if result.status != :match
38
-
39
- yield result
40
- throw(:block, true) unless result.actions.empty?
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end