ddtrace 1.12.1 → 1.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 (448) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +388 -10
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +292 -27
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +40 -10
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +48 -16
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -1
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +136 -32
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +12 -0
  22. data/ext/ddtrace_profiling_native_extension/profiling.c +1 -2
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +81 -50
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  25. data/ext/ddtrace_profiling_native_extension/time_helpers.c +40 -4
  26. data/ext/ddtrace_profiling_native_extension/time_helpers.h +14 -0
  27. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  28. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  29. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  30. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  31. data/lib/datadog/appsec/assets.rb +8 -0
  32. data/lib/datadog/appsec/component.rb +21 -2
  33. data/lib/datadog/appsec/configuration/settings.rb +167 -189
  34. data/lib/datadog/appsec/configuration.rb +0 -79
  35. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
  36. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  37. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  38. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  39. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  40. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  41. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  42. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  43. data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
  44. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  46. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  47. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
  48. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
  49. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
  50. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  51. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +36 -17
  52. data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
  53. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
  54. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  55. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
  56. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
  57. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  58. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
  59. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  60. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  61. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
  62. data/lib/datadog/appsec/event.rb +106 -50
  63. data/lib/datadog/appsec/extensions.rb +1 -130
  64. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  65. data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
  66. data/lib/datadog/appsec/processor/actions.rb +49 -0
  67. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  68. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  69. data/lib/datadog/appsec/processor.rb +35 -7
  70. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  71. data/lib/datadog/appsec/remote.rb +17 -11
  72. data/lib/datadog/appsec/response.rb +82 -4
  73. data/lib/datadog/appsec/sample_rate.rb +21 -0
  74. data/lib/datadog/appsec.rb +3 -4
  75. data/lib/datadog/core/backport.rb +51 -0
  76. data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
  77. data/lib/datadog/core/configuration/base.rb +6 -16
  78. data/lib/datadog/core/configuration/components.rb +15 -3
  79. data/lib/datadog/core/configuration/ext.rb +28 -5
  80. data/lib/datadog/core/configuration/option.rb +269 -21
  81. data/lib/datadog/core/configuration/option_definition.rb +73 -32
  82. data/lib/datadog/core/configuration/options.rb +27 -15
  83. data/lib/datadog/core/configuration/settings.rb +182 -102
  84. data/lib/datadog/core/configuration.rb +4 -0
  85. data/lib/datadog/core/diagnostics/environment_logger.rb +130 -234
  86. data/lib/datadog/core/environment/execution.rb +103 -0
  87. data/lib/datadog/core/environment/ext.rb +13 -11
  88. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  89. data/lib/datadog/core/environment/yjit.rb +58 -0
  90. data/lib/datadog/core/error.rb +1 -0
  91. data/lib/datadog/core/git/ext.rb +26 -22
  92. data/lib/datadog/core/logging/ext.rb +3 -1
  93. data/lib/datadog/core/metrics/ext.rb +7 -5
  94. data/lib/datadog/core/remote/client/capabilities.rb +6 -1
  95. data/lib/datadog/core/remote/client.rb +3 -0
  96. data/lib/datadog/core/remote/component.rb +27 -36
  97. data/lib/datadog/core/remote/configuration/content.rb +28 -1
  98. data/lib/datadog/core/remote/configuration/repository.rb +3 -1
  99. data/lib/datadog/core/remote/ext.rb +1 -1
  100. data/lib/datadog/core/remote/negotiation.rb +19 -6
  101. data/lib/datadog/core/remote/transport/config.rb +60 -0
  102. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  103. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  104. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  105. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  106. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  107. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  108. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  109. data/lib/datadog/core/remote/transport/http.rb +179 -0
  110. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  111. data/lib/datadog/core/remote/worker.rb +4 -1
  112. data/lib/datadog/core/runtime/ext.rb +22 -12
  113. data/lib/datadog/core/runtime/metrics.rb +43 -0
  114. data/lib/datadog/core/telemetry/client.rb +12 -2
  115. data/lib/datadog/core/telemetry/collector.rb +13 -4
  116. data/lib/datadog/core/telemetry/emitter.rb +4 -2
  117. data/lib/datadog/core/telemetry/event.rb +19 -4
  118. data/lib/datadog/core/telemetry/ext.rb +4 -1
  119. data/lib/datadog/core/telemetry/heartbeat.rb +2 -4
  120. data/lib/datadog/core/telemetry/http/ext.rb +10 -8
  121. data/lib/datadog/core/telemetry/http/transport.rb +2 -0
  122. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
  123. data/lib/datadog/core/telemetry/v2/request.rb +29 -0
  124. data/lib/datadog/core/transport/ext.rb +47 -0
  125. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  126. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  127. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  128. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  129. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  130. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  131. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  132. data/lib/datadog/core/transport/http/env.rb +62 -0
  133. data/lib/datadog/core/transport/http/response.rb +60 -0
  134. data/lib/datadog/core/transport/parcel.rb +22 -0
  135. data/lib/datadog/core/transport/request.rb +17 -0
  136. data/lib/datadog/core/transport/response.rb +64 -0
  137. data/lib/datadog/core/utils/duration.rb +52 -0
  138. data/lib/datadog/core/utils/hash.rb +47 -0
  139. data/lib/datadog/core/utils/network.rb +1 -1
  140. data/lib/datadog/core/utils/safe_dup.rb +27 -20
  141. data/lib/datadog/core/utils.rb +1 -1
  142. data/lib/datadog/core/workers/async.rb +3 -2
  143. data/lib/datadog/core/workers/polling.rb +2 -2
  144. data/lib/datadog/kit/appsec/events.rb +139 -89
  145. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  146. data/lib/datadog/kit/identity.rb +80 -65
  147. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  148. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  149. data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
  150. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  151. data/lib/datadog/opentelemetry/trace.rb +58 -0
  152. data/lib/datadog/opentelemetry.rb +1 -0
  153. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  154. data/lib/datadog/opentracer.rb +9 -0
  155. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -17
  156. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
  157. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  158. data/lib/datadog/profiling/component.rb +69 -94
  159. data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
  160. data/lib/datadog/profiling/exporter.rb +5 -1
  161. data/lib/datadog/profiling/ext.rb +0 -12
  162. data/lib/datadog/profiling/flush.rb +7 -5
  163. data/lib/datadog/profiling/http_transport.rb +19 -6
  164. data/lib/datadog/profiling/load_native_extension.rb +7 -1
  165. data/lib/datadog/profiling/native_extension.rb +0 -21
  166. data/lib/datadog/profiling/profiler.rb +36 -13
  167. data/lib/datadog/profiling/scheduler.rb +16 -9
  168. data/lib/datadog/profiling.rb +16 -78
  169. data/lib/datadog/tracing/component.rb +70 -11
  170. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  171. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  172. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  173. data/lib/datadog/tracing/configuration/ext.rb +40 -32
  174. data/lib/datadog/tracing/configuration/http.rb +74 -0
  175. data/lib/datadog/tracing/configuration/settings.rb +134 -98
  176. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +9 -6
  177. data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -18
  178. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +9 -6
  179. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -18
  180. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +9 -7
  181. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -8
  182. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -6
  183. data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -10
  184. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +13 -7
  185. data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -23
  186. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
  187. data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
  188. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +9 -6
  189. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -10
  190. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -11
  191. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +9 -7
  192. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
  193. data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -15
  194. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  195. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
  196. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  197. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -7
  198. data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -16
  199. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +14 -7
  200. data/lib/datadog/tracing/contrib/aws/ext.rb +37 -24
  201. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
  202. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
  203. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  204. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
  205. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  206. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  207. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  208. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  209. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  210. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +20 -7
  211. data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -11
  212. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
  213. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +13 -7
  214. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -14
  215. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +14 -7
  216. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -15
  217. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
  218. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +16 -9
  219. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
  220. data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
  221. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
  222. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +19 -10
  223. data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
  224. data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
  225. data/lib/datadog/tracing/contrib/ext.rb +26 -1
  226. data/lib/datadog/tracing/contrib/extensions.rb +32 -0
  227. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +20 -10
  228. data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
  229. data/lib/datadog/tracing/contrib/faraday/middleware.rb +21 -5
  230. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +8 -6
  231. data/lib/datadog/tracing/contrib/grape/ext.rb +16 -14
  232. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +8 -6
  233. data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -5
  234. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +39 -9
  235. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
  236. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
  237. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  238. data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -13
  239. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  240. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
  241. data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
  242. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
  243. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +33 -11
  244. data/lib/datadog/tracing/contrib/http/ext.rb +16 -9
  245. data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
  246. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +33 -11
  247. data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -9
  248. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
  249. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +33 -11
  250. data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -9
  251. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
  252. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +9 -6
  253. data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
  254. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
  255. data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
  256. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
  257. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +14 -7
  258. data/lib/datadog/tracing/contrib/mongodb/ext.rb +20 -16
  259. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
  260. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -14
  261. data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -10
  262. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -6
  263. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +52 -0
  264. data/lib/datadog/tracing/contrib/opensearch/ext.rb +37 -0
  265. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  266. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  267. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  268. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +22 -14
  269. data/lib/datadog/tracing/contrib/pg/ext.rb +22 -19
  270. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -5
  271. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +14 -7
  272. data/lib/datadog/tracing/contrib/presto/ext.rb +25 -20
  273. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
  274. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
  275. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  276. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +12 -8
  277. data/lib/datadog/tracing/contrib/qless/ext.rb +14 -12
  278. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -12
  279. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -7
  280. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
  281. data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
  282. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -12
  283. data/lib/datadog/tracing/contrib/rack/ext.rb +18 -16
  284. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
  285. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  286. data/lib/datadog/tracing/contrib/rack/middlewares.rb +8 -49
  287. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +19 -15
  288. data/lib/datadog/tracing/contrib/rails/ext.rb +7 -5
  289. data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
  290. data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
  291. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  292. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +13 -10
  293. data/lib/datadog/tracing/contrib/rake/ext.rb +14 -12
  294. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +17 -9
  295. data/lib/datadog/tracing/contrib/redis/ext.rb +22 -15
  296. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  297. data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
  298. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  299. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +13 -7
  300. data/lib/datadog/tracing/contrib/resque/ext.rb +9 -7
  301. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +16 -9
  302. data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
  303. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
  304. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +9 -6
  305. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
  306. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
  307. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
  308. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +9 -6
  309. data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -8
  310. data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
  311. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +14 -8
  312. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
  313. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +18 -11
  314. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -30
  315. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -9
  316. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
  317. data/lib/datadog/tracing/contrib/sinatra/ext.rb +21 -19
  318. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
  319. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -8
  320. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -0
  321. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  322. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
  323. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +9 -6
  324. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +9 -6
  325. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -13
  326. data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
  327. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
  328. data/lib/datadog/tracing/contrib.rb +1 -0
  329. data/lib/datadog/tracing/correlation.rb +29 -12
  330. data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
  331. data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
  332. data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
  333. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  334. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  335. data/lib/datadog/tracing/distributed/propagation.rb +35 -34
  336. data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
  337. data/lib/datadog/tracing/metadata/ext.rb +9 -6
  338. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  339. data/lib/datadog/tracing/remote.rb +78 -0
  340. data/lib/datadog/tracing/sampling/rule_sampler.rb +29 -0
  341. data/lib/datadog/tracing/span_operation.rb +3 -15
  342. data/lib/datadog/tracing/sync_writer.rb +3 -3
  343. data/lib/datadog/tracing/trace_digest.rb +31 -0
  344. data/lib/datadog/tracing/trace_operation.rb +16 -3
  345. data/lib/datadog/tracing/trace_segment.rb +5 -2
  346. data/lib/datadog/tracing/tracer.rb +12 -1
  347. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  348. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  349. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  350. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  351. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  352. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  353. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  354. data/lib/datadog/tracing/transport/http.rb +124 -0
  355. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  356. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  357. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  358. data/lib/datadog/tracing/transport/io.rb +30 -0
  359. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  360. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  361. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  362. data/lib/datadog/tracing/transport/traces.rb +224 -0
  363. data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
  364. data/lib/datadog/tracing/workers.rb +4 -2
  365. data/lib/datadog/tracing/writer.rb +5 -2
  366. data/lib/ddtrace/transport/ext.rb +22 -14
  367. data/lib/ddtrace/version.rb +9 -12
  368. data/lib/ddtrace.rb +1 -1
  369. metadata +101 -93
  370. data/lib/datadog/ci/configuration/components.rb +0 -32
  371. data/lib/datadog/ci/configuration/settings.rb +0 -53
  372. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
  373. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
  374. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  375. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  376. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  377. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  378. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
  379. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  380. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
  381. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  382. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  383. data/lib/datadog/ci/ext/app_types.rb +0 -9
  384. data/lib/datadog/ci/ext/environment.rb +0 -575
  385. data/lib/datadog/ci/ext/settings.rb +0 -10
  386. data/lib/datadog/ci/ext/test.rb +0 -35
  387. data/lib/datadog/ci/extensions.rb +0 -19
  388. data/lib/datadog/ci/flush.rb +0 -38
  389. data/lib/datadog/ci/test.rb +0 -81
  390. data/lib/datadog/ci.rb +0 -20
  391. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  392. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  393. data/lib/datadog/core/configuration/option_set.rb +0 -10
  394. data/lib/datadog/core/transport/config.rb +0 -58
  395. data/lib/datadog/core/transport/http/api.rb +0 -57
  396. data/lib/datadog/core/transport/http/client.rb +0 -45
  397. data/lib/datadog/core/transport/http/config.rb +0 -268
  398. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  399. data/lib/datadog/core/transport/http.rb +0 -169
  400. data/lib/datadog/core/utils/object_set.rb +0 -43
  401. data/lib/datadog/core/utils/string_table.rb +0 -47
  402. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  403. data/lib/datadog/profiling/buffer.rb +0 -43
  404. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  405. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  406. data/lib/datadog/profiling/event.rb +0 -15
  407. data/lib/datadog/profiling/events/stack.rb +0 -82
  408. data/lib/datadog/profiling/old_recorder.rb +0 -107
  409. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  410. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  411. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  412. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  413. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  414. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  415. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  416. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  417. data/lib/datadog/profiling/pprof/template.rb +0 -118
  418. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  419. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  420. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
  421. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  422. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  423. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  424. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  425. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  426. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  427. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  428. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  429. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  430. data/lib/ddtrace/transport/http/api.rb +0 -39
  431. data/lib/ddtrace/transport/http/builder.rb +0 -176
  432. data/lib/ddtrace/transport/http/client.rb +0 -52
  433. data/lib/ddtrace/transport/http/env.rb +0 -58
  434. data/lib/ddtrace/transport/http/response.rb +0 -58
  435. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  436. data/lib/ddtrace/transport/http/traces.rb +0 -144
  437. data/lib/ddtrace/transport/http.rb +0 -117
  438. data/lib/ddtrace/transport/io/client.rb +0 -85
  439. data/lib/ddtrace/transport/io/response.rb +0 -25
  440. data/lib/ddtrace/transport/io/traces.rb +0 -99
  441. data/lib/ddtrace/transport/io.rb +0 -28
  442. data/lib/ddtrace/transport/parcel.rb +0 -20
  443. data/lib/ddtrace/transport/request.rb +0 -15
  444. data/lib/ddtrace/transport/response.rb +0 -60
  445. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  446. data/lib/ddtrace/transport/statistics.rb +0 -75
  447. data/lib/ddtrace/transport/trace_formatter.rb +0 -198
  448. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../tracking'
