ddtrace 1.12.1 → 1.23.2

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 (509) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +613 -9
  3. data/LICENSE-3rdparty.csv +1 -1
  4. data/bin/ddprofrb +15 -0
  5. data/bin/ddtracerb +3 -1
  6. data/ext/{ddtrace_profiling_loader/ddtrace_profiling_loader.c → datadog_profiling_loader/datadog_profiling_loader.c} +2 -2
  7. data/ext/{ddtrace_profiling_loader → datadog_profiling_loader}/extconf.rb +3 -3
  8. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/NativeExtensionDesign.md +3 -5
  9. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id.h +0 -3
  10. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_from_pthread.c +3 -22
  11. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_noop.c +0 -1
  12. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_cpu_and_wall_time_worker.c +338 -108
  13. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
  14. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
  15. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.c +22 -14
  16. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.h +4 -0
  17. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
  18. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
  19. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.c +3 -0
  20. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.c +111 -118
  21. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.h +11 -4
  22. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.c +545 -144
  23. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.h +3 -2
  24. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/extconf.rb +68 -17
  25. data/ext/datadog_profiling_native_extension/heap_recorder.c +1047 -0
  26. data/ext/datadog_profiling_native_extension/heap_recorder.h +166 -0
  27. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/helpers.h +6 -0
  28. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/http_transport.c +60 -32
  29. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
  30. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
  31. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/native_extension_helpers.rb +50 -4
  32. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.c +155 -32
  33. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.h +16 -0
  34. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/profiling.c +19 -3
  35. data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
  36. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/ruby_helpers.h +33 -0
  37. data/ext/datadog_profiling_native_extension/stack_recorder.c +1040 -0
  38. data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
  39. data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
  40. data/ext/datadog_profiling_native_extension/time_helpers.h +26 -0
  41. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  42. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  43. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  44. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  45. data/lib/datadog/appsec/assets.rb +8 -0
  46. data/lib/datadog/appsec/component.rb +21 -2
  47. data/lib/datadog/appsec/configuration/settings.rb +167 -189
  48. data/lib/datadog/appsec/configuration.rb +0 -79
  49. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
  50. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  51. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  52. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  53. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  54. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  55. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  56. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  57. data/lib/datadog/appsec/contrib/devise/tracking.rb +57 -0
  58. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
  59. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  60. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  61. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
  62. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
  63. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
  64. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  65. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +77 -27
  66. data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
  67. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
  68. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  69. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
  70. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
  71. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  72. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
  73. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  74. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  75. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
  76. data/lib/datadog/appsec/event.rb +106 -50
  77. data/lib/datadog/appsec/extensions.rb +1 -130
  78. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  79. data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
  80. data/lib/datadog/appsec/processor/actions.rb +49 -0
  81. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  82. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  83. data/lib/datadog/appsec/processor.rb +35 -7
  84. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  85. data/lib/datadog/appsec/remote.rb +17 -11
  86. data/lib/datadog/appsec/response.rb +82 -4
  87. data/lib/datadog/appsec/sample_rate.rb +21 -0
  88. data/lib/datadog/appsec.rb +3 -4
  89. data/lib/datadog/auto_instrument.rb +3 -0
  90. data/lib/datadog/core/backport.rb +51 -0
  91. data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
  92. data/lib/datadog/core/configuration/base.rb +6 -16
  93. data/lib/datadog/core/configuration/components.rb +20 -7
  94. data/lib/datadog/core/configuration/ext.rb +28 -5
  95. data/lib/datadog/core/configuration/option.rb +271 -21
  96. data/lib/datadog/core/configuration/option_definition.rb +73 -32
  97. data/lib/datadog/core/configuration/options.rb +27 -15
  98. data/lib/datadog/core/configuration/settings.rb +398 -119
  99. data/lib/datadog/core/configuration.rb +24 -4
  100. data/lib/datadog/core/diagnostics/environment_logger.rb +132 -235
  101. data/lib/datadog/core/environment/class_count.rb +6 -6
  102. data/lib/datadog/core/environment/execution.rb +103 -0
  103. data/lib/datadog/core/environment/ext.rb +13 -11
  104. data/lib/datadog/core/environment/git.rb +25 -0
  105. data/lib/datadog/core/environment/identity.rb +18 -48
  106. data/lib/datadog/core/environment/platform.rb +7 -1
  107. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  108. data/lib/datadog/core/environment/yjit.rb +58 -0
  109. data/lib/datadog/core/error.rb +1 -0
  110. data/lib/datadog/core/git/ext.rb +6 -23
  111. data/lib/datadog/core/logging/ext.rb +3 -1
  112. data/lib/datadog/core/metrics/ext.rb +7 -5
  113. data/lib/datadog/core/remote/client/capabilities.rb +7 -2
  114. data/lib/datadog/core/remote/client.rb +3 -0
  115. data/lib/datadog/core/remote/component.rb +52 -48
  116. data/lib/datadog/core/remote/configuration/content.rb +28 -1
  117. data/lib/datadog/core/remote/configuration/repository.rb +3 -1
  118. data/lib/datadog/core/remote/ext.rb +2 -1
  119. data/lib/datadog/core/remote/negotiation.rb +20 -7
  120. data/lib/datadog/core/remote/tie/tracing.rb +39 -0
  121. data/lib/datadog/core/remote/tie.rb +27 -0
  122. data/lib/datadog/core/remote/transport/config.rb +60 -0
  123. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  124. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  125. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  126. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  127. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  128. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  129. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  130. data/lib/datadog/core/remote/transport/http.rb +179 -0
  131. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  132. data/lib/datadog/core/remote/worker.rb +11 -5
  133. data/lib/datadog/core/runtime/ext.rb +22 -12
  134. data/lib/datadog/core/runtime/metrics.rb +43 -0
  135. data/lib/datadog/core/telemetry/client.rb +28 -10
  136. data/lib/datadog/core/telemetry/emitter.rb +9 -11
  137. data/lib/datadog/core/telemetry/event.rb +250 -44
  138. data/lib/datadog/core/telemetry/ext.rb +8 -1
  139. data/lib/datadog/core/telemetry/heartbeat.rb +3 -7
  140. data/lib/datadog/core/telemetry/http/ext.rb +13 -8
  141. data/lib/datadog/core/telemetry/http/response.rb +4 -0
  142. data/lib/datadog/core/telemetry/http/transport.rb +10 -3
  143. data/lib/datadog/core/telemetry/request.rb +59 -0
  144. data/lib/datadog/core/transport/ext.rb +49 -0
  145. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  146. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  147. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  148. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  149. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  150. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  151. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  152. data/lib/datadog/core/transport/http/env.rb +62 -0
  153. data/lib/datadog/core/transport/http/response.rb +60 -0
  154. data/lib/datadog/core/transport/parcel.rb +22 -0
  155. data/lib/datadog/core/transport/request.rb +17 -0
  156. data/lib/datadog/core/transport/response.rb +64 -0
  157. data/lib/datadog/core/utils/duration.rb +52 -0
  158. data/lib/datadog/core/utils/hash.rb +47 -0
  159. data/lib/datadog/core/utils/network.rb +1 -1
  160. data/lib/datadog/core/utils/safe_dup.rb +27 -20
  161. data/lib/datadog/core/utils/url.rb +25 -0
  162. data/lib/datadog/core/utils.rb +1 -1
  163. data/lib/datadog/core/workers/async.rb +3 -2
  164. data/lib/datadog/core/workers/polling.rb +2 -2
  165. data/lib/datadog/kit/appsec/events.rb +139 -89
  166. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  167. data/lib/datadog/kit/identity.rb +80 -65
  168. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  169. data/lib/datadog/opentelemetry/sdk/propagator.rb +5 -3
  170. data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
  171. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  172. data/lib/datadog/opentelemetry/trace.rb +58 -0
  173. data/lib/datadog/opentelemetry.rb +4 -0
  174. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  175. data/lib/datadog/opentracer.rb +9 -0
  176. data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
  177. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +43 -20
  178. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
  179. data/lib/datadog/profiling/collectors/info.rb +101 -0
  180. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  181. data/lib/datadog/profiling/component.rb +248 -97
  182. data/lib/datadog/profiling/exporter.rb +26 -5
  183. data/lib/datadog/profiling/ext.rb +2 -12
  184. data/lib/datadog/profiling/flush.rb +10 -5
  185. data/lib/datadog/profiling/http_transport.rb +23 -6
  186. data/lib/datadog/profiling/load_native_extension.rb +25 -6
  187. data/lib/datadog/profiling/native_extension.rb +1 -22
  188. data/lib/datadog/profiling/profiler.rb +36 -13
  189. data/lib/datadog/profiling/scheduler.rb +20 -15
  190. data/lib/datadog/profiling/stack_recorder.rb +19 -4
  191. data/lib/datadog/profiling/tag_builder.rb +5 -0
  192. data/lib/datadog/profiling/tasks/exec.rb +3 -3
  193. data/lib/datadog/profiling/tasks/help.rb +3 -3
  194. data/lib/datadog/profiling.rb +28 -79
  195. data/lib/datadog/tracing/component.rb +70 -11
  196. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  197. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  198. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  199. data/lib/datadog/tracing/configuration/ext.rb +40 -33
  200. data/lib/datadog/tracing/configuration/http.rb +74 -0
  201. data/lib/datadog/tracing/configuration/settings.rb +136 -99
  202. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +10 -6
  203. data/lib/datadog/tracing/contrib/action_cable/ext.rb +21 -18
  204. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +10 -6
  205. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +1 -1
  206. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +21 -18
  207. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +10 -7
  208. data/lib/datadog/tracing/contrib/action_pack/ext.rb +11 -8
  209. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +10 -6
  210. data/lib/datadog/tracing/contrib/action_view/ext.rb +13 -10
  211. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +14 -7
  212. data/lib/datadog/tracing/contrib/active_job/ext.rb +26 -23
  213. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
  214. data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
  215. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +10 -6
  216. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +13 -10
  217. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +29 -15
  218. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +10 -7
  219. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
  220. data/lib/datadog/tracing/contrib/active_record/ext.rb +18 -15
  221. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  222. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
  223. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  224. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -7
  225. data/lib/datadog/tracing/contrib/active_support/ext.rb +19 -16
  226. data/lib/datadog/tracing/contrib/analytics.rb +0 -1
  227. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +15 -7
  228. data/lib/datadog/tracing/contrib/aws/ext.rb +38 -24
  229. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
  230. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
  231. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
  232. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  233. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
  234. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  235. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  236. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +19 -2
  237. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  238. data/lib/datadog/tracing/contrib/configurable.rb +1 -1
  239. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  240. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +21 -7
  241. data/lib/datadog/tracing/contrib/dalli/ext.rb +27 -11
  242. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
  243. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +14 -7
  244. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +17 -14
  245. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +15 -7
  246. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +22 -15
  247. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
  248. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +17 -9
  249. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
  250. data/lib/datadog/tracing/contrib/ethon/ext.rb +20 -11
  251. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
  252. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +20 -10
  253. data/lib/datadog/tracing/contrib/excon/ext.rb +17 -8
  254. data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
  255. data/lib/datadog/tracing/contrib/ext.rb +26 -1
  256. data/lib/datadog/tracing/contrib/extensions.rb +38 -2
  257. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +27 -10
  258. data/lib/datadog/tracing/contrib/faraday/ext.rb +17 -8
  259. data/lib/datadog/tracing/contrib/faraday/middleware.rb +22 -6
  260. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +9 -6
  261. data/lib/datadog/tracing/contrib/grape/ext.rb +17 -14
  262. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +9 -6
  263. data/lib/datadog/tracing/contrib/graphql/ext.rb +8 -5
  264. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +40 -9
  265. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
  266. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
  267. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  268. data/lib/datadog/tracing/contrib/grpc/ext.rb +17 -13
  269. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  270. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
  271. data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
  272. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
  273. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +34 -11
  274. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +2 -2
  275. data/lib/datadog/tracing/contrib/http/ext.rb +17 -9
  276. data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
  277. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +34 -11
  278. data/lib/datadog/tracing/contrib/httpclient/ext.rb +18 -9
  279. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
  280. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +34 -11
  281. data/lib/datadog/tracing/contrib/httprb/ext.rb +17 -9
  282. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
  283. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +10 -6
  284. data/lib/datadog/tracing/contrib/kafka/ext.rb +43 -39
  285. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
  286. data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
  287. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
  288. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +15 -7
  289. data/lib/datadog/tracing/contrib/mongodb/ext.rb +21 -16
  290. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
  291. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +22 -14
  292. data/lib/datadog/tracing/contrib/mysql2/ext.rb +16 -10
  293. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +22 -7
  294. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +53 -0
  295. data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -0
  296. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  297. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  298. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  299. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +23 -14
  300. data/lib/datadog/tracing/contrib/pg/ext.rb +23 -19
  301. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +49 -9
  302. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +15 -7
  303. data/lib/datadog/tracing/contrib/presto/ext.rb +26 -20
  304. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
  305. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
  306. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  307. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +13 -8
  308. data/lib/datadog/tracing/contrib/qless/ext.rb +15 -12
  309. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +22 -12
  310. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  311. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +10 -7
  312. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
  313. data/lib/datadog/tracing/contrib/racecar/ext.rb +21 -18
  314. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +17 -12
  315. data/lib/datadog/tracing/contrib/rack/ext.rb +19 -16
  316. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
  317. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  318. data/lib/datadog/tracing/contrib/rack/middlewares.rb +16 -50
  319. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -2
  320. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +20 -15
  321. data/lib/datadog/tracing/contrib/rails/ext.rb +8 -5
  322. data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
  323. data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
  324. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  325. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +14 -10
  326. data/lib/datadog/tracing/contrib/rake/ext.rb +15 -12
  327. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +18 -9
  328. data/lib/datadog/tracing/contrib/redis/ext.rb +23 -15
  329. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +5 -40
  330. data/lib/datadog/tracing/contrib/redis/patcher.rb +34 -21
  331. data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
  332. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  333. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +14 -7
  334. data/lib/datadog/tracing/contrib/resque/ext.rb +10 -7
  335. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +17 -9
  336. data/lib/datadog/tracing/contrib/rest_client/ext.rb +16 -8
  337. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
  338. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +10 -6
  339. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  340. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
  341. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
  342. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
  343. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +10 -6
  344. data/lib/datadog/tracing/contrib/sequel/ext.rb +11 -8
  345. data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
  346. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +15 -8
  347. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +15 -12
  348. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +19 -11
  349. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +33 -30
  350. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +12 -9
  351. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
  352. data/lib/datadog/tracing/contrib/sinatra/ext.rb +22 -19
  353. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
  354. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +15 -8
  355. data/lib/datadog/tracing/contrib/sneakers/ext.rb +2 -0
  356. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  357. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
  358. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +10 -6
  359. data/lib/datadog/tracing/contrib/stripe/ext.rb +1 -0
  360. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +10 -6
  361. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +16 -13
  362. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
  363. data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
  364. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
  365. data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
  366. data/lib/datadog/{ci/contrib/cucumber → tracing/contrib/trilogy}/patcher.rb +10 -6
  367. data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
  368. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
  369. data/lib/datadog/tracing/contrib.rb +2 -0
  370. data/lib/datadog/tracing/correlation.rb +29 -12
  371. data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
  372. data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
  373. data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
  374. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  375. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  376. data/lib/datadog/tracing/distributed/propagation.rb +35 -34
  377. data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
  378. data/lib/datadog/tracing/metadata/ext.rb +9 -6
  379. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  380. data/lib/datadog/tracing/remote.rb +78 -0
  381. data/lib/datadog/tracing/sampling/matcher.rb +23 -3
  382. data/lib/datadog/tracing/sampling/rule.rb +7 -2
  383. data/lib/datadog/tracing/sampling/rule_sampler.rb +31 -0
  384. data/lib/datadog/tracing/span_operation.rb +3 -15
  385. data/lib/datadog/tracing/sync_writer.rb +3 -3
  386. data/lib/datadog/tracing/trace_digest.rb +31 -0
  387. data/lib/datadog/tracing/trace_operation.rb +17 -5
  388. data/lib/datadog/tracing/trace_segment.rb +5 -2
  389. data/lib/datadog/tracing/tracer.rb +12 -1
  390. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  391. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  392. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  393. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  394. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  395. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  396. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  397. data/lib/datadog/tracing/transport/http.rb +125 -0
  398. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  399. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  400. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  401. data/lib/datadog/tracing/transport/io.rb +30 -0
  402. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  403. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  404. data/lib/datadog/tracing/transport/trace_formatter.rb +240 -0
  405. data/lib/datadog/tracing/transport/traces.rb +224 -0
  406. data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
  407. data/lib/datadog/tracing/workers.rb +4 -2
  408. data/lib/datadog/tracing/writer.rb +5 -2
  409. data/lib/datadog/tracing.rb +8 -2
  410. data/lib/ddtrace/transport/ext.rb +22 -14
  411. data/lib/ddtrace/version.rb +9 -12
  412. data/lib/ddtrace.rb +1 -1
  413. metadata +157 -139
  414. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +0 -25
  415. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -110
  416. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +0 -591
  417. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +0 -14
  418. data/ext/ddtrace_profiling_native_extension/time_helpers.c +0 -17
  419. data/ext/ddtrace_profiling_native_extension/time_helpers.h +0 -10
  420. data/lib/datadog/ci/configuration/components.rb +0 -32
  421. data/lib/datadog/ci/configuration/settings.rb +0 -53
  422. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
  423. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
  424. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  425. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  426. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  427. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
  428. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  429. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
  430. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  431. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  432. data/lib/datadog/ci/ext/app_types.rb +0 -9
  433. data/lib/datadog/ci/ext/environment.rb +0 -575
  434. data/lib/datadog/ci/ext/settings.rb +0 -10
  435. data/lib/datadog/ci/ext/test.rb +0 -35
  436. data/lib/datadog/ci/extensions.rb +0 -19
  437. data/lib/datadog/ci/flush.rb +0 -38
  438. data/lib/datadog/ci/test.rb +0 -81
  439. data/lib/datadog/ci.rb +0 -20
  440. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  441. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  442. data/lib/datadog/core/configuration/option_set.rb +0 -10
  443. data/lib/datadog/core/telemetry/collector.rb +0 -231
  444. data/lib/datadog/core/telemetry/v1/app_event.rb +0 -52
  445. data/lib/datadog/core/telemetry/v1/application.rb +0 -92
  446. data/lib/datadog/core/telemetry/v1/configuration.rb +0 -25
  447. data/lib/datadog/core/telemetry/v1/dependency.rb +0 -43
  448. data/lib/datadog/core/telemetry/v1/host.rb +0 -59
  449. data/lib/datadog/core/telemetry/v1/integration.rb +0 -64
  450. data/lib/datadog/core/telemetry/v1/product.rb +0 -36
  451. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -106
  452. data/lib/datadog/core/transport/config.rb +0 -58
  453. data/lib/datadog/core/transport/http/api.rb +0 -57
  454. data/lib/datadog/core/transport/http/client.rb +0 -45
  455. data/lib/datadog/core/transport/http/config.rb +0 -268
  456. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  457. data/lib/datadog/core/transport/http.rb +0 -169
  458. data/lib/datadog/core/utils/object_set.rb +0 -43
  459. data/lib/datadog/core/utils/string_table.rb +0 -47
  460. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  461. data/lib/datadog/profiling/buffer.rb +0 -43
  462. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  463. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  464. data/lib/datadog/profiling/event.rb +0 -15
  465. data/lib/datadog/profiling/events/stack.rb +0 -82
  466. data/lib/datadog/profiling/old_recorder.rb +0 -107
  467. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  468. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  469. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  470. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  471. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  472. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  473. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  474. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  475. data/lib/datadog/profiling/pprof/template.rb +0 -118
  476. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  477. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  478. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
  479. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  480. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  481. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  482. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  483. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  484. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  485. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  486. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  487. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  488. data/lib/ddtrace/transport/http/api.rb +0 -39
  489. data/lib/ddtrace/transport/http/builder.rb +0 -176
  490. data/lib/ddtrace/transport/http/client.rb +0 -52
  491. data/lib/ddtrace/transport/http/env.rb +0 -58
  492. data/lib/ddtrace/transport/http/response.rb +0 -58
  493. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  494. data/lib/ddtrace/transport/http/traces.rb +0 -144
  495. data/lib/ddtrace/transport/http.rb +0 -117
  496. data/lib/ddtrace/transport/io/client.rb +0 -85
  497. data/lib/ddtrace/transport/io/response.rb +0 -25
  498. data/lib/ddtrace/transport/io/traces.rb +0 -99
  499. data/lib/ddtrace/transport/io.rb +0 -28
  500. data/lib/ddtrace/transport/parcel.rb +0 -20
  501. data/lib/ddtrace/transport/request.rb +0 -15
  502. data/lib/ddtrace/transport/response.rb +0 -60
  503. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  504. data/lib/ddtrace/transport/statistics.rb +0 -75
  505. data/lib/ddtrace/transport/trace_formatter.rb +0 -198
  506. data/lib/ddtrace/transport/traces.rb +0 -216
  507. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.h +0 -0
  508. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.c +0 -0
  509. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.h +0 -0
