datadog 2.12.0 → 2.22.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 (570) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +348 -1
  3. data/README.md +0 -1
  4. data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  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 +10 -0
  16. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  17. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  18. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  19. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  20. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  23. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  26. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  27. data/ext/libdatadog_api/crashtracker.c +11 -12
  28. data/ext/libdatadog_api/crashtracker.h +5 -0
  29. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  30. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  31. data/ext/libdatadog_api/ddsketch.c +106 -0
  32. data/ext/libdatadog_api/extconf.rb +5 -3
  33. data/ext/libdatadog_api/init.c +18 -0
  34. data/ext/libdatadog_api/library_config.c +172 -0
  35. data/ext/libdatadog_api/library_config.h +25 -0
  36. data/ext/libdatadog_api/process_discovery.c +118 -0
  37. data/ext/libdatadog_api/process_discovery.h +5 -0
  38. data/ext/libdatadog_extconf_helpers.rb +15 -5
  39. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  40. data/lib/datadog/appsec/actions_handler.rb +24 -2
  41. data/lib/datadog/appsec/anonymizer.rb +16 -0
  42. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  43. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  44. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  45. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  46. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  47. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  48. data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
  49. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  50. data/lib/datadog/appsec/api_security.rb +23 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
  52. data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
  53. data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
  54. data/lib/datadog/appsec/autoload.rb +2 -2
  55. data/lib/datadog/appsec/component.rb +46 -71
  56. data/lib/datadog/appsec/compressed_json.rb +40 -0
  57. data/lib/datadog/appsec/configuration/settings.rb +162 -30
  58. data/lib/datadog/appsec/context.rb +30 -7
  59. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
  60. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  61. data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
  62. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  63. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  64. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  65. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  66. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  68. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +103 -0
  69. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -0
  70. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  71. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  72. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +11 -12
  74. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  75. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
  76. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -9
  77. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  79. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +53 -31
  80. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  81. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
  82. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
  83. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
  85. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  86. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  87. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
  90. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  92. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  93. data/lib/datadog/appsec/event.rb +91 -147
  94. data/lib/datadog/appsec/ext.rb +4 -2
  95. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -2
  96. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  97. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  98. data/lib/datadog/appsec/metrics/collector.rb +23 -3
  99. data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
  100. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
  101. data/lib/datadog/appsec/metrics.rb +1 -0
  102. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  103. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  104. data/lib/datadog/appsec/remote.rb +43 -59
  105. data/lib/datadog/appsec/response.rb +6 -6
  106. data/lib/datadog/appsec/security_engine/engine.rb +176 -0
  107. data/lib/datadog/appsec/security_engine/result.rb +44 -9
  108. data/lib/datadog/appsec/security_engine/runner.rb +44 -21
  109. data/lib/datadog/appsec/security_event.rb +37 -0
  110. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  111. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  112. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  113. data/lib/datadog/appsec/utils.rb +0 -2
  114. data/lib/datadog/appsec.rb +5 -15
  115. data/lib/datadog/auto_instrument_base.rb +2 -1
  116. data/lib/datadog/core/buffer/random.rb +18 -2
  117. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  118. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
  119. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  120. data/lib/datadog/core/configuration/components.rb +69 -37
  121. data/lib/datadog/core/configuration/components_state.rb +23 -0
  122. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  123. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  124. data/lib/datadog/core/configuration/ext.rb +4 -1
  125. data/lib/datadog/core/configuration/option.rb +117 -77
  126. data/lib/datadog/core/configuration/option_definition.rb +5 -14
  127. data/lib/datadog/core/configuration/options.rb +15 -13
  128. data/lib/datadog/core/configuration/settings.rb +117 -48
  129. data/lib/datadog/core/configuration/stable_config.rb +32 -0
  130. data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
  131. data/lib/datadog/core/configuration.rb +40 -16
  132. data/lib/datadog/core/crashtracking/component.rb +3 -10
  133. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  134. data/lib/datadog/core/ddsketch.rb +21 -0
  135. data/lib/datadog/core/deprecations.rb +2 -2
  136. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  137. data/lib/datadog/core/encoding.rb +1 -1
  138. data/lib/datadog/core/environment/agent_info.rb +4 -3
  139. data/lib/datadog/core/environment/cgroup.rb +10 -12
  140. data/lib/datadog/core/environment/container.rb +38 -40
  141. data/lib/datadog/core/environment/ext.rb +6 -8
  142. data/lib/datadog/core/environment/git.rb +3 -2
  143. data/lib/datadog/core/environment/identity.rb +3 -3
  144. data/lib/datadog/core/environment/platform.rb +3 -3
  145. data/lib/datadog/core/environment/variable_helpers.rb +4 -4
  146. data/lib/datadog/core/environment/yjit.rb +2 -1
  147. data/lib/datadog/core/error.rb +11 -9
  148. data/lib/datadog/core/logger.rb +2 -2
  149. data/lib/datadog/core/metrics/client.rb +29 -29
  150. data/lib/datadog/core/metrics/logging.rb +5 -5
  151. data/lib/datadog/core/pin.rb +4 -8
  152. data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
  153. data/lib/datadog/core/process_discovery.rb +61 -0
  154. data/lib/datadog/core/rate_limiter.rb +4 -2
  155. data/lib/datadog/core/remote/client.rb +44 -35
  156. data/lib/datadog/core/remote/component.rb +12 -17
  157. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  158. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  159. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  160. data/lib/datadog/core/remote/negotiation.rb +9 -9
  161. data/lib/datadog/core/remote/transport/config.rb +4 -3
  162. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  163. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  164. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  165. data/lib/datadog/core/remote/transport/http.rb +25 -89
  166. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  167. data/lib/datadog/core/runtime/ext.rb +0 -1
  168. data/lib/datadog/core/runtime/metrics.rb +12 -5
  169. data/lib/datadog/core/tag_builder.rb +56 -0
  170. data/lib/datadog/core/telemetry/component.rb +92 -52
  171. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  172. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  173. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  174. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  175. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  176. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  178. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  179. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  180. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  181. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  182. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  183. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  184. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  185. data/lib/datadog/core/telemetry/event.rb +18 -472
  186. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  187. data/lib/datadog/core/telemetry/logger.rb +5 -4
  188. data/lib/datadog/core/telemetry/logging.rb +11 -5
  189. data/lib/datadog/core/telemetry/metric.rb +8 -8
  190. data/lib/datadog/core/telemetry/request.rb +4 -4
  191. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  192. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  193. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  194. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  195. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  196. data/lib/datadog/core/telemetry/worker.rb +90 -24
  197. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  198. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  199. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  200. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  201. data/lib/datadog/core/transport/http/builder.rb +19 -17
  202. data/lib/datadog/core/transport/http/env.rb +8 -0
  203. data/lib/datadog/core/transport/http.rb +75 -0
  204. data/lib/datadog/core/transport/response.rb +4 -1
  205. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  206. data/lib/datadog/core/utils/duration.rb +32 -32
  207. data/lib/datadog/core/utils/forking.rb +2 -2
  208. data/lib/datadog/core/utils/network.rb +25 -6
  209. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  210. data/lib/datadog/core/utils/time.rb +20 -0
  211. data/lib/datadog/core/utils/truncation.rb +21 -0
  212. data/lib/datadog/core/utils.rb +7 -0
  213. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  214. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  215. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  216. data/lib/datadog/core/worker.rb +1 -1
  217. data/lib/datadog/core/workers/async.rb +29 -12
  218. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  219. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  220. data/lib/datadog/core.rb +10 -0
  221. data/lib/datadog/di/boot.rb +43 -0
  222. data/lib/datadog/di/component.rb +21 -2
  223. data/lib/datadog/di/context.rb +70 -0
  224. data/lib/datadog/di/el/compiler.rb +164 -0
  225. data/lib/datadog/di/el/evaluator.rb +159 -0
  226. data/lib/datadog/di/el/expression.rb +42 -0
  227. data/lib/datadog/di/el.rb +5 -0
  228. data/lib/datadog/di/error.rb +25 -0
  229. data/lib/datadog/di/instrumenter.rb +132 -20
  230. data/lib/datadog/di/probe.rb +35 -15
  231. data/lib/datadog/di/probe_builder.rb +39 -1
  232. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  233. data/lib/datadog/di/probe_file_loader.rb +82 -0
  234. data/lib/datadog/di/probe_manager.rb +3 -2
  235. data/lib/datadog/di/probe_notification_builder.rb +61 -67
  236. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  237. data/lib/datadog/di/remote.rb +5 -5
  238. data/lib/datadog/di/serializer.rb +160 -8
  239. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  240. data/lib/datadog/di/transport/http/api.rb +2 -12
  241. data/lib/datadog/di/transport/http/client.rb +4 -3
  242. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  243. data/lib/datadog/di/transport/http/input.rb +18 -35
  244. data/lib/datadog/di/transport/http.rb +15 -77
  245. data/lib/datadog/di/transport/input.rb +14 -5
  246. data/lib/datadog/di/utils.rb +5 -0
  247. data/lib/datadog/di.rb +0 -34
  248. data/lib/datadog/error_tracking/collector.rb +87 -0
  249. data/lib/datadog/error_tracking/component.rb +167 -0
  250. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  251. data/lib/datadog/error_tracking/configuration.rb +11 -0
  252. data/lib/datadog/error_tracking/ext.rb +18 -0
  253. data/lib/datadog/error_tracking/extensions.rb +16 -0
  254. data/lib/datadog/error_tracking/filters.rb +77 -0
  255. data/lib/datadog/error_tracking.rb +18 -0
  256. data/lib/datadog/kit/appsec/events/v2.rb +196 -0
  257. data/lib/datadog/kit/appsec/events.rb +17 -4
  258. data/lib/datadog/kit/identity.rb +22 -12
  259. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  260. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  261. data/lib/datadog/opentelemetry/api/context.rb +21 -6
  262. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  263. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  264. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  265. data/lib/datadog/opentelemetry/sdk/trace/span.rb +15 -11
  266. data/lib/datadog/opentelemetry/trace.rb +4 -4
  267. data/lib/datadog/opentelemetry.rb +2 -1
  268. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  269. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  270. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  271. data/lib/datadog/profiling/collectors/info.rb +44 -0
  272. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  273. data/lib/datadog/profiling/component.rb +8 -9
  274. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  275. data/lib/datadog/profiling/exporter.rb +12 -7
  276. data/lib/datadog/profiling/ext.rb +2 -15
  277. data/lib/datadog/profiling/flush.rb +5 -8
  278. data/lib/datadog/profiling/http_transport.rb +8 -62
  279. data/lib/datadog/profiling/profiler.rb +2 -0
  280. data/lib/datadog/profiling/scheduler.rb +10 -2
  281. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  282. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  283. data/lib/datadog/profiling/tag_builder.rb +7 -41
  284. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +13 -10
  287. data/lib/datadog/single_step_instrument.rb +9 -0
  288. data/lib/datadog/tracing/analytics.rb +1 -1
  289. data/lib/datadog/tracing/buffer.rb +7 -7
  290. data/lib/datadog/tracing/component.rb +21 -29
  291. data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
  292. data/lib/datadog/tracing/configuration/ext.rb +8 -4
  293. data/lib/datadog/tracing/configuration/settings.rb +50 -12
  294. data/lib/datadog/tracing/context.rb +2 -2
  295. data/lib/datadog/tracing/context_provider.rb +1 -1
  296. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  297. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  298. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  299. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +19 -4
  300. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  301. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  302. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  303. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  304. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  305. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  306. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  307. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  308. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  309. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  310. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  311. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  312. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  313. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  314. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  315. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  316. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  317. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  318. data/lib/datadog/tracing/contrib/active_record/integration.rb +2 -2
  319. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  320. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
  321. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  322. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  323. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  324. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  325. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  326. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  327. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  328. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  329. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +12 -2
  330. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
  331. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  332. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  333. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  334. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  335. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  336. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  337. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  338. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  339. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  340. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  341. data/lib/datadog/tracing/contrib/component.rb +2 -2
  342. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  343. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  344. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  345. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  346. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  347. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  348. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  349. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  350. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  351. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  352. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  353. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  354. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  355. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  356. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  357. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  358. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  359. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  360. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  361. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  362. data/lib/datadog/tracing/contrib/excon/middleware.rb +7 -5
  363. data/lib/datadog/tracing/contrib/ext.rb +4 -3
  364. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  365. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  366. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  367. data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -5
  368. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  369. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  370. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  371. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  372. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  373. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  374. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -48
  375. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
  376. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  377. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  378. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  379. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  380. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  381. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  382. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  383. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  384. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  385. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  386. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  387. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  388. data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
  389. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  390. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
  391. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  392. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  393. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +11 -19
  394. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  395. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  396. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  397. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  398. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  399. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  400. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  401. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  402. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  403. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  404. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  405. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  406. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  407. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  408. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  409. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  410. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  411. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  412. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  413. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  414. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  415. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  416. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
  417. data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -1
  418. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  419. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  420. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +23 -6
  421. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  422. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  423. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  424. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  425. data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
  426. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  427. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
  428. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  429. data/lib/datadog/tracing/contrib/patcher.rb +12 -11
  430. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  431. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  432. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  433. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  434. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  435. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  436. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  437. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  438. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  439. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  440. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  441. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  442. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  443. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  444. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  445. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  446. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  447. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
  448. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  449. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  450. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  451. data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
  452. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  453. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  454. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  455. data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
  456. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  457. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  458. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  459. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  460. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  461. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  462. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  463. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  464. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  465. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  466. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  467. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  468. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  469. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  470. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -6
  471. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  472. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  473. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  474. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  475. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  476. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  477. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  478. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  479. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  480. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  481. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  482. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  483. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  484. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  485. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  486. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  487. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  488. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  489. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  490. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  491. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  492. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  493. data/lib/datadog/tracing/contrib/support.rb +28 -0
  494. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  495. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  496. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  497. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  498. data/lib/datadog/tracing/contrib.rb +1 -0
  499. data/lib/datadog/tracing/correlation.rb +9 -2
  500. data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
  501. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  502. data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
  503. data/lib/datadog/tracing/distributed/baggage.rb +196 -0
  504. data/lib/datadog/tracing/distributed/datadog.rb +8 -7
  505. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  506. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  507. data/lib/datadog/tracing/distributed/none.rb +4 -2
  508. data/lib/datadog/tracing/distributed/propagation.rb +28 -4
  509. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  510. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  511. data/lib/datadog/tracing/event.rb +5 -7
  512. data/lib/datadog/tracing/flush.rb +1 -1
  513. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  514. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  515. data/lib/datadog/tracing/metadata/ext.rb +13 -0
  516. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  517. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  518. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  519. data/lib/datadog/tracing/metadata.rb +2 -0
  520. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  521. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  522. data/lib/datadog/tracing/pipeline.rb +1 -1
  523. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  524. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  525. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  526. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  527. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  528. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  529. data/lib/datadog/tracing/span.rb +11 -2
  530. data/lib/datadog/tracing/span_event.rb +11 -11
  531. data/lib/datadog/tracing/span_link.rb +12 -12
  532. data/lib/datadog/tracing/span_operation.rb +76 -26
  533. data/lib/datadog/tracing/sync_writer.rb +5 -4
  534. data/lib/datadog/tracing/trace_digest.rb +29 -24
  535. data/lib/datadog/tracing/trace_operation.rb +121 -97
  536. data/lib/datadog/tracing/trace_segment.rb +8 -6
  537. data/lib/datadog/tracing/tracer.rb +90 -43
  538. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  539. data/lib/datadog/tracing/transport/http/client.rb +6 -5
  540. data/lib/datadog/tracing/transport/http/traces.rb +15 -43
  541. data/lib/datadog/tracing/transport/http.rb +13 -75
  542. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  543. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  544. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  545. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  546. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  547. data/lib/datadog/tracing/transport/traces.rb +31 -14
  548. data/lib/datadog/tracing/utils.rb +1 -1
  549. data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
  550. data/lib/datadog/tracing/workers.rb +2 -2
  551. data/lib/datadog/tracing/writer.rb +4 -4
  552. data/lib/datadog/tracing.rb +16 -3
  553. data/lib/datadog/version.rb +1 -1
  554. data/lib/datadog.rb +8 -2
  555. metadata +115 -24
  556. data/ext/libdatadog_api/macos_development.md +0 -26
  557. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  558. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  559. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  560. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  561. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  562. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  563. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  564. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  565. data/lib/datadog/appsec/processor.rb +0 -107
  566. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  567. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  568. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  569. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  570. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../anonymizer'