4
+ require_relative '../resource'
5
+ require_relative '../event'
6
+
7
+ module Datadog
8
+ module AppSec
9
+ module Contrib
10
+ module Devise
11
+ module Patcher
12
+ # Hook in devise registration controller
13
+ module RegistrationControllerPatch
14
+ def create
15
+ return super unless AppSec.enabled?
16
+
17
+ track_user_events_configuration = Datadog.configuration.appsec.track_user_events
18
+
19
+ return super unless track_user_events_configuration.enabled
20
+
21
+ automated_track_user_events_mode = track_user_events_configuration.mode
22
+
23
+ appsec_scope = Datadog::AppSec.active_scope
24
+ return super unless appsec_scope
25
+
26
+ super do |resource|
27
+ if resource.persisted?
28
+ devise_resource = Resource.new(resource)
29
+
30
+ event_information = Event.new(devise_resource, automated_track_user_events_mode)
31
+
32
+ if event_information.user_id
33
+ Datadog.logger.debug { 'User Signup Event' }
34
+ else
35
+ Datadog.logger.warn { 'User Signup Event, but can\'t extract user ID. Tracking empty event' }
36
+ end
37
+
38
+ Tracking.track_signup(
39
+ appsec_scope.trace,
40
+ appsec_scope.service_entry_span,
41
+ user_id: event_information.user_id,
42
+ **event_information.to_h
43
+ )
44
+ end
45
+
46
+ yield resource if block_given?
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../patcher'
4
+ require_relative 'patcher/authenticatable_patch'
5
+ require_relative 'patcher/registration_controller_patch'
6
+
7
+ module Datadog
8
+ module AppSec
9
+ module Contrib
10
+ module Devise
11
+ # Patcher for AppSec on Devise
12
+ module Patcher
13
+ include Datadog::AppSec::Contrib::Patcher
14
+
15
+ module_function
16
+
17
+ def patched?
18
+ Patcher.instance_variable_get(:@patched)
19
+ end
20
+
21
+ def target_version
22
+ Integration.version
23
+ end
24
+
25
+ def patch
26
+ patch_authenticable_strategy
27
+ patch_registration_controller
28
+
29
+ Patcher.instance_variable_set(:@patched, true)
30
+ end
31
+
32
+ def patch_authenticable_strategy
33
+ ::Devise::Strategies::Authenticatable.prepend(AuthenticatablePatch)
34
+ end
35
+
36
+ def patch_registration_controller
37
+ ::ActiveSupport.on_load(:after_initialize) do
38
+ ::Devise::RegistrationsController.prepend(RegistrationControllerPatch)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module AppSec
5
+ module Contrib
6
+ module Devise
7
+ # Class to encpasulate extracting information from a Devise resource
8
+ # Normally a devise resource would be an Active::Record instance
9
+ class Resource
10
+ def initialize(resource)
11
+ @resource = resource
12
+ end
13
+
14
+ def id
15
+ extract(:id) || extract(:uuid)
16
+ end
17
+
18
+ def email
19
+ extract(:email)
20
+ end
21
+
22
+ def username
23
+ extract(:username)
24
+ end
25
+
26
+ private
27
+
28
+ def extract(method)
29
+ @resource.send(method) if @resource.respond_to?(method)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../kit/identity'
4
+
5
+ module Datadog
6
+ module AppSec
7
+ module Contrib
8
+ module Devise
9
+ # Internal module to track user events
10
+ module Tracking
11
+ LOGIN_SUCCESS_EVENT = 'users.login.success'
12
+ LOGIN_FAILURE_EVENT = 'users.login.failure'
13
+ SIGNUP_EVENT = 'users.signup'
14
+
15
+ def self.track_login_success(trace, span, user_id:, **others)
16
+ track(LOGIN_SUCCESS_EVENT, trace, span, **others)
17
+
18
+ Kit::Identity.set_user(trace, span, id: user_id.to_s, **others) if user_id
19
+ end
20
+
21
+ def self.track_login_failure(trace, span, user_id:, user_exists:, **others)
22
+ track(LOGIN_FAILURE_EVENT, trace, span, **others)
23
+
24
+ span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
25
+ span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists)
26
+ end
27
+
28
+ def self.track_signup(trace, span, user_id:, **others)
29
+ track(SIGNUP_EVENT, trace, span, **others)
30
+ Kit::Identity.set_user(trace, id: user_id.to_s, **others) if user_id
31
+ end
32
+
33
+ def self.track(event, trace, span, **others)
34
+ span.set_tag("appsec.events.#{event}.track", 'true')
35
+ span.set_tag("_dd.appsec.events.#{event}.auto.mode", Datadog.configuration.appsec.track_user_events.mode)
36
+
37
+ others.each do |k, v|
38
+ raise ArgumentError, 'key cannot be :track' if k.to_sym == :track
39
+
40
+ span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
41
+ end
42
+
43
+ trace.keep!
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module AppSec
3
5
  module Contrib