@@ -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
@@ -22,11 +22,12 @@ module Datadog
22
22
  def watch_request_dispatch(gateway = Instrumentation.gateway)
23
23
  gateway.watch('sinatra.request.dispatch', :appsec) do |stack, gateway_request|
24
24
  block = false
25
+
25
26
  event = nil
26
27
  scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
27
28
 
28
29
  AppSec::Reactive::Operation.new('sinatra.request.dispatch') do |op|
29
- Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result, _block|
30
+ Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result|
30
31
  if result.status == :match
31
32
  # TODO: should this hash be an Event instance instead?
32
33
  event = {
@@ -46,7 +47,7 @@ module Datadog
46
47
  end
47
48
  end
48
49
 
49
- _result, block = Rack::Reactive::RequestBody.publish(op, gateway_request)
50
+ block = Rack::Reactive::RequestBody.publish(op, gateway_request)
50
51
  end
51
52
 
52
53
  next [nil, [[:block, event]]] if block
@@ -65,11 +66,12 @@ module Datadog
65
66
  def watch_request_routed(gateway = Instrumentation.gateway)
66
67
  gateway.watch('sinatra.request.routed', :appsec) do |stack, (gateway_request, gateway_route_params)|
67
68
  block = false
69
+
68
70
  event = nil
69
71
  scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
70
72
 
71
73
  AppSec::Reactive::Operation.new('sinatra.request.routed') do |op|
72
- Sinatra::Reactive::Routed.subscribe(op, scope.processor_context) do |result, _block|
74
+ Sinatra::Reactive::Routed.subscribe(op, scope.processor_context) do |result|
73
75
  if result.status == :match
74
76
  # TODO: should this hash be an Event instance instead?
75
77
  event = {
@@ -89,7 +91,7 @@ module Datadog
89
91
  end
90
92
  end
91
93
 
92
- _result, block = Sinatra::Reactive::Routed.publish(op, [gateway_request, gateway_route_params])
94
+ block = Sinatra::Reactive::Routed.publish(op, [gateway_request, gateway_route_params])
93
95
  end
94
96
 
95
97
  next [nil, [[:block, event]]] if block
@@ -65,9 +65,12 @@ module Datadog
65
65
  catch(Datadog::AppSec::Contrib::Sinatra::Ext::ROUTE_INTERRUPT) { super }
66
66
  end
67
67
 
68
- if request_response && request_response.any? { |action, _event| action == :block }
69
- self.response = AppSec::Response.negotiate(env).to_sinatra_response
70
- request_return = nil
68
+ if request_response
69
+ blocked_event = request_response.find { |action, _options| action == :block }
70
+ if blocked_event
71
+ self.response = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_sinatra_response
72
+ request_return = nil
73
+ end
71
74
  end
72
75
 
73
76
  request_return
@@ -103,11 +106,14 @@ module Datadog
103
106
  [gateway_request, gateway_route_params]
104
107
  )
105
108
 
106
- if request_response && request_response.any? { |action, _event| action == :block }
107
- self.response = AppSec::Response.negotiate(env).to_sinatra_response
109
+ if request_response
110
+ blocked_event = request_response.find { |action, _options| action == :block }
111
+ if blocked_event
112
+ self.response = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_sinatra_response
108
113
 
109
- # interrupt request and return response to dispatch! for consistency
110
- throw(Datadog::AppSec::Contrib::Sinatra::Ext::ROUTE_INTERRUPT, response)
114
+ # interrupt request and return response to dispatch! for consistency
115
+ throw(Datadog::AppSec::Contrib::Sinatra::Ext::ROUTE_INTERRUPT, response)
116
+ end
111
117
  end
112
118
 
113
119
  yield(*args)
@@ -31,7 +31,7 @@ module Datadog
31
31
  'server.request.path_params' => path_params,
32
32
  }
