datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -1,114 +0,0 @@
1
- [
2
- {
3
- "id": "d962f7ddb3f55041e39195a60ff79d4814a7c331",
4
- "name": "US Passport Scanner",
5
- "key": {
6
- "operator": "match_regex",
7
- "parameters": {
8
- "regex": "passport",
9
- "options": {
10
- "case_sensitive": false,
11
- "min_length": 8
12
- }
13
- }
14
- },
15
- "value": {
16
- "operator": "match_regex",
17
- "parameters": {
18
- "regex": "\\b[0-9A-Z]{9}\\b|\\b[0-9]{6}[A-Z][0-9]{2}\\b",
19
- "options": {
20
- "case_sensitive": false,
21
- "min_length": 8
22
- }
23
- }
24
- },
25
- "tags": {
26
- "type": "passport_number",
27
- "category": "pii"
28
- }
29
- },
30
- {
31
- "id": "ac6d683cbac77f6e399a14990793dd8fd0fca333",
32
- "name": "US Vehicle Identification Number Scanner",
33
- "key": {
34
- "operator": "match_regex",
35
- "parameters": {
36
- "regex": "vehicle[_\\s-]*identification[_\\s-]*number|vin",
37
- "options": {
38
- "case_sensitive": false,
39
- "min_length": 3
40
- }
41
- }
42
- },
43
- "value": {
44
- "operator": "match_regex",
45
- "parameters": {
46
- "regex": "\\b[A-HJ-NPR-Z0-9]{17}\\b",
47
- "options": {
48
- "case_sensitive": false,
49
- "min_length": 17
50
- }
51
- }
52
- },
53
- "tags": {
54
- "type": "vin",
55
- "category": "pii"
56
- }
57
- },
58
- {
59
- "id": "de0899e0cbaaa812bb624cf04c912071012f616d",
60
- "name": "UK National Insurance Number Scanner",
61
- "key": {
62
- "operator": "match_regex",
63
- "parameters": {
64
- "regex": "national[\\s_]?(?:insurance(?:\\s+number)?)?|NIN|NI[\\s_]?number|insurance[\\s_]?number",
65
- "options": {
66
- "case_sensitive": false,
67
- "min_length": 3
68
- }
69
- }
70
- },
71
- "value": {
72
- "operator": "match_regex",
73
- "parameters": {
74
- "regex": "\\b[A-Z]{2}\\d{6}[A-Z]?\\b",
75
- "options": {
76
- "case_sensitive": false,
77
- "min_length": 8
78
- }
79
- }
80
- },
81
- "tags": {
82
- "type": "uk_nin",
83
- "category": "pii"
84
- }
85
- },
86
- {
87
- "id": "450239afc250a19799b6c03dc0e16fd6a4b2a1af",
88
- "name": "Canadian Social Insurance Number Scanner",
89
- "key": {
90
- "operator": "match_regex",
91
- "parameters": {
92
- "regex": "social[\\s_]?(?:insurance(?:\\s+number)?)?|SIN|Canadian[\\s_]?(?:social[\\s_]?(?:insurance)?|insurance[\\s_]?number)?",
93
- "options": {
94
- "case_sensitive": false,
95
- "min_length": 3
96
- }
97
- }
98
- },
99
- "value": {
100
- "operator": "match_regex",
101
- "parameters": {
102
- "regex": "\\b\\d{3}-\\d{3}-\\d{3}\\b",
103
- "options": {
104
- "case_sensitive": false,
105
- "min_length": 11
106
- }
107
- }
108
- },
109
- "tags": {
110
- "type": "canadian_sin",
111
- "category": "pii"
112
- }
113
- }
114
- ]
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Devise
7
- # Class to extract event information from the resource
8
- class Event
9
- UUID_REGEX = /^\h{8}-\h{4}-\h{4}-\h{4}-\h{12}$/.freeze
10
-
11
- attr_reader :user_id
12
-
13
- def initialize(resource, mode)
14
- @resource = resource
15
- @mode = mode
16
- @user_id = nil
17
- @email = nil
18
- @username = nil
19
-
20
- extract if @resource
21
- end
22
-
23
- def to_h
24
- return @event if defined?(@event)
25
-
26
- @event = {}
27
- @event[:email] = @email if @email
28
- @event[:username] = @username if @username
29
- @event
30
- end
31
-
32
- private
33
-
34
- def extract
35
- @user_id = @resource.id
36
-
37
- case @mode
38
- when AppSec::Configuration::Settings::IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
39
- @email = @resource.email
40
- @username = @resource.username
41
- when AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE
42
- @user_id = nil unless @user_id && @user_id.to_s =~ UUID_REGEX
43
- else
44
- Datadog.logger.warn(
45
- "Invalid auto_user_instrumentation.mode: `#{@mode}`. " \
46
- "Supported modes are: #{AppSec::Configuration::Settings::AUTO_USER_INSTRUMENTATION_MODES.join(' | ')}."
47
- )
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../configuration'
4
- require_relative '../tracking'
5
- require_relative '../resource'
6
- require_relative '../event'
7
-
8
- module Datadog
9
- module AppSec
10
- module Contrib
11
- module Devise
12
- module Patcher
13
- # Hook in devise validate method
14
- module AuthenticatablePatch
15
- # rubocop:disable Metrics/MethodLength
16
- def validate(resource, &block)
17
- result = super
18
-
19
- return result unless AppSec.enabled?
20
- return result if @_datadog_appsec_skip_track_login_event
21
- return result unless Configuration.auto_user_instrumentation_enabled?
22
- return result unless AppSec.active_context
23
-
24
- devise_resource = resource ? Resource.new(resource) : nil
25
- event_information = Event.new(devise_resource, Configuration.auto_user_instrumentation_mode)
26
-
27
- if result
28
- if event_information.user_id
29
- Datadog.logger.debug { 'AppSec: User successful login event' }
30
- else
31
- Datadog.logger.debug do
32
- "AppSec: User successful login event, but can't extract user ID. Tracking empty event"
33
- end
34
- end
35
-
36
- Tracking.track_login_success(
37
- AppSec.active_context.trace,
38
- AppSec.active_context.span,
39
- user_id: event_information.user_id,
40
- **event_information.to_h
41
- )
42
-
43
- return result
44
- end
45
-
46
- user_exists = nil
47
-
48
- if resource
49
- user_exists = true
50
- Datadog.logger.debug { 'AppSec: User failed login event, but user exists' }
51
- else
52
- user_exists = false
53
- Datadog.logger.debug { 'AppSec: User failed login event and user does not exist' }
54
- end
55
-
56
- Tracking.track_login_failure(
57
- AppSec.active_context.trace,
58
- AppSec.active_context.span,
59
- user_id: event_information.user_id,
60
- user_exists: user_exists,
61
- **event_information.to_h
62
- )
63
-
64
- result
65
- end
66
- # rubocop:enable Metrics/MethodLength
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../configuration'
4
- require_relative '../tracking'
5
- require_relative '../resource'
6
- require_relative '../event'
7
-
8
- module Datadog
9
- module AppSec
10
- module Contrib
11
- module Devise
12
- module Patcher
13
- # Hook in devise registration controller
14
- module RegistrationControllerPatch
15
- def create
16
- return super unless AppSec.enabled?
17
- return super unless Configuration.auto_user_instrumentation_enabled?
18
- return super unless AppSec.active_context
19
-
20
- super do |resource|
21
- if resource.persisted?
22
- devise_resource = Resource.new(resource)
23
- event_information = Event.new(devise_resource, Configuration.auto_user_instrumentation_mode)
24
-
25
- if event_information.user_id
26
- Datadog.logger.debug { 'AppSec: User signup event' }
27
- else
28
- Datadog.logger.warn { "AppSec: User signup event, but can't extract user ID. Tracking empty event" }
29
- end
30
-
31
- Tracking.track_signup(
32
- AppSec.active_context.trace,
33
- AppSec.active_context.span,
34
- user_id: event_information.user_id,
35
- **event_information.to_h
36
- )
37
- end
38
-
39
- yield resource if block_given?
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Devise
7
- # Class to encpasulate extracting information from a Devise resource
8
- # Normally a devise resource would be an Active::Record instance
9
- class Resource
10
- def initialize(resource)
11
- @resource = resource
12
- end
13
-
14
- def id
15
- extract(:id) || extract(:uuid)
16
- end
17
-
18
- def email
19
- extract(:email)
20
- end
21
-
22
- def username
23
- extract(:username)
24
- end
25
-
26
- private
27
-
28
- def extract(method)
29
- @resource.send(method) if @resource.respond_to?(method)
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../kit/identity'
4
-
5
- module Datadog
6
- module AppSec
7
- module Contrib
8
- module Devise
9
- # Internal module to track user events
10
- module Tracking
11
- LOGIN_SUCCESS_EVENT = 'users.login.success'
12
- LOGIN_FAILURE_EVENT = 'users.login.failure'
13
- SIGNUP_EVENT = 'users.signup'
14
-
15
- def self.track_login_success(trace, span, user_id:, **others)
16
- return if trace.nil? || span.nil?
17
-
18
- track(LOGIN_SUCCESS_EVENT, trace, span, **others)
19
-
20
- Kit::Identity.set_user(trace, span, id: user_id.to_s, **others) if user_id
21
- end
22
-
23
- def self.track_login_failure(trace, span, user_id:, user_exists:, **others)
24
- return if trace.nil? || span.nil?
25
-
26
- track(LOGIN_FAILURE_EVENT, trace, span, **others)
27
-
28
- span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
29
- span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists)
30
- end
31
-
32
- def self.track_signup(trace, span, user_id:, **others)
33
- return if trace.nil? || span.nil?
34
-
35
- track(SIGNUP_EVENT, trace, span, **others)
36
- Kit::Identity.set_user(trace, id: user_id.to_s, **others) if user_id
37
- end
38
-
39
- def self.track(event, trace, span, **others)
40
- return if trace.nil? || span.nil?
41
-
42
- span.set_tag("appsec.events.#{event}.track", 'true')
43
- span.set_tag("_dd.appsec.events.#{event}.auto.mode", Configuration.track_user_events_mode)
44
-
45
- others.each do |k, v|
46
- raise ArgumentError, 'key cannot be :track' if k.to_sym == :track
47
-
48
- span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
49
- end
50
-
51
- trace.keep!
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,170 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../assets'
4
-
5
- module Datadog
6
- module AppSec
7
- class Processor
8
- # RuleMerger merge different sources of information
9
- # into the rules payload
10
- module RuleMerger
11
- # RuleVersionMismatchError
12
- class RuleVersionMismatchError < StandardError
13
- def initialize(version1, version2)
14
- msg = 'Merging rule files with different version could lead to unkown behaviour. '\
15
- "We have receieve two rule files with versions: #{version1}, #{version2}. "\
16
- 'Please validate the configuration is correct and try again.'
17
- super(msg)
18
- end
19
- end
20
-
21
- class << self
22
- # TODO: `processors` and `scanners` are not provided by the caller, consider removing them
23
- def merge(
24
- telemetry:,
25
- rules:, data: [], overrides: [], exclusions: [], custom_rules: [],
26
- processors: nil, scanners: nil
27
- )
28
- processors ||= begin
29
- default_waf_processors
30
- rescue StandardError => e
31
- Datadog.logger.error("libddwaf rulemerger failed to parse default waf processors. Error: #{e.inspect}")
32
- telemetry.report(
33
- e,
34
- description: 'libddwaf rulemerger failed to parse default waf processors'
35
- )
36
- []
37
- end
38
-
39
- scanners ||= begin
40
- default_waf_scanners
41
- rescue StandardError => e
42
- Datadog.logger.error("libddwaf rulemerger failed to parse default waf scanners. Error: #{e.inspect}")
43
- telemetry.report(
44
- e,
45
- description: 'libddwaf rulemerger failed to parse default waf scanners'
46
- )
47
- []
48
- end
49
-
50
- combined_rules = combine_rules(rules)
51
-
52
- combined_data = combine_data(data) if data.any?
53
- combined_overrides = combine_overrides(overrides) if overrides.any?
54
- combined_exclusions = combine_exclusions(exclusions) if exclusions.any?
55
- combined_custom_rules = combine_custom_rules(custom_rules) if custom_rules.any?
56
-
57
- combined_rules['rules_data'] = combined_data if combined_data
58
- combined_rules['rules_override'] = combined_overrides if combined_overrides
59
- combined_rules['exclusions'] = combined_exclusions if combined_exclusions
60
- combined_rules['custom_rules'] = combined_custom_rules if combined_custom_rules
61
- combined_rules['processors'] = processors
62
- combined_rules['scanners'] = scanners
63
- combined_rules
64
- end
65
-
66
- def default_waf_processors
67
- @default_waf_processors ||= JSON.parse(Datadog::AppSec::Assets.waf_processors)
68
- end
69
-
70
- def default_waf_scanners
71
- @default_waf_scanners ||= JSON.parse(Datadog::AppSec::Assets.waf_scanners)
72
- end
73
-
74
- private
75
-
76
- def combine_rules(rules)
77
- return rules[0].dup if rules.size == 1
78
-
79
- final_rules = []
80
- # @type var final_version: ::String
81
- final_version = (_ = nil)
82
-
83
- rules.each do |rule_file|
84
- version = rule_file['version']
85
-
86
- if version && !final_version
87
- final_version = version
88
- elsif final_version != version
89
- raise RuleVersionMismatchError.new(final_version, version)
90
- end
91
-
92
- final_rules.concat(rule_file['rules'])
93
- end
94
-
95
- {
96
- 'version' => final_version,
97
- 'rules' => final_rules
98
- }
99
- end
100
-
101
- def combine_data(data)
102
- result = []
103
-
104
- data.each do |data_entry|
105
- data_entry.each do |value|
106
- existing_data = result.find { |x| x['id'] == value['id'] }
107
-
108
- if existing_data && existing_data['type'] == value['type']
109
- # Duplicate entry base on type and id
110
- # We need to merge the existing data with the new one
111
- # and make sure to remove duplicates
112
- merged_data = merge_data_base_on_expiration(existing_data['data'], value['data'])
113
- existing_data['data'] = merged_data
114
- else
115
- result << value
116
- end
117
- end
118
- end
119
-
120
- return unless result.any?
121
-
122
- result
123
- end
124
-
125
- def merge_data_base_on_expiration(data1, data2)
126
- result = data1.each_with_object({}) do |value, acc|
127
- acc[value['value']] = value['expiration']
128
- end
129
-
130
- data2.each do |data|
131
- if result.key?(data['value'])
132
- # The value is duplicated so we need to keep
133
- # the one with the highest expiration value
134
- # We replace it if the expiration is higher than the current one
135
- # or if no experiration
136
- current_expiration = result[data['value']]
137
- new_expiration = data['expiration']
138
-
139
- if new_expiration.nil? || current_expiration && new_expiration > current_expiration
140
- result[data['value']] = new_expiration
141
- end
142
- else
143
- result[data['value']] = data['expiration']
144
- end
145
- end
146
-
147
- result.each_with_object([]) do |entry, acc|
148
- value = { 'value' => entry[0] }
149
- value['expiration'] = entry[1] if entry[1]
150
-
151
- acc << value
152
- end
153
- end
154
-
155
- def combine_overrides(overrides)
156
- overrides.flatten
157
- end
158
-
159
- def combine_exclusions(exclusions)
160
- exclusions.flatten
161
- end
162
-
163
- def combine_custom_rules(custom_rules)
164
- custom_rules.flatten
165
- end
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'security_engine/runner'
4
-
5
- module Datadog
6
- module AppSec
7
- # Processor integrates libddwaf into datadog/appsec
8
- # NOTE: This class will be moved under AppSec::SecurityEngine namespace
9
- class Processor
10
- attr_reader :diagnostics, :addresses
11
-
12
- def initialize(ruleset:, telemetry:)
13
- @telemetry = telemetry
14
- @diagnostics = nil
15
- @addresses = []
16
-
17
- settings = Datadog.configuration.appsec
18
-
19
- # TODO: Refactor to make it easier to test
20
- unless require_libddwaf && libddwaf_provides_waf? && create_waf_handle(settings, ruleset)
21
- Datadog.logger.warn('AppSec is disabled, see logged errors above')
22
- end
23
- end
24
-
25
- def ready?
26
- !@handle.nil?
27
- end
28
-
29
- def finalize
30
- @handle.finalize
31
- end
32
-
33
- def new_runner
34
- SecurityEngine::Runner.new(@handle, telemetry: @telemetry)
35
- end
36
-
37
- private
38
-
39
- # libddwaf raises a LoadError on unsupported platforms; it may at some
40
- # point succeed in being required yet not provide a specific needed feature.
41
- def require_libddwaf
42
- Datadog.logger.debug { "libddwaf platform: #{libddwaf_platform}" }
43
-
44
- require 'libddwaf'
45
-
46
- true
47
- rescue LoadError => e
48
- Datadog.logger.error do
49
- 'libddwaf failed to load,' \
50
- "installed platform: #{libddwaf_platform} ruby platforms: #{ruby_platforms} error: #{e.inspect}"
51
- end
52
- @telemetry.report(e, description: 'libddwaf failed to load')
53
-
54
- false
55
- end
56
-
57
- # check whether libddwaf is required *and* able to provide the needed feature
58
- def libddwaf_provides_waf?
59
- defined?(Datadog::AppSec::WAF) ? true : false
60
- end
61
-
62
- def create_waf_handle(settings, ruleset)
63
- # TODO: this may need to be reset if the main Datadog logging level changes after initialization
64
- Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.waf_debug
65
-
66
- obfuscator_config = {
67
- key_regex: settings.obfuscator_key_regex,
68
- value_regex: settings.obfuscator_value_regex,
69
- }
70
-
71
- @handle = Datadog::AppSec::WAF::Handle.new(ruleset, obfuscator: obfuscator_config)
72
- @diagnostics = @handle.diagnostics
73
- @addresses = @handle.required_addresses
74
-
75
- true
76
- rescue WAF::LibDDWAF::Error => e
77
- Datadog.logger.error do
78
- "libddwaf failed to initialize, error: #{e.inspect}"
79
- end
80
- @telemetry.report(e, description: 'libddwaf failed to initialize')
81
-
82
- @diagnostics = e.diagnostics if e.diagnostics
83
-
84
- false
85
- rescue StandardError => e
86
- Datadog.logger.error do
87
- "libddwaf failed to initialize, error: #{e.inspect}"
88
- end
89
- @telemetry.report(e, description: 'libddwaf failed to initialize')
90
-
91
- false
92
- end
93
-
94
- def libddwaf_platform
95
- if Gem.loaded_specs['libddwaf']
96
- Gem.loaded_specs['libddwaf'].platform.to_s
97
- else
98
- 'unknown'
99
- end
100
- end
101
-
102
- def ruby_platforms
103
- Gem.platforms.map(&:to_s)
104
- end
105
- end
106
- end
107
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Utils
6
- # Utility class to to AppSec-specific trace operations
7
- class TraceOperation
8
- def self.appsec_standalone_reject?(trace)
9
- Datadog.configuration.appsec.standalone.enabled &&
10
- (trace.nil? || trace.get_tag(Datadog::AppSec::Ext::TAG_DISTRIBUTED_APPSEC_EVENT) != '1')
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module Core
5
- module Telemetry
6
- module Http
7
- # Data structure for an HTTP request
8
- class Env
9
- attr_accessor :path, :body
10
-
11
- attr_writer :headers
12
-
13
- def headers
14
- @headers ||= {}
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end