4
+
5
+ module Datadog
6
+ module AppSec
7
+ module Contrib
8
+ module Devise
9
+ # Extracts user identification data from Devise resources.
10
+ # Supports both regular and anonymized data extraction modes.
11
+ class DataExtractor
12
+ PRIORITY_ORDERED_ID_KEYS = [:id, 'id', :uuid, 'uuid'].freeze
13
+ PRIORITY_ORDERED_LOGIN_KEYS = [:email, 'email', :username, 'username', :login, 'login'].freeze
14
+
15
+ def initialize(mode:)
16
+ @mode = mode
17
+ @devise_scopes = {}
18
+ end
19
+
20
+ def extract_id(object)
21
+ return if object.nil?
22
+
23
+ if object.respond_to?(:[])
24
+ id = object[PRIORITY_ORDERED_ID_KEYS.find { |key| object[key] }]
25
+ scope = find_devise_scope(object)
26
+
27
+ id = "#{scope}:#{id}" if id && scope
28
+ return transform(id)
29
+ end
30
+
31
+ id = object.id if object.respond_to?(:id)
32
+ id ||= object.uuid if object.respond_to?(:uuid)
33
+
34
+ scope = find_devise_scope(object)
35
+ id = "#{scope}:#{id}" if id && scope
36
+
37
+ transform(id)
38
+ end
39
+
40
+ def extract_login(object)
41
+ return if object.nil?
42
+
43
+ if object.respond_to?(:[])
44
+ login = object[PRIORITY_ORDERED_LOGIN_KEYS.find { |key| object[key] }]
45
+ return transform(login)
46
+ end
47
+
48
+ login = object.email if object.respond_to?(:email)
49
+ login ||= object.username if object.respond_to?(:username)
50
+ login ||= object.login if object.respond_to?(:login)
51
+
52
+ transform(login)
53
+ end
54
+
55
+ private
56
+
57
+ def find_devise_scope(object)
58
+ return if ::Devise.mappings.count == 1
59
+
60
+ @devise_scopes[object.class.name] ||= ::Devise.mappings
61
+ .each_value.find { |mapping| mapping.class_name == object.class.name }&.name
62
+ end
63
+
64
+ def transform(value)
65
+ return if value.nil?
66
+ return value.to_s unless anonymize?
67
+
68
+ Anonymizer.anonymize(value.to_s)
69
+ end
70
+
71
+ def anonymize?
72
+ @mode == AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -6,6 +6,28 @@ module Datadog
6
6
  module Devise