4
6
  module Rack
5
7
  # Rack integration constants
6
8
  module Ext
7
- APP = 'rack'.freeze
8
9
  end
9
10
  end
10
11
  end
@@ -40,9 +40,13 @@ module Datadog
40
40
  end
41
41
 
42
42
  def headers
43
- request.env.each_with_object({}) do |(k, v), h|
44
- h[k.gsub(/^HTTP_/, '').downcase.tr('_', '-')] = v if k =~ /^HTTP_/
43
+ result = request.env.each_with_object({}) do |(k, v), h|
44
+ h[k.gsub(/^HTTP_/, '').downcase!.tr('_', '-')] = v if k =~ /^HTTP_/
45
45
  end
46
+
47
+ result['content-type'] = request.content_type if request.content_type
48
+ result['content-length'] = request.content_length if request.content_length
49
+ result
46
50
  end
47
51
 
48
52
  def body
@@ -28,7 +28,7 @@ module Datadog
28
28
  scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
29
29
 
30
30
  AppSec::Reactive::Operation.new('rack.request') do |op|
31
- Rack::Reactive::Request.subscribe(op, scope.processor_context) do |result, _block|
31
+ Rack::Reactive::Request.subscribe(op, scope.processor_context) do |result|
32
32
  if result.status == :match