33
33
 
34
- waf_timeout = Datadog::AppSec.settings.waf_timeout
34
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
35
35
  result = waf_context.run(waf_args, waf_timeout)
36
36
 
37
37
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -40,11 +40,8 @@ module Datadog
40
40
  when :match
41
41
  Datadog.logger.debug { "WAF: #{result.inspect}" }
42
42
 
43
- block = result.actions.include?('block')
44
-
45
- yield [result, block]
46
-
47
- throw(:block, [result, true]) if block
43
+ yield result
44
+ throw(:block, true) unless result.actions.empty?
48
45
  when :ok
49
46
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
50
47
  when :invalid_call
@@ -1,4 +1,6 @@
1
1
  require 'json'
2
+ require 'zlib'
3
+ require 'base64'
2
4
 
3
5
  require_relative 'rate_limiter'
4
6
 
@@ -34,78 +36,132 @@ module Datadog
34
36
  Content-Language
35
37
  ].map!(&:downcase).freeze
36
38
 
39
+ MAX_ENCODED_SCHEMA_SIZE = 25000
40
+ # For more information about this number
41
+ # please check https://github.com/DataDog/dd-trace-rb/pull/3177#issuecomment-1747221082
42
+ MIN_SCHEMA_SIZE_FOR_COMPRESSION = 260
43
+
37
44
  # Record events for a trace