7
7
  # Devise integration constants
8
8
  module Ext
9
+ EVENT_LOGIN_SUCCESS = 'users.login.success'
10
+ EVENT_LOGIN_FAILURE = 'users.login.failure'
11
+ EVENT_SIGNUP = 'users.signup'
12
+
13
+ TAG_DD_USR_ID = '_dd.appsec.usr.id'
14
+ TAG_DD_USR_LOGIN = '_dd.appsec.usr.login'
15
+ TAG_DD_SIGNUP_MODE = '_dd.appsec.events.users.signup.auto.mode'
16
+ TAG_DD_COLLECTION_MODE = '_dd.appsec.user.collection_mode'
17
+ TAG_DD_LOGIN_SUCCESS_MODE = '_dd.appsec.events.users.login.success.auto.mode'
18
+ TAG_DD_LOGIN_FAILURE_MODE = '_dd.appsec.events.users.login.failure.auto.mode'
19
+
20
+ TAG_USR_ID = 'usr.id'
21
+ TAG_SESSION_ID = 'usr.session_id'
22
+ TAG_SIGNUP_TRACK = 'appsec.events.users.signup.track'
23
+ TAG_SIGNUP_USR_ID = 'appsec.events.users.signup.usr.id'
24
+ TAG_SIGNUP_USR_LOGIN = 'appsec.events.users.signup.usr.login'
25
+ TAG_LOGIN_FAILURE_TRACK = 'appsec.events.users.login.failure.track'
26
+ TAG_LOGIN_FAILURE_USR_ID = 'appsec.events.users.login.failure.usr.id'
27
+ TAG_LOGIN_FAILURE_USR_LOGIN = 'appsec.events.users.login.failure.usr.login'
28
+ TAG_LOGIN_FAILURE_USR_EXISTS = 'appsec.events.users.login.failure.usr.exists'
29
+ TAG_LOGIN_SUCCESS_TRACK = 'appsec.events.users.login.success.track'
30
+ TAG_LOGIN_SUCCESS_USR_LOGIN = 'appsec.events.users.login.success.usr.login'
9
31
  end