33
33
  # TODO: should this hash be an Event instance instead?
34
34
  event = {
@@ -48,7 +48,7 @@ module Datadog
48
48
  end
49
49
  end
50
50
 
51
- _result, block = Rack::Reactive::Request.publish(op, gateway_request)
51
+ block = Rack::Reactive::Request.publish(op, gateway_request)
52
52
  end
53
53
 
54
54
  next [nil, [[:block, event]]] if block
@@ -67,11 +67,12 @@ module Datadog
67
67
  def watch_response(gateway = Instrumentation.gateway)
68
68
  gateway.watch('rack.response', :appsec) do |stack, gateway_response|
69
69
  block = false
70
+
70
71
  event = nil
71
72
  scope = gateway_response.scope
72
73
 
73
74
  AppSec::Reactive::Operation.new('rack.response') do |op|
74
- Rack::Reactive::Response.subscribe(op, scope.processor_context) do |result, _block|
75
+ Rack::Reactive::Response.subscribe(op, scope.processor_context) do |result|
75
76
  if result.status == :match
76
77
  # TODO: should this hash be an Event instance instead?
77
78
  event = {
@@ -91,7 +92,7 @@ module Datadog
91
92
  end
92
93
  end
93
94
 
94
- _result, block = Rack::Reactive::Response.publish(op, gateway_response)
95
+ block = Rack::Reactive::Response.publish(op, gateway_response)
95
96
  end
96
97
 
97
98
  next [nil, [[:block, event]]] if block
@@ -110,11 +111,12 @@ module Datadog
110
111
  def watch_request_body(gateway = Instrumentation.gateway)
111
112
  gateway.watch('rack.request.body', :appsec) do |stack, gateway_request|
112
113
  block = false
114
+
113
115
  event = nil
114
116
  scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
115
117
 
116
118
  AppSec::Reactive::Operation.new('rack.request.body') do |op|
117
- Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result, _block|
119
+ Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result|
118
120
  if result.status == :match
119
121
  # TODO: should this hash be an Event instance instead?
120
122
  event = {
@@ -134,7 +136,7 @@ module Datadog
134
136
  end
135
137
  end
136
138
 
137
- _result, block = Rack::Reactive::RequestBody.publish(op, gateway_request)
139
+ block = Rack::Reactive::RequestBody.publish(op, gateway_request)
138
140
  end
139
141
 
140
142
  next [nil, [[:block, event]]] if block
@@ -30,7 +30,6 @@ module Datadog
30
30
  end
31
31
  end
32
32
 
33
- # rubocop:disable Metrics/MethodLength
34
33
  def self.subscribe(op, waf_context)
35
34
  op.subscribe(*ADDRESSES) do |*values|
36
35
  Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
@@ -52,7 +51,7 @@ module Datadog
52
51
  'server.request.method' => request_method,
53
52
  }
54
53
 
55
- waf_timeout = Datadog::AppSec.settings.waf_timeout
54
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
56
55
  result = waf_context.run(waf_args, waf_timeout)
57
56
 
58
57
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -61,11 +60,8 @@ module Datadog
61
60
  when :match
62
61
  Datadog.logger.debug { "WAF: #{result.inspect}" }
63
62
 
64
- block = result.actions.include?('block')
65
-
66
- yield [result, block]
67
-
68
- throw(:block, [result, true]) if block
63
+ yield result
64
+ throw(:block, true) unless result.actions.empty?
69
65
  when :ok
70
66
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
71
67
  when :invalid_call
@@ -76,7 +72,6 @@ module Datadog
76
72
  Datadog.logger.debug { "WAF UNKNOWN: #{result.status.inspect} #{result.inspect}" }
77
73
  end
78
74
  end
79
- # rubocop:enable Metrics/MethodLength
80
75
  end
81
76
  end
82
77
  end
@@ -30,7 +30,7 @@ module Datadog
30
30
  'server.request.body' => body,
31
31
  }
32
32
 
33
- waf_timeout = Datadog::AppSec.settings.waf_timeout
33
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
34
34
  result = waf_context.run(waf_args, waf_timeout)
35
35
 
36
36
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -39,11 +39,8 @@ module Datadog
39
39
  when :match
40
40
  Datadog.logger.debug { "WAF: #{result.inspect}" }
41
41
 
42
- block = result.actions.include?('block')
43
-
44
- yield [result, block]
45
-
46
- throw(:block, [result, true]) if block
42
+ yield result
43
+ throw(:block, true) unless result.actions.empty?
47
44
  when :ok
48
45
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
49
46
  when :invalid_call
@@ -36,7 +36,7 @@ module Datadog
36
36
  'server.response.headers.no_cookies' => response_headers_no_cookies,
37
37
  }