38
45
  #
39
46
  # This is expected to be called only once per trace for the rate limiter
40
47
  # to properly apply
41
- def self.record(span, *events)
42
- # ensure rate limiter is called only when there are events to record
43
- return if events.empty?
48
+ class << self
49
+ def record(span, *events)
50
+ # ensure rate limiter is called only when there are events to record
51
+ return if events.empty? || span.nil?
44
52
 
45
- Datadog::AppSec::RateLimiter.limit(:traces) do
46
- record_via_span(span, *events)
53
+ Datadog::AppSec::RateLimiter.limit(:traces) do
54
+ record_via_span(span, *events)
55
+ end
47
56
  end
48
- end
49
57
 
50
- def self.record_via_span(span, *events)
51
- events.group_by { |e| e[:trace] }.each do |trace, event_group|
52
- unless trace
53
- Datadog.logger.debug { "{ error: 'no trace: cannot record', event_group: #{event_group.inspect}}" }
54
- next
55
- end
58
+ def record_via_span(span, *events)
59
+ events.group_by { |e| e[:trace] }.each do |trace, event_group|
60
+ unless trace
61
+ Datadog.logger.debug { "{ error: 'no trace: cannot record', event_group: #{event_group.inspect}}" }
62
+ next
63
+ end
64
+
65
+ trace.keep!
66
+ trace.set_tag(
67
+ Datadog::Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
68
+ Datadog::Tracing::Sampling::Ext::Decision::ASM
69
+ )
56
70
 