10
32
  end
11
33
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../integration'
4
-
5
4
  require_relative 'patcher'
6
5
 
7
6
  module Datadog
@@ -17,7 +16,7 @@ module Datadog
17
16
  register_as :devise, auto_patch: true
18
17
 
19
18
  def self.version
20
- Gem.loaded_specs['devise'] && Gem.loaded_specs['devise'].version
19
+ Gem.loaded_specs['devise']&.version
21
20
  end
22
21
 
23
22
  def self.loaded?
@@ -1,15 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'patcher/authenticatable_patch'
4
- require_relative 'patcher/rememberable_patch'
5
- require_relative 'patcher/registration_controller_patch'
3
+ require_relative '../../../core/utils/only_once'
4
+
5
+ require_relative 'tracking_middleware'
6
+ require_relative 'patches/signup_tracking_patch'
7
+ require_relative 'patches/signin_tracking_patch'
8
+ require_relative 'patches/skip_signin_tracking_patch'
6
9
 
7
10
  module Datadog
8
11
  module AppSec
9
12
  module Contrib
10
13
  module Devise
11
- # Patcher for AppSec on Devise
14
+ # Devise patcher
12
15
  module Patcher
16
+ GUARD_ONCE_PER_APP = Hash.new do |hash, key|
17
+ hash[key] = Datadog::Core::Utils::OnlyOnce.new
18
+ end
19
+
13
20
  module_function