38
38
 
39
- waf_timeout = Datadog::AppSec.settings.waf_timeout
39
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
40
40
  result = waf_context.run(waf_args, waf_timeout)
41
41
 
42
42
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -45,11 +45,8 @@ module Datadog
45
45
  when :match
46
46
  Datadog.logger.debug { "WAF: #{result.inspect}" }
47
47
 
48
- block = result.actions.include?('block')
49
-
50
- yield [result, block]
51
-
52
- throw(:block, [result, true]) if block
48
+ yield result
49
+ throw(:block, true) unless result.actions.empty?
53
50
  when :ok
54
51
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
55
52
  when :invalid_call
@@ -30,8 +30,9 @@ module Datadog
30
30
  @app.call(env)
31
31
  end
32
32
 
33
- if request_response && request_response.any? { |action, _event| action == :block }
34
- request_return = AppSec::Response.negotiate(env).to_rack
33
+ if request_response
34
+ blocked_event = request_response.find { |action, _event| action == :block }
35
+ request_return = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_rack if blocked_event
35
36
  end
36
37
 
37
38
  request_return
@@ -53,7 +53,7 @@ module Datadog
53
53
 
54
54
  gateway_request = Gateway::Request.new(env)
55
55
 
56
- add_appsec_tags(processor, scope.trace, scope.service_entry_span, env)
56
+ add_appsec_tags(processor, scope, env)
57
57
 