57
- trace.keep!
58
- trace.set_tag(
59
- Datadog::Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
60
- Datadog::Tracing::Sampling::Ext::Decision::ASM
61
- )
62
-
63
- # prepare and gather tags to apply
64
- service_entry_tags = build_service_entry_tags(event_group)
65
- # complex types are unsupported, we need to serialize to a string
66
- triggers = service_entry_tags.delete('_dd.appsec.triggers')
67
- span.set_tag('_dd.appsec.json', JSON.dump({ triggers: triggers }))
68
-
69
- # apply tags to service entry span
70
- service_entry_tags.each do |key, value|
71
- span.set_tag(key, value)
71
+ # prepare and gather tags to apply
72
+ service_entry_tags = build_service_entry_tags(event_group)
73
+
74
+ # apply tags to service entry span
75
+ service_entry_tags.each do |key, value|
76
+ span.set_tag(key, value)
77
+ end
72
78
  end
73
79
  end
74
- end
75
80
 
76
- def self.build_service_entry_tags(event_group)
77
- event_group.each_with_object({}) do |event, tags|
78
- # TODO: assume HTTP request context for now
81
+ # rubocop:disable Metrics/MethodLength
82
+ def build_service_entry_tags(event_group)
83
+ waf_events = []
84
+ entry_tags = event_group.each_with_object({ '_dd.origin' => 'appsec' }) do |event, tags|
85
+ # TODO: assume HTTP request context for now
86
+ if (request = event[:request])
87
+ request.headers.each do |header, value|
88
+ tags["http.request.headers.#{header}"] = value if ALLOWED_REQUEST_HEADERS.include?(header.downcase)
89
+ end
90
+
91
+ tags['http.host'] = request.host
92
+ tags['http.useragent'] = request.user_agent
93
+ tags['network.client.ip'] = request.remote_addr
94
+ end
79
95
 