14
21
 
15
22
  def patched?
@@ -21,29 +28,33 @@ module Datadog
21
28
  end
22
29
 
23
30
  def patch
24
- patch_authenticatable_strategy
25
- patch_rememberable_strategy
26
- patch_registration_controller
27
-
28
- Patcher.instance_variable_set(:@patched, true)
29
- end
30
-
31
- def patch_authenticatable_strategy
32
- ::Devise::Strategies::Authenticatable.prepend(AuthenticatablePatch)
33
- end
31
+ ::ActiveSupport.on_load(:before_initialize) do |app|
32
+ GUARD_ONCE_PER_APP[app].run do
33
+ app.middleware.insert_after(Warden::Manager, TrackingMiddleware)
34
+ rescue RuntimeError
35
+ AppSec.telemetry.error('AppSec: unable to insert Devise TrackingMiddleware')
36
+ end
37
+ end
34
38
 
35
- def patch_rememberable_strategy
36
- return unless ::Devise::STRATEGIES.include?(:rememberable)
39
+ ::ActiveSupport.on_load(:after_initialize) do
40
+ if ::Devise::RegistrationsController.descendants.empty?
41
+ ::Devise::RegistrationsController.prepend(Patches::SignupTrackingPatch)
42
+ else
43
+ ::Devise::RegistrationsController.descendants.each do |controller|
44
+ controller.prepend(Patches::SignupTrackingPatch)
45
+ end
46
+ end
47
+ end
37
48
 
38
- # Rememberable strategy is required in autoloaded Rememberable model
39
- ::Devise::Models::Rememberable # rubocop:disable Lint/Void
40
- ::Devise::Strategies::Rememberable.prepend(RememberablePatch)
41
- end
49
+ ::Devise::Strategies::Authenticatable.prepend(Patches::SigninTrackingPatch)
42
50
 
43
- def patch_registration_controller
44
- ::ActiveSupport.on_load(:after_initialize) do
45
- ::Devise::RegistrationsController.prepend(RegistrationControllerPatch)
51
+ if ::Devise::STRATEGIES.include?(:rememberable)
52
+ # Rememberable strategy is required in autoloaded Rememberable model
53
+ require 'devise/models/rememberable'
54
+ ::Devise::Strategies::Rememberable.prepend(Patches::SkipSigninTrackingPatch)
46
55
  end
56
+
57
+ Patcher.instance_variable_set(:@patched, true)
47
58
  end
48
59
  end
49
60
  end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../ext'