58
58
  request_return, request_response = catch(::Datadog::AppSec::Ext::INTERRUPT) do
59
59
  Instrumentation.gateway.push('rack.request', gateway_request) do
@@ -61,19 +61,30 @@ module Datadog
61
61
  end
62
62
  end
63
63
 
64
- if request_response && request_response.any? { |action, _event| action == :block }
65
- request_return = AppSec::Response.negotiate(env).to_rack
64
+ if request_response
65
+ blocked_event = request_response.find { |action, _options| action == :block }
66
+ request_return = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_rack if blocked_event
66
67
  end
67
68
 
68
69
  gateway_response = Gateway::Response.new(
69
70
  request_return[2],
70
71
  request_return[0],
71
72
  request_return[1],
72
- scope: scope
73
+ scope: scope,
73
74
  )
74
75
 
75
76
  _response_return, response_response = Instrumentation.gateway.push('rack.response', gateway_response)
76
77
 
78
+ result = scope.processor_context.extract_schema
79
+
80
+ if result
81
+ scope.processor_context.events << {
82
+ trace: scope.trace,
83
+ span: scope.service_entry_span,
84
+ waf_result: result,
85
+ }
86
+ end
87
+
77
88
  scope.processor_context.events.each do |e|
78
89
  e[:response] ||= gateway_response