80
- if (request = event[:request])
81
- request_headers = request.headers.select do |k, _|
82
- ALLOWED_REQUEST_HEADERS.include?(k.downcase)
96
+ if (response = event[:response])
97
+ response.headers.each do |header, value|
98
+ tags["http.response.headers.#{header}"] = value if ALLOWED_RESPONSE_HEADERS.include?(header.downcase)
99
+ end
83
100
  end
84
101
 
85
- request_headers.each do |header, value|
86
- tags["http.request.headers.#{header}"] = value
102
+ waf_result = event[:waf_result]
103
+ # accumulate triggers
104
+ waf_events += waf_result.events
105
+
106
+ waf_result.derivatives.each do |key, value|
107
+ parsed_value = json_parse(value)
108
+ next unless parsed_value
109
+
110
+ parsed_value_size = parsed_value.size
111
+
112
+ schema_value = if parsed_value_size >= MIN_SCHEMA_SIZE_FOR_COMPRESSION
113
+ compressed_and_base64_encoded(parsed_value)
114
+ else
115
+ parsed_value
116
+ end
117
+ next unless schema_value
118
+
119
+ if schema_value.size >= MAX_ENCODED_SCHEMA_SIZE
120
+ Datadog.logger.debug do
121
+ "Schema key: #{key} exceeds the max size value. It will not be included as part of the span tags"
122
+ end
123
+ next
124
+ end
125
+
126
+ tags[key] = schema_value
87
127
  end