4
+ require_relative '../configuration'
5
+ require_relative '../data_extractor'
6
+ require_relative '../../../trace_keeper'
7
+
8
+ module Datadog
9
+ module AppSec
10
+ module Contrib
11
+ module Devise
12
+ module Patches
13
+ # A patch for Devise::Authenticatable strategy with tracking functionality
14
+ module SigninTrackingPatch
15
+ def validate(resource, &block)
16
+ result = super
17
+
18
+ return result unless AppSec.enabled?
19
+ return result if @_datadog_appsec_skip_track_login_event
20
+ return result unless Configuration.auto_user_instrumentation_enabled?
21
+ return result unless AppSec.active_context
22
+
23
+ context = AppSec.active_context
24
+ if context.trace.nil? || context.span.nil?
25
+ Datadog.logger.debug { 'AppSec: unable to track signin events, due to missing trace or span' }
26
+ return result
27
+ end
28
+
29
+ TraceKeeper.keep!(context.trace)
30
+
31
+ if result
32
+ record_successful_signin(context, resource)
33
+ Instrumentation.gateway.push('appsec.events.user_lifecycle', Ext::EVENT_LOGIN_SUCCESS)
34
+
35
+ return result
36
+ end
37
+
38
+ record_failed_signin(context, resource)
39
+ Instrumentation.gateway.push('appsec.events.user_lifecycle', Ext::EVENT_LOGIN_FAILURE)
40
+
41
+ result
42
+ end
43
+
44
+ private
45
+
46
+ def record_successful_signin(context, resource)
47
+ extractor = DataExtractor.new(mode: Configuration.auto_user_instrumentation_mode)
48
+
49
+ id = extractor.extract_id(resource)
50
+ login = extractor.extract_login(authentication_hash) || extractor.extract_login(resource)
51
+
52
+ if id
53
+ context.span[Ext::TAG_USR_ID] ||= id
54
+ context.span[Ext::TAG_DD_USR_ID] = id
55
+ end
56
+
57
+ context.span[Ext::TAG_LOGIN_SUCCESS_USR_LOGIN] ||= login
58
+ context.span[Ext::TAG_LOGIN_SUCCESS_TRACK] = 'true'
59
+ context.span[Ext::TAG_DD_USR_LOGIN] = login
60
+ context.span[Ext::TAG_DD_LOGIN_SUCCESS_MODE] = Configuration.auto_user_instrumentation_mode
61
+
62
+ # NOTE: We don't have a way to make one-shot receivers for events,
63
+ # and because of that we will trigger an additional event even
64
+ # if it was already done via the SDK
65
+ AppSec::Instrumentation.gateway.push(
66
+ 'identity.set_user', AppSec::Instrumentation::Gateway::User.new(id, login)
67
+ )
68
+ end
69
+
70
+ def record_failed_signin(context, resource)
71
+ extractor = DataExtractor.new(mode: Configuration.auto_user_instrumentation_mode)
72
+
73
+ context.span[Ext::TAG_LOGIN_FAILURE_TRACK] = 'true'
74
+ context.span[Ext::TAG_DD_LOGIN_FAILURE_MODE] = Configuration.auto_user_instrumentation_mode
75
+
76
+ unless resource
77
+ login = extractor.extract_login(authentication_hash)
78
+
79
+ context.span[Ext::TAG_DD_USR_LOGIN] = login
80
+ context.span[Ext::TAG_LOGIN_FAILURE_USR_LOGIN] ||= login
81
+ context.span[Ext::TAG_LOGIN_FAILURE_USR_EXISTS] ||= 'false'
82
+
83
+ return
84
+ end
85
+
86
+ id = extractor.extract_id(resource)
87
+ login = extractor.extract_login(authentication_hash) || extractor.extract_login(resource)
88
+
89
+ if id
90
+ context.span[Ext::TAG_DD_USR_ID] = id
91
+ context.span[Ext::TAG_LOGIN_FAILURE_USR_ID] ||= id
92
+ end
93
+
94
+ context.span[Ext::TAG_DD_USR_LOGIN] = login
95
+ context.span[Ext::TAG_LOGIN_FAILURE_USR_LOGIN] ||= login
96
+ context.span[Ext::TAG_LOGIN_FAILURE_USR_EXISTS] ||= 'true'
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../ext'
4
+ require_relative '../configuration'
5
+ require_relative '../data_extractor'
6
+ require_relative '../../../trace_keeper'
7
+
8
+ module Datadog
9
+ module AppSec
10
+ module Contrib
11
+ module Devise
12
+ module Patches
13
+ # A patch for Devise::RegistrationsController with tracking functionality
14
+ module SignupTrackingPatch
15
+ def create
16
+ return super unless AppSec.enabled?
17
+ return super unless Configuration.auto_user_instrumentation_enabled?
18
+ return super unless AppSec.active_context
19
+
20
+ super do |resource|
21
+ context = AppSec.active_context
22
+
23
+ if context.trace.nil? || context.span.nil?
24
+ Datadog.logger.debug { 'AppSec: unable to track signup events, due to missing trace or span' }
25
+ next yield(resource) if block_given?
26
+ end
27
+
28
+ next yield(resource) if resource.new_record? && block_given?
29
+
30
+ TraceKeeper.keep!(context.trace)
31
+ record_successful_signup(context, resource)
32
+ Instrumentation.gateway.push('appsec.events.user_lifecycle', Ext::EVENT_SIGNUP)
33
+
34
+ yield(resource) if block_given?
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def record_successful_signup(context, resource)
41
+ extractor = DataExtractor.new(mode: Configuration.auto_user_instrumentation_mode)
42
+
43
+ id = extractor.extract_id(resource)
44
+ login = extractor.extract_login(resource_params) || extractor.extract_login(resource)
45
+
46
+ context.span[Ext::TAG_SIGNUP_TRACK] = 'true'
47
+ context.span[Ext::TAG_DD_USR_LOGIN] = login
48
+ context.span[Ext::TAG_SIGNUP_USR_LOGIN] ||= login
49
+ context.span[Ext::TAG_DD_SIGNUP_MODE] = Configuration.auto_user_instrumentation_mode
50
+
51
+ if id
52
+ context.span[Ext::TAG_DD_USR_ID] = id
53
+
54
+ id_tag = resource.active_for_authentication? ? Ext::TAG_USR_ID : Ext::TAG_SIGNUP_USR_ID
55
+ context.span[id_tag] ||= id
56
+ end
57
+
58
+ # NOTE: We don't have a way to make one-shot receivers for events,
59
+ # and because of that we will trigger an additional event even
60
+ # if it was already done via the SDK
61
+ AppSec::Instrumentation.gateway.push(
62
+ 'identity.set_user', AppSec::Instrumentation::Gateway::User.new(id, login)
63
+ )
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -4,10 +4,10 @@ module Datadog
4
4
  module AppSec