79
90
  e[:request] ||= gateway_request
@@ -81,14 +92,15 @@ module Datadog
81
92
 
82
93
  AppSec::Event.record(scope.service_entry_span, *scope.processor_context.events)
83
94
 
84
- if response_response && response_response.any? { |action, _event| action == :block }
85
- request_return = AppSec::Response.negotiate(env).to_rack
95
+ if response_response
96
+ blocked_event = response_response.find { |action, _options| action == :block }
97
+ request_return = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_rack if blocked_event
86
98
  end
87
99
 
88
100
  request_return
89
101
  ensure
90
102
  if scope
91
- add_waf_runtime_tags(scope.service_entry_span, scope.processor_context)
103
+ add_waf_runtime_tags(scope)
92
104
  Datadog::AppSec::Scope.deactivate_scope
93
105
  end
94
106
  end
@@ -116,8 +128,11 @@ module Datadog
116
128
  Datadog::Tracing.active_span
117
129
  end
118
130
 
119
- def add_appsec_tags(processor, trace, span, env)
120
- return unless trace
131
+ def add_appsec_tags(processor, scope, env)
132
+ span = scope.service_entry_span
133
+ trace = scope.trace
134
+
135
+ return unless trace && span
121
136
 
122
137
  span.set_tag('_dd.appsec.enabled', 1)
123
138
  span.set_tag('_dd.runtime_family', 'ruby')
@@ -134,17 +149,19 @@ module Datadog
134
149
  )
135
150
  end
136
151
 
137
- if processor.ruleset_info
138
- span.set_tag('_dd.appsec.event_rules.version', processor.ruleset_info[:version])
152
+ if processor.diagnostics
153
+ diagnostics = processor.diagnostics
154
+
155
+ span.set_tag('_dd.appsec.event_rules.version', diagnostics['ruleset_version'])
139
156
 
140
157
  unless @oneshot_tags_sent
141
158
  # Small race condition, but it's inoccuous: worst case the tags
142
159
  # are sent a couple of times more than expected
143
160
  @oneshot_tags_sent = true
144
161
 
145
- span.set_tag('_dd.appsec.event_rules.loaded', processor.ruleset_info[:loaded].to_f)
146
- span.set_tag('_dd.appsec.event_rules.error_count', processor.ruleset_info[:failed].to_f)
147
- span.set_tag('_dd.appsec.event_rules.errors', JSON.dump(processor.ruleset_info[:errors]))
162
+ span.set_tag('_dd.appsec.event_rules.loaded', diagnostics['rules']['loaded'].size.to_f)
163
+ span.set_tag('_dd.appsec.event_rules.error_count', diagnostics['rules']['failed'].size.to_f)
164
+ span.set_tag('_dd.appsec.event_rules.errors', JSON.dump(diagnostics['rules']['errors']))
148
165
  span.set_tag('_dd.appsec.event_rules.addresses', JSON.dump(processor.addresses))
149
166
 
150
167
  # Ensure these tags reach the backend
@@ -157,9 +174,11 @@ module Datadog
157
174
  end
158
175
  end
159
176
 
160
- def add_waf_runtime_tags(span, context)
161
- return unless span
162
- return unless context
177
+ def add_waf_runtime_tags(scope)
178
+ span = scope.service_entry_span
179
+ context = scope.processor_context
180
+
181
+ return unless span && context
163
182
 
164
183
  span.set_tag('_dd.appsec.waf.timeouts', context.timeouts)
165
184
 
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module AppSec
3
5
  module Contrib
4
6
  module Rails
5
- # Rack integration constants
7
+ # Rails integration constants
6
8
  module Ext
7
- APP = 'rails'.freeze
8
9
  end
9
10
  end
10
11
  end
@@ -7,9 +7,7 @@ module Datadog
7
7
  # Rails specific framework tie
8
8
  module Framework
9
9
  def self.setup
10
- Datadog::AppSec.configure do |datadog_config|
11
- datadog_config.instrument(:rack)
12
- end
10
+ Datadog.configuration.appsec.instrument(:rack)
13
11
  end
14
12
  end
15
13
  end
@@ -20,11 +20,12 @@ module Datadog
20
20
  def watch_request_action(gateway = Instrumentation.gateway)
21
21
  gateway.watch('rails.request.action', :appsec) do |stack, gateway_request|
22
22
  block = false
23
+
23
24
  event = nil
24
25
  scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
25
26
 