88
128
 
89
- tags['http.host'] = request.host
90
- tags['http.useragent'] = request.user_agent
91
- tags['network.client.ip'] = request.remote_addr
129
+ tags
92
130
  end
93
131
 
94
- if (response = event[:response])
95
- response_headers = response.headers.select do |k, _|
96
- ALLOWED_RESPONSE_HEADERS.include?(k.downcase)
97
- end
132
+ appsec_events = json_parse({ triggers: waf_events })
133
+ entry_tags['_dd.appsec.json'] = appsec_events if appsec_events
134
+ entry_tags
135
+ end
136
+ # rubocop:enable Metrics/MethodLength
98
137
 
99
- response_headers.each do |header, value|
100
- tags["http.response.headers.#{header}"] = value
101
- end
138
+ private
139
+
140
+ def compressed_and_base64_encoded(value)
141
+ Base64.strict_encode64(gzip(value))
142
+ rescue TypeError => e
143
+ Datadog.logger.debug do
144
+ "Failed to compress and encode value when populating AppSec::Event. Error: #{e.message}"
102
145
  end
146
+ nil
147
+ end
103
148
 
104
- tags['_dd.origin'] = 'appsec'
149
+ def json_parse(value)
150
+ JSON.dump(value)
151
+ rescue ArgumentError => e
152
+ Datadog.logger.debug do
153
+ "Failed to parse value to JSON when populating AppSec::Event. Error: #{e.message}"
154
+ end
155
+ nil
156
+ end
105
157
 
106
- # accumulate triggers
107
- tags['_dd.appsec.triggers'] ||= []
108
- tags['_dd.appsec.triggers'] += event[:waf_result].data
158
+ def gzip(value)
159
+ sio = StringIO.new
160
+ # For an in depth comparison of Zlib options check https://github.com/DataDog/dd-trace-rb/pull/3177#issuecomment-1747215473
161
+ gz = Zlib::GzipWriter.new(sio, Zlib::BEST_SPEED, Zlib::DEFAULT_STRATEGY)
162
+ gz.write(value)
163
+ gz.close
164
+ sio.string
109
165
  end
110
166
  end
111
167
  end
@@ -8,136 +8,7 @@ module Datadog
8
8
  module Extensions
9
9
  # Inject AppSec into global objects.
10
10
  def self.activate!
11
- Core::Configuration::Settings.include(Settings)
12
- end
13
-
14
- # Global Datadog configuration mixin
15
- module Settings
16
- # Exposes AppSec settings through the
17
- # `Datadog.configure {|c| c.appsec._option_ }`
18
- # configuration path.
19
- def appsec
20
- @appsec ||= AppSecAdapter.new(AppSec.settings)
21
- end
22
- end
23
-
24
- # Merges {Datadog::AppSec::Configuration::Settings} and {Datadog::AppSec::Configuration::DSL}
25
- # into a single read/write object.
26
- class AppSecAdapter
27
- def initialize(settings)
28
- @settings = settings
29
- end
30
-
31
- # Writer methods
32
-
33
- def instrument(name, _unused = {})
34
- dsl = AppSec::Configuration::DSL.new
35
- dsl.instrument(name)
36
- @settings.merge(dsl)
37
- end
38
-
39
- def enabled=(arg)
40
- dsl = AppSec::Configuration::DSL.new
41
- dsl.enabled = arg
42
- @settings.merge(dsl)
43
- end
44
-
45
- def ruleset=(arg)
46
- dsl = AppSec::Configuration::DSL.new
47
- dsl.ruleset = arg
48
- @settings.merge(dsl)
49
- end
50
-
51
- def ip_denylist=(arg)
52
- dsl = AppSec::Configuration::DSL.new
53
- dsl.ip_denylist = arg
54
- @settings.merge(dsl)
55
- end
56
-
57
- def user_id_denylist=(arg)
58
- dsl = AppSec::Configuration::DSL.new
59
- dsl.user_id_denylist = arg
60
- @settings.merge(dsl)
61
- end
62
-
63
- def waf_timeout=(arg)
64
- dsl = AppSec::Configuration::DSL.new
65
- dsl.waf_timeout = arg
66
- @settings.merge(dsl)
67
- end
68
-
69
- def waf_debug=(arg)
70
- dsl = AppSec::Configuration::DSL.new
71
- dsl.waf_debug = arg
72
- @settings.merge(dsl)
73
- end
74
-
75
- def trace_rate_limit=(arg)
76
- dsl = AppSec::Configuration::DSL.new
77
- dsl.trace_rate_limit = arg
78
- @settings.merge(dsl)
79
- end
80
-
81
- def obfuscator_key_regex=(arg)
82
- dsl = AppSec::Configuration::DSL.new
83
- dsl.obfuscator_key_regex = arg
84
- @settings.merge(dsl)
85
- end
86
-
87
- def obfuscator_value_regex=(arg)
88
- dsl = AppSec::Configuration::DSL.new
89
- dsl.obfuscator_value_regex = arg
90
- @settings.merge(dsl)
91
- end
92
-
93
- # Reader methods
94
-
95
- def enabled
96
- @settings.enabled
97
- end
98
-
99
- def ruleset
100
- @settings.ruleset
101
- end
102
-
103
- def ip_denylist
104
- @settings.ip_denylist
105
- end
106
-
107
- def user_id_denylist
108
- @settings.user_id_denylist
109
- end
110
-
111
- def waf_timeout
112
- @settings.waf_timeout
113
- end
114
-
115
- def waf_debug
116
- @settings.waf_debug
117
- end
118
-
119
- def trace_rate_limit
120
- @settings.trace_rate_limit
121
- end
122
-
123
- def obfuscator_key_regex
124
- @settings.obfuscator_key_regex
125
- end
126
-
127
- def obfuscator_value_regex
128
- @settings.obfuscator_key_regex
129
- end
130
-
131
- def merge(arg)
132
- @settings.merge(arg)
133
- end
134
-
135
- private
136
-
137
- # Restore to original state, for testing only.
138
- def reset!
139
- @settings.send(:reset!)
140
- end
11
+ Core::Configuration::Settings.extend(Configuration::Settings)
141
12
  end