5
5
  module Contrib
6
6
  module Devise
7
- module Patcher
7
+ module Patches
8
8
  # To avoid tracking new sessions that are created by
9
9
  # Rememberable strategy as Login Success events.
10
- module RememberablePatch
10
+ module SkipSigninTrackingPatch
11
11
  def validate(*args)
12
12
  @_datadog_appsec_skip_track_login_event = true
13
13
 
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ext'
4
+ require_relative '../../anonymizer'
5
+
6
+ module Datadog
7
+ module AppSec
8
+ module Contrib
9
+ module Devise
10
+ # A Rack middleware capable of tracking currently signed user
11
+ class TrackingMiddleware
12
+ WARDEN_KEY = 'warden'
13
+ SESSION_ID_KEY = 'session_id'
14
+
15
+ def initialize(app)
16
+ @app = app
17
+ @devise_session_scope_keys = {}
18
+ end
19
+
20
+ def call(env)
21
+ return @app.call(env) unless AppSec.enabled?
22
+ return @app.call(env) unless Configuration.auto_user_instrumentation_enabled?
23
+ return @app.call(env) unless AppSec.active_context
24
+
25
+ unless env.key?(WARDEN_KEY)
26
+ Datadog.logger.debug { 'AppSec: unable to track requests, due to missing warden manager' }
27
+ return @app.call(env)
28
+ end
29
+
30
+ context = AppSec.active_context
31
+ if context.trace.nil? || context.span.nil?
32
+ Datadog.logger.debug { 'AppSec: unable to track requests, due to missing trace or span' }
33
+ return @app.call(env)
34
+ end
35
+
36
+ # NOTE: Rails session id will be set for unauthenticated users as well,
37
+ # so we need to make sure we are tracking only authenticated users.
38
+ id = transform(extract_id(env[WARDEN_KEY]))
39
+ session_id = env[WARDEN_KEY].raw_session[SESSION_ID_KEY] if id
40
+
41
+ if id
42
+ # NOTE: There is no option to set session id without setting user id via SDK.
43
+ unless context.span.has_tag?(Ext::TAG_USR_ID) && context.span.has_tag?(Ext::TAG_SESSION_ID)
44
+ user_id = context.span[Ext::TAG_USR_ID] || id
45
+ user_session_id = context.span[Ext::TAG_SESSION_ID] || session_id
46
+
47
+ # FIXME: The current implementation of event arguments is forsing us
48
+ # to bloat User class, and pass nil-value instead of skip
49
+ # passing them at first place.
50
+ # This is a temporary situation until we refactor events model.
51
+ AppSec::Instrumentation.gateway.push(
52
+ 'identity.set_user', AppSec::Instrumentation::Gateway::User.new(user_id, nil, user_session_id)
53
+ )
54
+ end
55
+
56
+ context.span[Ext::TAG_USR_ID] ||= id
57
+ context.span[Ext::TAG_DD_USR_ID] = id
58
+ context.span[Ext::TAG_DD_COLLECTION_MODE] ||= Configuration.auto_user_instrumentation_mode
59
+ end
60
+
61
+ @app.call(env)
62
+ end
63
+
64
+ private
65
+
66
+ def extract_id(warden)
67
+ session_serializer = warden.session_serializer
68
+
69
+ key = session_key_for(session_serializer, ::Devise.default_scope)
70
+ id = session_serializer.session[key]&.dig(0, 0)
71
+
72
+ return id if ::Devise.mappings.size == 1
73
+ return "#{::Devise.default_scope}:#{id}" if id
74
+
75
+ ::Devise.mappings.each_key do |scope|
76
+ next if scope == ::Devise.default_scope
77
+
78
+ key = session_key_for(session_serializer, scope)
79
+ id = session_serializer.session[key]&.dig(0, 0)
80
+
81
+ return "#{scope}:#{id}" if id
82
+ end
83
+
84
+ nil
85
+ end
86
+
87
+ def session_key_for(session_serializer, scope)
88
+ @devise_session_scope_keys[scope] ||= session_serializer.key_for(scope)
89
+ end
90
+
91
+ def transform(value)
92
+ return if value.nil?
93
+ return value.to_s unless anonymize?
94
+
95
+ Anonymizer.anonymize(value.to_s)
96
+ end
97
+
98
+ def anonymize?
99
+ Configuration.auto_user_instrumentation_mode ==
100
+ AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -16,7 +16,7 @@ module Datadog
16
16
  register_as :excon