26
27
  AppSec::Reactive::Operation.new('rails.request.action') do |op|
27
- Rails::Reactive::Action.subscribe(op, scope.processor_context) do |result, _block|
28
+ Rails::Reactive::Action.subscribe(op, scope.processor_context) do |result|
28
29
  if result.status == :match
29
30
  # TODO: should this hash be an Event instance instead?
30
31
  event = {
@@ -44,7 +45,7 @@ module Datadog
44
45
  end
45
46
  end
46
47
 
47
- _result, block = Rails::Reactive::Action.publish(op, gateway_request)
48
+ block = Rails::Reactive::Action.publish(op, gateway_request)
48
49
  end
49
50
 
50
51
  next [nil, [[:block, event]]] if block
@@ -33,19 +33,19 @@ module Datadog
33
33
 
34
34
  def patch
35
35
  Gateway::Watcher.watch
36
- patch_before_intialize
37
- patch_after_intialize
36
+ patch_before_initialize
37
+ patch_after_initialize
38
38
 
39
39
  Patcher.instance_variable_set(:@patched, true)
40
40
  end
41
41
 
42
- def patch_before_intialize
42
+ def patch_before_initialize
43
43
  ::ActiveSupport.on_load(:before_initialize) do
44
- Datadog::AppSec::Contrib::Rails::Patcher.before_intialize(self)
44
+ Datadog::AppSec::Contrib::Rails::Patcher.before_initialize(self)
45
45
  end
46
46
  end
47
47
 
48
- def before_intialize(app)
48
+ def before_initialize(app)
49
49
  BEFORE_INITIALIZE_ONLY_ONCE_PER_APP[app].run do
50
50
  # Middleware must be added before the application is initialized.
51
51
  # Otherwise the middleware stack will be frozen.
@@ -83,9 +83,15 @@ module Datadog
83
83
  super
84
84
  end
85
85
 
86
- if request_response && request_response.any? { |action, _event| action == :block }
87
- @_response = AppSec::Response.negotiate(env).to_action_dispatch_response
88
- request_return = @_response.body
86
+ if request_response
87
+ blocked_event = request_response.find { |action, _options| action == :block }
88
+ if blocked_event
89
+ @_response = AppSec::Response.negotiate(
90
+ env,
91
+ blocked_event.last[:actions]
92
+ ).to_action_dispatch_response
93
+ request_return = @_response.body
94
+ end
89
95
  end
90
96
 
91
97
  request_return
@@ -134,13 +140,13 @@ module Datadog
134
140
  Datadog.logger.debug { 'Rails middlewares: ' << app.middleware.map(&:inspect).inspect }
135
141
  end
136
142
 
137
- def patch_after_intialize
143
+ def patch_after_initialize
138
144
  ::ActiveSupport.on_load(:after_initialize) do
139
- Datadog::AppSec::Contrib::Rails::Patcher.after_intialize(self)
145
+ Datadog::AppSec::Contrib::Rails::Patcher.after_initialize(self)
140
146
  end
141
147
  end
142
148
 
143
- def after_intialize(app)
149
+ def after_initialize(app)
144
150
  AFTER_INITIALIZE_ONLY_ONCE_PER_APP[app].run do
145
151
  # Finish configuring the tracer after the application is initialized.
146
152
  # We need to wait for some things, like application name, middleware stack, etc.
@@ -36,7 +36,7 @@ module Datadog
36
36
  'server.request.path_params' => path_params,
37
37
  }
38
38
 
39
- waf_timeout = Datadog::AppSec.settings.waf_timeout
39
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
40
40
  result = waf_context.run(waf_args, waf_timeout)
41
41
 
42
42
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -45,11 +45,8 @@ module Datadog
45
45
  when :match
46
46
  Datadog.logger.debug { "WAF: #{result.inspect}" }
47
47
 
48
- block = result.actions.include?('block')
49
-
50
- yield [result, block]
51
-
52
- throw(:block, [result, true]) if block
48
+ yield result
49
+ throw(:block, true) unless result.actions.empty?
53
50
  when :ok
54
51
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
55
52
  when :invalid_call
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module AppSec
3
5
  module Contrib
4
6
  module Sinatra
5
7
  # Sinatra integration constants
6
8
  module Ext
7
- APP = 'sinatra'.freeze
8
9
  ROUTE_INTERRUPT = :datadog_appsec_contrib_sinatra_route_interrupt
9
10
  end
10
11
  end
@@ -11,9 +11,7 @@ module Datadog
11
11
  module Framework
12
12
  # Configure Rack from Sinatra, but only if Rack has not been configured manually beforehand
13
13
  def self.setup
14
- Datadog::AppSec.configure do |datadog_config|
15
- datadog_config.instrument(:rack)
16
- end
14
+ Datadog.configuration.appsec.instrument(:rack)
17
15
  end
18
16
  end
19
17
  end