142
13
  end
143
14
  end
@@ -24,7 +24,7 @@ module Datadog
24
24
  scope = Datadog::AppSec.active_scope
25
25
 
26
26
  AppSec::Reactive::Operation.new('identity.set_user') do |op|
27
- Monitor::Reactive::SetUser.subscribe(op, scope.processor_context) do |result, _block|
27
+ Monitor::Reactive::SetUser.subscribe(op, scope.processor_context) do |result|
28
28
  if result.status == :match
29
29
  # TODO: should this hash be an Event instance instead?
30
30
  event = {
@@ -44,10 +44,10 @@ module Datadog
44
44
  end
45
45
  end
46
46
 
47
- _result, block = Monitor::Reactive::SetUser.publish(op, user)
47
+ block = Monitor::Reactive::SetUser.publish(op, user)
48
48
  end
49
49
 
50
- throw(Datadog::AppSec::Ext::INTERRUPT, [nil, [:block, event]]) if block
50
+ throw(Datadog::AppSec::Ext::INTERRUPT, [nil, [[:block, event]]]) if block
51
51
 
52
52
  ret, res = stack.call(user)
53
53
 
@@ -29,7 +29,7 @@ module Datadog
29
29
  'usr.id' => user_id,
30
30
  }
31
31
 
32
- waf_timeout = Datadog::AppSec.settings.waf_timeout
32
+ waf_timeout = Datadog.configuration.appsec.waf_timeout
33
33
  result = waf_context.run(waf_args, waf_timeout)
34
34
 
35
35
  Datadog.logger.debug { "WAF TIMEOUT: #{result.inspect}" } if result.timeout
@@ -38,11 +38,8 @@ module Datadog
38
38
  when :match
39
39
  Datadog.logger.debug { "WAF: #{result.inspect}" }
40
40
 
41
- block = result.actions.include?('block')
42
-
43
- yield [result, block]
44
-
45
- throw(:block, [result, true]) if block
41
+ yield result
42
+ throw(:block, true) unless result.actions.empty?
46
43
  when :ok
47
44
  Datadog.logger.debug { "WAF OK: #{result.inspect}" }
48
45
  when :invalid_call
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module AppSec
5
+ class Processor
6
+ # Actions store the actions information in memory
7
+ # Also, takes care of merging when RC send new information
8
+ module Actions
9
+ class << self
10
+ def actions
11
+ @actions ||= []
12
+ end
13
+
14
+ def fecth_configuration(action)
15
+ actions.find { |action_configuration| action_configuration['id'] == action }
16
+ end
17
+
18
+ def merge(actions_to_merge)
19
+ return if actions_to_merge.empty?
20
+
21
+ if actions.empty?
22
+ @actions = actions_to_merge
23
+ else
24
+ merged_actions = []
25
+ actions_dup = actions.dup
26
+
27
+ actions_to_merge.each do |new_action|
28
+ existing_action = actions_dup.find { |action| new_action['id'] == action['id'] }
29
+
30
+ # the old action is discard and the new kept
31
+ actions_dup.delete(existing_action) if existing_action
32
+ merged_actions << new_action
33
+ end
34
+
35
+ @actions = merged_actions.concat(actions_dup)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ # Used in tests
42
+ def reset
43
+ @actions = []
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end