17
17
 
18
18
  def self.version
19
- Gem.loaded_specs['excon'] && Gem.loaded_specs['excon'].version
19
+ Gem.loaded_specs['excon']&.version
20
20
  end
21
21
 
22
22
  def self.loaded?
@@ -1,8 +1,11 @@
1
- # rubocop:disable Naming/FileName
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'excon'
5
4
 
5
+ require_relative '../../event'
6
+ require_relative '../../trace_keeper'
7
+ require_relative '../../security_event'
8
+
6
9
  module Datadog
7
10
  module AppSec
8
11
  module Contrib
@@ -15,22 +18,19 @@ module Datadog
15
18
  context = AppSec.active_context
16
19
 
17
20
  request_url = URI.join("#{data[:scheme]}://#{data[:host]}", data[:path]).to_s
18
- ephemeral_data = { 'server.io.net.url' => request_url }
21
+ ephemeral_data = {'server.io.net.url' => request_url}
19
22
 
20
23
  result = context.run_rasp(Ext::RASP_SSRF, {}, ephemeral_data, Datadog.configuration.appsec.waf_timeout)
21
24
 
22
25
  if result.match?
23
- Datadog::AppSec::Event.tag_and_keep!(context, result)
26
+ AppSec::Event.tag(context, result)
27
+ TraceKeeper.keep!(context.trace) if result.keep?
24
28
 
25
- context.events << {
26
- waf_result: result,
27
- trace: context.trace,
28
- span: context.span,
29
- request_url: request_url,
30
- actions: result.actions
31
- }
29
+ context.events.push(
30
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
31
+ )
32
32
 
33
- ActionsHandler.handle(result.actions)
33
+ AppSec::ActionsHandler.handle(result.actions)
34
34
  end
35
35
 
36
36
  super
@@ -40,4 +40,3 @@ module Datadog
40
40
  end
41
41
  end
42
42
  end
43
- # rubocop:enable Naming/FileName
@@ -17,7 +17,7 @@ module Datadog
17
17
  register_as :faraday, auto_patch: true
18
18
 
19
19
  def self.version
20
- Gem.loaded_specs['faraday'] && Gem.loaded_specs['faraday'].version
20
+ Gem.loaded_specs['faraday']&.version
21
21
  end
22
22
 
23
23
  def self.loaded?
@@ -1,6 +1,9 @@
1
- # rubocop:disable Naming/FileName
2
1
  # frozen_string_literal: true
3
2
 
3
+ require_relative '../../event'
4
+ require_relative '../../trace_keeper'
5
+ require_relative '../../security_event'
6
+
4
7
  module Datadog
5
8
  module AppSec
6
9
  module Contrib
@@ -19,17 +22,14 @@ module Datadog
19
22
  result = context.run_rasp(Ext::RASP_SSRF, {}, ephemeral_data, Datadog.configuration.appsec.waf_timeout)
20
23
 
21
24
  if result.match?
22
- Datadog::AppSec::Event.tag_and_keep!(context, result)
25
+ AppSec::Event.tag(context, result)
26
+ TraceKeeper.keep!(context.trace) if result.keep?
23
27
 
24
- context.events << {
25
- waf_result: result,
26
- trace: context.trace,
27
- span: context.span,
28
- request_url: request_env.url,
29
- actions: result.actions
30
- }
28
+ context.events.push(
29
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
30
+ )
31
31
 
32
- ActionsHandler.handle(result.actions)
32
+ AppSec::ActionsHandler.handle(result.actions)
33
33
  end
34
34
 
35
35
  @app.call(request_env)
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
+
5
+ require_relative '../../../event'
6
+ require_relative '../../../trace_keeper'
7
+ require_relative '../../../security_event'
4
8
  require_relative '../../../instrumentation/gateway'
5
9
 
6
10
  module Datadog
@@ -29,17 +33,14 @@ module Datadog
29
33
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
30
34
 
31
35
  if result.match?
32
- Datadog::AppSec::Event.tag_and_keep!(context, result)
36
+ AppSec::Event.tag(context, result)
37
+ TraceKeeper.keep!(context.trace) if result.keep?
33
38
 
34
- context.events << {
35
- waf_result: result,
36
- trace: context.trace,
37
- span: context.span,
38
- multiplex: gateway_multiplex,
39
- actions: result.actions
40
- }
39
+ context.events.push(
40
+ AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
41
+ )
41
42
 
42
- Datadog::AppSec::ActionsHandler.handle(result.actions)
43
+ AppSec::ActionsHandler.handle(result.actions)
43
44
  end
44
45
  end
45
46
 
@@ -23,7 +23,7 @@ module Datadog
23
23
  register_as :graphql, auto_patch: false
24
24
 
25
25
  def self.version
26
- Gem.loaded_specs['graphql'] && Gem.loaded_specs['graphql'].version
26
+ Gem.loaded_specs['graphql']&.version
27
27
  end
28
28
 
29
29
  def self.loaded?