datadog 2.7.1 → 2.18.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 (441) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +353 -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 +78 -102
  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 +235 -57
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +21 -5
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +376 -156
  11. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  13. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  15. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  16. data/ext/datadog_profiling_native_extension/extconf.rb +14 -8
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  18. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  19. data/ext/datadog_profiling_native_extension/heap_recorder.c +295 -532
  20. data/ext/datadog_profiling_native_extension/heap_recorder.h +6 -8
  21. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  22. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  23. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  24. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +69 -1
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -4
  26. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  27. data/ext/datadog_profiling_native_extension/ruby_helpers.c +9 -21
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
  29. data/ext/datadog_profiling_native_extension/stack_recorder.c +231 -181
  30. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  31. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  32. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  33. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  34. data/ext/libdatadog_api/crashtracker.c +17 -15
  35. data/ext/libdatadog_api/crashtracker.h +5 -0
  36. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  37. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  38. data/ext/libdatadog_api/extconf.rb +2 -2
  39. data/ext/libdatadog_api/init.c +15 -0
  40. data/ext/libdatadog_api/library_config.c +164 -0
  41. data/ext/libdatadog_api/library_config.h +25 -0
  42. data/ext/libdatadog_api/macos_development.md +3 -3
  43. data/ext/libdatadog_api/process_discovery.c +112 -0
  44. data/ext/libdatadog_api/process_discovery.h +5 -0
  45. data/ext/libdatadog_extconf_helpers.rb +2 -2
  46. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  47. data/lib/datadog/appsec/actions_handler.rb +49 -0
  48. data/lib/datadog/appsec/anonymizer.rb +16 -0
  49. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  50. data/lib/datadog/appsec/api_security/route_extractor.rb +65 -0
  51. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  52. data/lib/datadog/appsec/api_security.rb +23 -0
  53. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  54. data/lib/datadog/appsec/assets/waf_rules/recommended.json +623 -253
  55. data/lib/datadog/appsec/assets/waf_rules/strict.json +69 -107
  56. data/lib/datadog/appsec/autoload.rb +1 -1
  57. data/lib/datadog/appsec/component.rb +49 -65
  58. data/lib/datadog/appsec/compressed_json.rb +40 -0
  59. data/lib/datadog/appsec/configuration/settings.rb +212 -27
  60. data/lib/datadog/appsec/context.rb +74 -0
  61. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  62. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  63. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  64. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  65. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  66. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  67. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  68. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  69. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  70. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  71. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  72. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  73. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  74. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  75. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  76. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  77. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  78. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  79. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  80. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  81. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  82. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  83. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  84. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  87. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  88. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  89. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  91. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  92. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +73 -78
  93. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  94. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  95. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  96. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  97. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  98. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  99. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  100. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  101. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  102. data/lib/datadog/appsec/event.rb +96 -135
  103. data/lib/datadog/appsec/ext.rb +12 -3
  104. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  105. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  106. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  107. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  108. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  109. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  110. data/lib/datadog/appsec/metrics.rb +13 -0
  111. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  112. data/lib/datadog/appsec/processor/rule_loader.rb +30 -36
  113. data/lib/datadog/appsec/remote.rb +31 -57
  114. data/lib/datadog/appsec/response.rb +19 -85
  115. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  116. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  117. data/lib/datadog/appsec/security_engine/runner.rb +87 -0
  118. data/lib/datadog/appsec/security_engine.rb +9 -0
  119. data/lib/datadog/appsec/security_event.rb +39 -0
  120. data/lib/datadog/appsec/utils.rb +0 -2
  121. data/lib/datadog/appsec.rb +22 -12
  122. data/lib/datadog/auto_instrument.rb +3 -0
  123. data/lib/datadog/core/buffer/random.rb +18 -2
  124. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  125. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -18
  126. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  127. data/lib/datadog/core/configuration/components.rb +74 -32
  128. data/lib/datadog/core/configuration/components_state.rb +23 -0
  129. data/lib/datadog/core/configuration/ext.rb +5 -1
  130. data/lib/datadog/core/configuration/option.rb +81 -45
  131. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  132. data/lib/datadog/core/configuration/options.rb +3 -3
  133. data/lib/datadog/core/configuration/settings.rb +121 -50
  134. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  135. data/lib/datadog/core/configuration.rb +43 -11
  136. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  137. data/lib/datadog/core/crashtracking/component.rb +4 -13
  138. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  139. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  140. data/lib/datadog/core/encoding.rb +17 -1
  141. data/lib/datadog/core/environment/agent_info.rb +78 -0
  142. data/lib/datadog/core/environment/cgroup.rb +10 -12
  143. data/lib/datadog/core/environment/container.rb +38 -40
  144. data/lib/datadog/core/environment/ext.rb +6 -6
  145. data/lib/datadog/core/environment/git.rb +1 -0
  146. data/lib/datadog/core/environment/identity.rb +3 -3
  147. data/lib/datadog/core/environment/platform.rb +3 -3
  148. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  149. data/lib/datadog/core/error.rb +11 -9
  150. data/lib/datadog/core/logger.rb +2 -2
  151. data/lib/datadog/core/metrics/client.rb +27 -27
  152. data/lib/datadog/core/metrics/logging.rb +5 -5
  153. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  154. data/lib/datadog/core/process_discovery.rb +36 -0
  155. data/lib/datadog/core/rate_limiter.rb +4 -2
  156. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  157. data/lib/datadog/core/remote/client.rb +107 -92
  158. data/lib/datadog/core/remote/component.rb +18 -19
  159. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  160. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  161. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  162. data/lib/datadog/core/remote/negotiation.rb +9 -9
  163. data/lib/datadog/core/remote/transport/config.rb +4 -3
  164. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  165. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  166. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  167. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  168. data/lib/datadog/core/remote/transport/http.rb +25 -94
  169. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  170. data/lib/datadog/core/remote/worker.rb +10 -7
  171. data/lib/datadog/core/runtime/metrics.rb +12 -5
  172. data/lib/datadog/core/tag_builder.rb +56 -0
  173. data/lib/datadog/core/telemetry/component.rb +84 -49
  174. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  175. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  176. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  178. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  179. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  180. data/lib/datadog/core/telemetry/event/app_started.rb +269 -0
  181. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  182. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  183. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  184. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  185. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  186. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  187. data/lib/datadog/core/telemetry/event.rb +17 -383
  188. data/lib/datadog/core/telemetry/ext.rb +1 -0
  189. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  190. data/lib/datadog/core/telemetry/logger.rb +5 -4
  191. data/lib/datadog/core/telemetry/logging.rb +12 -6
  192. data/lib/datadog/core/telemetry/metric.rb +28 -6
  193. data/lib/datadog/core/telemetry/request.rb +4 -4
  194. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  195. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  196. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  197. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  198. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  199. data/lib/datadog/core/telemetry/worker.rb +128 -25
  200. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  201. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  202. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  203. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  204. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  205. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  206. data/lib/datadog/core/transport/http/env.rb +8 -0
  207. data/lib/datadog/core/transport/http.rb +75 -0
  208. data/lib/datadog/core/transport/response.rb +4 -0
  209. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  210. data/lib/datadog/core/utils/duration.rb +32 -32
  211. data/lib/datadog/core/utils/forking.rb +2 -2
  212. data/lib/datadog/core/utils/network.rb +6 -6
  213. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  214. data/lib/datadog/core/utils/time.rb +20 -0
  215. data/lib/datadog/core/utils/truncation.rb +21 -0
  216. data/lib/datadog/core/utils.rb +7 -0
  217. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  218. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  219. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  220. data/lib/datadog/core/worker.rb +1 -1
  221. data/lib/datadog/core/workers/async.rb +29 -12
  222. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  223. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  224. data/lib/datadog/core.rb +8 -0
  225. data/lib/datadog/di/base.rb +115 -0
  226. data/lib/datadog/di/boot.rb +34 -0
  227. data/lib/datadog/di/code_tracker.rb +26 -15
  228. data/lib/datadog/di/component.rb +23 -14
  229. data/lib/datadog/di/configuration/settings.rb +25 -1
  230. data/lib/datadog/di/contrib/active_record.rb +1 -0
  231. data/lib/datadog/di/contrib/railtie.rb +15 -0
  232. data/lib/datadog/di/contrib.rb +28 -0
  233. data/lib/datadog/di/error.rb +5 -0
  234. data/lib/datadog/di/instrumenter.rb +162 -21
  235. data/lib/datadog/di/logger.rb +30 -0
  236. data/lib/datadog/di/preload.rb +18 -0
  237. data/lib/datadog/di/probe.rb +14 -7
  238. data/lib/datadog/di/probe_builder.rb +1 -0
  239. data/lib/datadog/di/probe_manager.rb +11 -5
  240. data/lib/datadog/di/probe_notification_builder.rb +54 -38
  241. data/lib/datadog/di/probe_notifier_worker.rb +60 -26
  242. data/lib/datadog/di/redactor.rb +0 -1
  243. data/lib/datadog/di/remote.rb +147 -0
  244. data/lib/datadog/di/serializer.rb +19 -8
  245. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  246. data/lib/datadog/di/transport/http/api.rb +42 -0
  247. data/lib/datadog/di/transport/http/client.rb +47 -0
  248. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  249. data/lib/datadog/di/transport/http/input.rb +77 -0
  250. data/lib/datadog/di/transport/http.rb +57 -0
  251. data/lib/datadog/di/transport/input.rb +70 -0
  252. data/lib/datadog/di/utils.rb +103 -0
  253. data/lib/datadog/di.rb +14 -76
  254. data/lib/datadog/error_tracking/collector.rb +87 -0
  255. data/lib/datadog/error_tracking/component.rb +167 -0
  256. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  257. data/lib/datadog/error_tracking/configuration.rb +11 -0
  258. data/lib/datadog/error_tracking/ext.rb +18 -0
  259. data/lib/datadog/error_tracking/extensions.rb +16 -0
  260. data/lib/datadog/error_tracking/filters.rb +77 -0
  261. data/lib/datadog/error_tracking.rb +18 -0
  262. data/lib/datadog/kit/appsec/events.rb +15 -3
  263. data/lib/datadog/kit/identity.rb +9 -5
  264. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  265. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  266. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  267. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  268. data/lib/datadog/opentelemetry.rb +2 -1
  269. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  270. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
  271. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  272. data/lib/datadog/profiling/collectors/info.rb +3 -0
  273. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  274. data/lib/datadog/profiling/component.rb +64 -82
  275. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  276. data/lib/datadog/profiling/exporter.rb +3 -4
  277. data/lib/datadog/profiling/ext.rb +0 -14
  278. data/lib/datadog/profiling/flush.rb +5 -8
  279. data/lib/datadog/profiling/http_transport.rb +8 -87
  280. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  281. data/lib/datadog/profiling/profiler.rb +2 -0
  282. data/lib/datadog/profiling/scheduler.rb +10 -2
  283. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  284. data/lib/datadog/profiling/tag_builder.rb +5 -41
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +6 -2
  287. data/lib/datadog/tracing/analytics.rb +1 -1
  288. data/lib/datadog/tracing/component.rb +16 -12
  289. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  290. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  291. data/lib/datadog/tracing/context_provider.rb +1 -1
  292. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  293. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  294. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  295. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  296. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  297. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  298. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  299. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  300. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  301. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  302. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  303. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  304. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  305. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  306. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  307. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  308. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  309. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  310. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  311. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  313. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  314. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  315. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  316. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  317. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  318. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  319. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  320. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  321. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  322. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  323. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  324. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  325. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  326. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  327. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  328. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  329. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  331. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  332. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  334. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  335. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  336. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  337. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  338. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  339. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  340. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  341. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  342. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  343. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  344. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  345. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  346. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  347. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  348. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  349. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  350. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  351. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  352. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  353. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  354. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  355. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  356. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  357. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  358. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  359. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  360. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  361. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  362. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  363. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  364. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  365. data/lib/datadog/tracing/contrib/support.rb +28 -0
  366. data/lib/datadog/tracing/contrib.rb +1 -0
  367. data/lib/datadog/tracing/correlation.rb +9 -2
  368. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  369. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  370. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  371. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  372. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  373. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  374. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  375. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  376. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  377. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  378. data/lib/datadog/tracing/metadata.rb +2 -0
  379. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  380. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  381. data/lib/datadog/tracing/span.rb +22 -5
  382. data/lib/datadog/tracing/span_event.rb +124 -4
  383. data/lib/datadog/tracing/span_operation.rb +52 -16
  384. data/lib/datadog/tracing/sync_writer.rb +10 -6
  385. data/lib/datadog/tracing/trace_digest.rb +9 -2
  386. data/lib/datadog/tracing/trace_operation.rb +55 -27
  387. data/lib/datadog/tracing/trace_segment.rb +6 -4
  388. data/lib/datadog/tracing/tracer.rb +66 -14
  389. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  390. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  391. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  392. data/lib/datadog/tracing/transport/http.rb +13 -70
  393. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  394. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  395. data/lib/datadog/tracing/transport/traces.rb +47 -13
  396. data/lib/datadog/tracing/utils.rb +1 -1
  397. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  398. data/lib/datadog/tracing/workers.rb +5 -4
  399. data/lib/datadog/tracing/writer.rb +10 -6
  400. data/lib/datadog/tracing.rb +16 -3
  401. data/lib/datadog/version.rb +2 -2
  402. data/lib/datadog.rb +2 -0
  403. metadata +149 -54
  404. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  405. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  406. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  407. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  408. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  409. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  410. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  411. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  412. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  413. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  414. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  415. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  416. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  417. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  418. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  419. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  420. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  421. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  422. data/lib/datadog/appsec/processor/actions.rb +0 -49
  423. data/lib/datadog/appsec/processor/context.rb +0 -107
  424. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  425. data/lib/datadog/appsec/processor.rb +0 -106
  426. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  427. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  428. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  429. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  430. data/lib/datadog/appsec/scope.rb +0 -58
  431. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  432. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  433. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  434. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  435. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  436. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  437. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  438. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  439. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  440. data/lib/datadog/di/transport.rb +0 -81
  441. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -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
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Monitor
6
- module Reactive
7
- # Dispatch data from Datadog::Kit::Identity.set_user to the WAF context
8
- module SetUser
9
- ADDRESSES = [
10
- 'usr.id',
11
- ].freeze
12
- private_constant :ADDRESSES
13
-
14
- def self.publish(op, user)
15
- catch(:block) do
16
- op.publish('usr.id', user.id)
17
-
18
- nil
19
- end
20
- end
21
-
22
- def self.subscribe(op, waf_context)
23
- op.subscribe(*ADDRESSES) do |*values|
24
- Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
25
-
26
- user_id = values[0]
27
-
28
- persistent_data = {
29
- 'usr.id' => user_id,
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
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- class Processor
6
- # Actions store the actions information in memory
7
- # Also, takes care of merging when RC send new information
8
- module Actions
9
- class << self
10
- def actions
11
- @actions ||= []
12
- end
13
-
14
- def fetch_configuration(action)
15
- actions.find { |action_configuration| action_configuration['id'] == action }
16
- end
17
-
18
- def merge(actions_to_merge)
19
- return if actions_to_merge.empty?
20
-
21
- if actions.empty?
22
- @actions = actions_to_merge
23
- else
24
- merged_actions = []
25
- actions_dup = actions.dup
26
-
27
- actions_to_merge.each do |new_action|
28
- existing_action = actions_dup.find { |action| new_action['id'] == action['id'] }
29
-
30
- # the old action is discard and the new kept
31
- actions_dup.delete(existing_action) if existing_action
32
- merged_actions << new_action
33
- end
34
-
35
- @actions = merged_actions.concat(actions_dup)
36
- end
37
- end
38
-
39
- private
40
-
41
- # Used in tests
42
- def reset
43
- @actions = []
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- class Processor
6
- # Context manages a sequence of runs
7
- class Context
8
- LIBDDWAF_SUCCESSFUL_EXECUTION_CODES = [:ok, :match].freeze
9
-
10
- attr_reader :time_ns, :time_ext_ns, :timeouts, :events
11
-
12
- def initialize(handle, telemetry:)
13
- @context = WAF::Context.new(handle)
14
- @telemetry = telemetry
15
-
16
- @time_ns = 0.0
17
- @time_ext_ns = 0.0
18
- @timeouts = 0
19
- @events = []
20
- @run_mutex = Mutex.new
21
-
22
- @libddwaf_debug_tag = "libddwaf:#{WAF::VERSION::STRING}"
23
- end
24
-
25
- def run(persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT)
26
- @run_mutex.lock
27
-
28
- start_ns = Core::Utils::Time.get_time(:nanosecond)
29
-
30
- persistent_data.reject! do |_, v|
31
- next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
32
-
33
- v.nil? ? true : v.empty?
34
- end
35
-
36
- ephemeral_data.reject! do |_, v|
37
- next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
38
-
39
- v.nil? ? true : v.empty?
40
- end
41
-
42
- _code, result = try_run(persistent_data, ephemeral_data, timeout)
43
-
44
- stop_ns = Core::Utils::Time.get_time(:nanosecond)
45
-
46
- # these updates are not thread safe and should be protected
47
- @time_ns += result.total_runtime
48
- @time_ext_ns += (stop_ns - start_ns)
49
- @timeouts += 1 if result.timeout
50
-
51
- report_execution(result)
52
- result
53
- ensure
54
- @run_mutex.unlock
55
- end
56
-
57
- def extract_schema
58
- return unless extract_schema?
59
-
60
- input = {
61
- 'waf.context.processor' => {
62
- 'extract-schema' => true
63
- }
64
- }
65
-
66
- _code, result = try_run(input, {}, WAF::LibDDWAF::DDWAF_RUN_TIMEOUT)
67
-
68
- report_execution(result)
69
- result
70
- end
71
-
72
- def finalize
73
- @context.finalize
74
- end
75
-
76
- private
77
-
78
- def try_run(persistent_data, ephemeral_data, timeout)
79
- @context.run(persistent_data, ephemeral_data, timeout)
80
- rescue WAF::LibDDWAF::Error => e
81
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution error: #{e} backtrace: #{e.backtrace&.first(3)}" }
82
- @telemetry.report(e, description: 'libddwaf internal low-level error')
83
-
84
- [:err_internal, WAF::Result.new(:err_internal, [], 0.0, false, [], [])]
85
- end
86
-
87
- def report_execution(result)
88
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution timed out: #{result.inspect}" } if result.timeout
89
-
90
- if LIBDDWAF_SUCCESSFUL_EXECUTION_CODES.include?(result.status)
91
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution result: #{result.inspect}" }
92
- else
93
- message = "#{@libddwaf_debug_tag} execution error: #{result.status.inspect}"
94
-
95
- Datadog.logger.debug { message }
96
- @telemetry.error(message)
97
- end
98
- end
99
-
100
- def extract_schema?
101
- Datadog.configuration.appsec.api_security.enabled &&
102
- Datadog.configuration.appsec.api_security.sample_rate.sample?
103
- end
104
- end
105
- end
106
- end
107
- end
@@ -1,170 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../assets'
4
-
5
- module Datadog
6
- module AppSec
7
- class Processor
8
- # RuleMerger merge different sources of information
9
- # into the rules payload
10
- module RuleMerger
11
- # RuleVersionMismatchError
12
- class RuleVersionMismatchError < StandardError
13
- def initialize(version1, version2)
14
- msg = 'Merging rule files with different version could lead to unkown behaviour. '\
15
- "We have receieve two rule files with versions: #{version1}, #{version2}. "\
16
- 'Please validate the configuration is correct and try again.'
17
- super(msg)
18
- end
19
- end
20
-
21
- class << self
22
- # TODO: `processors` and `scanners` are not provided by the caller, consider removing them
23
- def merge(
24
- telemetry:,
25
- rules:, data: [], overrides: [], exclusions: [], custom_rules: [],
26
- processors: nil, scanners: nil
27
- )
28
- processors ||= begin
29
- default_waf_processors
30
- rescue StandardError => e
31
- Datadog.logger.error("libddwaf rulemerger failed to parse default waf processors. Error: #{e.inspect}")
32
- telemetry.report(
33
- e,
34
- description: 'libddwaf rulemerger failed to parse default waf processors'
35
- )
36
- []
37
- end
38
-
39
- scanners ||= begin
40
- default_waf_scanners
41
- rescue StandardError => e
42
- Datadog.logger.error("libddwaf rulemerger failed to parse default waf scanners. Error: #{e.inspect}")
43
- telemetry.report(
44
- e,
45
- description: 'libddwaf rulemerger failed to parse default waf scanners'
46
- )
47
- []
48
- end
49
-
50
- combined_rules = combine_rules(rules)
51
-
52
- combined_data = combine_data(data) if data.any?
53
- combined_overrides = combine_overrides(overrides) if overrides.any?
54
- combined_exclusions = combine_exclusions(exclusions) if exclusions.any?
55
- combined_custom_rules = combine_custom_rules(custom_rules) if custom_rules.any?
56
-
57
- combined_rules['rules_data'] = combined_data if combined_data
58
- combined_rules['rules_override'] = combined_overrides if combined_overrides
59
- combined_rules['exclusions'] = combined_exclusions if combined_exclusions
60
- combined_rules['custom_rules'] = combined_custom_rules if combined_custom_rules
61
- combined_rules['processors'] = processors
62
- combined_rules['scanners'] = scanners
63
- combined_rules
64
- end
65
-
66
- def default_waf_processors
67
- @default_waf_processors ||= JSON.parse(Datadog::AppSec::Assets.waf_processors)
68
- end
69
-
70
- def default_waf_scanners
71
- @default_waf_scanners ||= JSON.parse(Datadog::AppSec::Assets.waf_scanners)
72
- end
73
-
74
- private
75
-
76
- def combine_rules(rules)
77
- return rules[0].dup if rules.size == 1
78
-
79
- final_rules = []
80
- # @type var final_version: ::String
81
- final_version = (_ = nil)
82
-
83
- rules.each do |rule_file|
84
- version = rule_file['version']
85
-
86
- if version && !final_version
87
- final_version = version
88
- elsif final_version != version
89
- raise RuleVersionMismatchError.new(final_version, version)
90
- end
91
-
92
- final_rules.concat(rule_file['rules'])
93
- end
94
-
95
- {
96
- 'version' => final_version,
97
- 'rules' => final_rules
98
- }
99
- end
100
-
101
- def combine_data(data)
102
- result = []
103
-
104
- data.each do |data_entry|
105
- data_entry.each do |value|
106
- existing_data = result.find { |x| x['id'] == value['id'] }
107
-
108
- if existing_data && existing_data['type'] == value['type']
109
- # Duplicate entry base on type and id
110
- # We need to merge the existing data with the new one
111
- # and make sure to remove duplicates
112
- merged_data = merge_data_base_on_expiration(existing_data['data'], value['data'])
113
- existing_data['data'] = merged_data
114
- else
115
- result << value
116
- end
117
- end
118
- end
119
-
120
- return unless result.any?
121
-
122
- result
123
- end
124
-
125
- def merge_data_base_on_expiration(data1, data2)
126
- result = data1.each_with_object({}) do |value, acc|
127
- acc[value['value']] = value['expiration']
128
- end
129
-
130
- data2.each do |data|
131
- if result.key?(data['value'])
132
- # The value is duplicated so we need to keep
133
- # the one with the highest expiration value
134
- # We replace it if the expiration is higher than the current one
135
- # or if no experiration
136
- current_expiration = result[data['value']]
137
- new_expiration = data['expiration']
138
-
139
- if new_expiration.nil? || current_expiration && new_expiration > current_expiration
140
- result[data['value']] = new_expiration
141
- end
142
- else
143
- result[data['value']] = data['expiration']
144
- end
145
- end
146
-
147
- result.each_with_object([]) do |entry, acc|
148
- value = { 'value' => entry[0] }
149
- value['expiration'] = entry[1] if entry[1]
150
-
151
- acc << value
152
- end
153
- end
154
-
155
- def combine_overrides(overrides)
156
- overrides.flatten
157
- end
158
-
159
- def combine_exclusions(exclusions)
160
- exclusions.flatten
161
- end
162
-
163
- def combine_custom_rules(custom_rules)
164
- custom_rules.flatten
165
- end
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'processor/context'
4
-
5
- module Datadog
6
- module AppSec
7
- # Processor integrates libddwaf into datadog/appsec
8
- class Processor
9
- attr_reader :diagnostics, :addresses
10
-
11
- def initialize(ruleset:, telemetry:)
12
- @telemetry = telemetry
13
- @diagnostics = nil
14
- @addresses = []
15
-
16
- settings = Datadog.configuration.appsec
17
-
18
- # TODO: Refactor to make it easier to test
19
- unless require_libddwaf && libddwaf_provides_waf? && create_waf_handle(settings, ruleset)
20
- Datadog.logger.warn('AppSec is disabled, see logged errors above')
21
- end
22
- end
23
-
24
- def ready?
25
- !@handle.nil?
26
- end
27
-
28
- def finalize
29
- @handle.finalize
30
- end
31
-
32
- def new_context
33
- Context.new(@handle, telemetry: @telemetry)
34
- end
35
-
36
- private
37
-
38
- # libddwaf raises a LoadError on unsupported platforms; it may at some
39
- # point succeed in being required yet not provide a specific needed feature.
40
- def require_libddwaf
41
- Datadog.logger.debug { "libddwaf platform: #{libddwaf_platform}" }
42
-
43
- require 'libddwaf'
44
-
45
- true
46
- rescue LoadError => e
47
- Datadog.logger.error do
48
- 'libddwaf failed to load,' \
49
- "installed platform: #{libddwaf_platform} ruby platforms: #{ruby_platforms} error: #{e.inspect}"
50
- end
51
- @telemetry.report(e, description: 'libddwaf failed to load')
52
-
53
- false
54
- end
55
-
56
- # check whether libddwaf is required *and* able to provide the needed feature
57
- def libddwaf_provides_waf?
58
- defined?(Datadog::AppSec::WAF) ? true : false
59
- end
60
-
61
- def create_waf_handle(settings, ruleset)
62
- # TODO: this may need to be reset if the main Datadog logging level changes after initialization
63
- Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.waf_debug
64
-
65
- obfuscator_config = {
66
- key_regex: settings.obfuscator_key_regex,
67
- value_regex: settings.obfuscator_value_regex,
68
- }
69
-
70
- @handle = Datadog::AppSec::WAF::Handle.new(ruleset, obfuscator: obfuscator_config)
71
- @diagnostics = @handle.diagnostics
72
- @addresses = @handle.required_addresses
73
-
74
- true
75
- rescue WAF::LibDDWAF::Error => e
76
- Datadog.logger.error do
77
- "libddwaf failed to initialize, error: #{e.inspect}"
78
- end
79
- @telemetry.report(e, description: 'libddwaf failed to initialize')
80
-
81
- @diagnostics = e.diagnostics if e.diagnostics
82
-
83
- false
84
- rescue StandardError => e
85
- Datadog.logger.error do
86
- "libddwaf failed to initialize, error: #{e.inspect}"
87
- end
88
- @telemetry.report(e, description: 'libddwaf failed to initialize')
89
-
90
- false
91
- end
92
-
93
- def libddwaf_platform
94
- if Gem.loaded_specs['libddwaf']
95
- Gem.loaded_specs['libddwaf'].platform.to_s
96
- else
97
- 'unknown'
98
- end
99
- end
100
-
101
- def ruby_platforms
102
- Gem.platforms.map(&:to_s)
103
- end
104
- end
105
- end
106
- end