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
@@ -0,0 +1,287 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'app-started' event
10
+ class AppStarted < Base
11
+ def initialize(agent_settings:)
12
+ @agent_settings = agent_settings
13
+ end
14
+
15
+ def type
16
+ 'app-started'
17
+ end
18
+
19
+ def payload
20
+ {
21
+ products: products,
22
+ configuration: configuration,
23
+ install_signature: install_signature,
24
+ # DEV: Not implemented yet
25
+ # error: error, # Start-up errors
26
+ }
27
+ end
28
+
29
+ private
30
+
31
+ def products
32
+ # @type var products: Hash[Symbol, Hash[Symbol, Hash[Symbol, String | Integer] | bool | nil]]
33
+ products = {
34
+ appsec: {
35
+ enabled: Datadog::AppSec.enabled?,
36
+ },
37
+ profiler: {
38
+ enabled: Datadog::Profiling.enabled?,
39
+ },
40
+ dynamic_instrumentation: {
41
+ enabled: defined?(Datadog::DI) && Datadog::DI.respond_to?(:enabled?) && Datadog::DI.enabled?,
42
+ }
43
+ }
44
+
45
+ if (unsupported_reason = Datadog::Profiling.unsupported_reason)
46
+ products[:profiler][:error] = {
47
+ code: 1, # Error code. 0 if no error.
48
+ message: unsupported_reason,
49
+ }
50
+ end
51
+
52
+ products
53
+ end
54
+
55
+ TARGET_OPTIONS = %w[
56
+ dynamic_instrumentation.enabled
57
+ logger.level
58
+ profiling.advanced.code_provenance_enabled
59
+ profiling.advanced.endpoint.collection.enabled
60
+ profiling.enabled
61
+ runtime_metrics.enabled
62
+ tracing.analytics.enabled
63
+ tracing.propagation_style_extract
64
+ tracing.propagation_style_inject
65
+ tracing.enabled
66
+ tracing.log_injection
67
+ tracing.partial_flush.enabled
68
+ tracing.partial_flush.min_spans_threshold
69
+ tracing.report_hostname
70
+ tracing.sampling.rate_limit
71
+ apm.tracing.enabled
72
+ ].freeze
73
+
74
+ # standard:disable Metrics/AbcSize
75
+ # standard:disable Metrics/MethodLength
76
+ def configuration
77
+ config = Datadog.configuration
78
+ seq_id = Event.configuration_sequence.next
79
+
80
+ # tracing.writer_options.buffer_size and tracing.writer_options.flush_interval have the same origin.
81
+ writer_option_origin = get_telemetry_origin(config, 'tracing.writer_options')
82
+
83
+ list = [
84
+ # Only set using env var as of June 2025
85
+ conf_value('DD_GIT_REPOSITORY_URL', Core::Environment::Git.git_repository_url, seq_id, 'env_var'),
86
+ conf_value('DD_GIT_COMMIT_SHA', Core::Environment::Git.git_commit_sha, seq_id, 'env_var'),
87
+
88
+ # Set by the customer application (eg. `require 'datadog/auto_instrument'`)
89
+ conf_value(
90
+ 'tracing.auto_instrument.enabled',
91
+ !defined?(Datadog::AutoInstrument::LOADED).nil?,
92
+ seq_id,
93
+ 'code'
94
+ ),
95
+ conf_value(
96
+ 'tracing.opentelemetry.enabled',
97
+ !defined?(Datadog::OpenTelemetry::LOADED).nil?,
98
+ seq_id,
99
+ 'code'
100
+ ),
101
+
102
+ # Mix of env var, programmatic and default config, so we use unknown
103
+ conf_value('DD_AGENT_TRANSPORT', agent_transport, seq_id, 'unknown'),
104
+
105
+ # writer_options is defined as an option that has a Hash value.
106
+ conf_value(
107
+ 'tracing.writer_options.buffer_size',
108
+ to_value(config.tracing.writer_options[:buffer_size]),
109
+ seq_id,
110
+ writer_option_origin
111
+ ),
112
+ conf_value(
113
+ 'tracing.writer_options.flush_interval',
114
+ to_value(config.tracing.writer_options[:flush_interval]),
115
+ seq_id,
116
+ writer_option_origin
117
+ ),
118
+
119
+ conf_value('DD_AGENT_HOST', config.agent.host, seq_id, get_telemetry_origin(config, 'agent.host')),
120
+ conf_value(
121
+ 'DD_TRACE_SAMPLE_RATE',
122
+ to_value(config.tracing.sampling.default_rate),
123
+ seq_id,
124
+ get_telemetry_origin(config, 'tracing.sampling.default_rate')
125
+ ),
126
+ conf_value(
127
+ 'DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED',
128
+ config.tracing.contrib.global_default_service_name.enabled,
129
+ seq_id,
130
+ get_telemetry_origin(config, 'tracing.contrib.global_default_service_name.enabled')
131
+ ),
132
+ conf_value(
133
+ 'DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED',
134
+ config.tracing.contrib.peer_service_defaults,
135
+ seq_id,
136
+ get_telemetry_origin(config, 'tracing.contrib.peer_service_defaults')
137
+ ),
138
+ conf_value(
139
+ 'DD_TRACE_DEBUG',
140
+ config.diagnostics.debug,
141
+ seq_id,
142
+ get_telemetry_origin(config, 'diagnostics.debug')
143
+ )
144
+ ]
145
+
146
+ peer_service_mapping_str = ''
147
+ unless config.tracing.contrib.peer_service_mapping.empty?
148
+ peer_service_mapping = config.tracing.contrib.peer_service_mapping
149
+ peer_service_mapping_str = peer_service_mapping.map { |key, value| "#{key}:#{value}" }.join(',')
150
+ end
151
+ list << conf_value(
152
+ 'DD_TRACE_PEER_SERVICE_MAPPING',
153
+ peer_service_mapping_str,
154
+ seq_id,
155
+ get_telemetry_origin(config, 'tracing.contrib.peer_service_mapping')
156
+ )
157
+
158
+ # Whitelist of configuration options to send in additional payload object
159
+ TARGET_OPTIONS.each do |option_path|
160
+ split_option = option_path.split('.')
161
+ list << conf_value(
162
+ option_path,
163
+ to_value(config.dig(*split_option)),
164
+ seq_id,
165
+ get_telemetry_origin(config, option_path)
166
+ )
167
+ end
168
+
169
+ instrumentation_source = if Datadog.const_defined?(:SingleStepInstrument, false) &&
170
+ Datadog::SingleStepInstrument.const_defined?(:LOADED, false) &&
171
+ Datadog::SingleStepInstrument::LOADED
172
+ 'ssi'
173
+ else
174
+ 'manual'
175
+ end
176
+ # Track ssi configurations
177
+ list.push(
178
+ conf_value('instrumentation_source', instrumentation_source, seq_id, 'code'),
179
+ conf_value('DD_INJECT_FORCE', Core::Environment::VariableHelpers.env_to_bool('DD_INJECT_FORCE', false), seq_id, 'env_var'),
180
+ conf_value('DD_INJECTION_ENABLED', ENV['DD_INJECTION_ENABLED'] || '', seq_id, 'env_var'),
181
+ )
182
+
183
+ # Add some more custom additional payload values here
184
+ if config.logger.instance
185
+ list << conf_value(
186
+ 'logger.instance',
187
+ config.logger.instance.class.to_s,
188
+ seq_id,
189
+ get_telemetry_origin(config, 'logger.instance')
190
+ )
191
+ end
192
+ if config.respond_to?('appsec')
193
+ list << conf_value(
194
+ 'appsec.enabled',
195
+ config.dig('appsec', 'enabled'),
196
+ seq_id,
197
+ get_telemetry_origin(config, 'appsec.enabled')
198
+ )
199
+ list << conf_value(
200
+ 'appsec.sca_enabled',
201
+ config.dig('appsec', 'sca_enabled'),
202
+ seq_id,
203
+ get_telemetry_origin(config, 'appsec.sca_enabled')
204
+ )
205
+ end
206
+ if config.respond_to?('ci')
207
+ list << conf_value(
208
+ 'ci.enabled',
209
+ config.dig('ci', 'enabled'),
210
+ seq_id,
211
+ get_telemetry_origin(config, 'ci.enabled')
212
+ )
213
+ end
214
+
215
+ list.reject! { |entry| entry[:value].nil? }
216
+ list
217
+ end
218
+ # standard:enable Metrics/AbcSize
219
+ # standard:enable Metrics/MethodLength
220
+
221
+ def agent_transport
222
+ adapter = @agent_settings.adapter
223
+ if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
224
+ 'UDS'
225
+ else
226
+ 'TCP'
227
+ end
228
+ end
229
+
230
+ # `origin`: Source of the configuration. One of :
231
+ # - `fleet_stable_config`: configuration is set via the fleet automation Datadog UI
232
+ # - `local_stable_config`: configuration set via a user-managed file
233
+ # - `env_var`: configurations that are set through environment variables
234
+ # - `jvm_prop`: JVM system properties passed on the command line
235
+ # - `code`: configurations that are set through the customer application
236
+ # - `dd_config`: set by the dd.yaml file or json
237
+ # - `remote_config`: values that are set using remote config
238
+ # - `app.config`: only applies to .NET
239
+ # - `default`: set when the user has not set any configuration for the key (defaults to a value)
240
+ # - `unknown`: set for cases where it is difficult/not possible to determine the source of a config.
241
+ def conf_value(name, value, seq_id, origin)
242
+ result = {name: name, value: value, origin: origin, seq_id: seq_id}
243
+ if origin == 'fleet_stable_config'
244
+ fleet_id = Core::Configuration::StableConfig.configuration.dig(:fleet, :id)
245
+ result[:config_id] = fleet_id if fleet_id
246
+ elsif origin == 'local_stable_config'
247
+ local_id = Core::Configuration::StableConfig.configuration.dig(:local, :id)
248
+ result[:config_id] = local_id if local_id
249
+ end
250
+ result
251
+ end
252
+
253
+ def to_value(value)
254
+ # TODO: Add float if telemetry starts accepting it
255
+ case value
256
+ when Integer, String, true, false, nil
257
+ value
258
+ else
259
+ value.to_s
260
+ end
261
+ end
262
+
263
+ def install_signature
264
+ config = Datadog.configuration
265
+ {
266
+ install_id: config.dig('telemetry', 'install_id'),
267
+ install_type: config.dig('telemetry', 'install_type'),
268
+ install_time: config.dig('telemetry', 'install_time'),
269
+ }
270
+ end
271
+
272
+ def get_telemetry_origin(config, config_path)
273
+ split_option = config_path.split('.')
274
+ option_name = split_option.pop
275
+ return 'unknown' if option_name.nil?
276
+
277
+ # @type var parent_setting: Core::Configuration::Options
278
+ # @type var option: Core::Configuration::Option
279
+ parent_setting = config.dig(*split_option)
280
+ option = parent_setting.send(:resolve_option, option_name.to_sym)
281
+ option.precedence_set&.origin || 'unknown'
282
+ end
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Event
7
+ # Base class for all Telemetry V2 events.
8
+ class Base
9
+ # The type of the event.
10
+ # It must be one of the stings defined in the Telemetry V2
11
+ # specification for event names.
12
+ def type
13
+ raise NotImplementedError, 'Must be implemented by subclass'
14
+ end
15
+
16
+ # The JSON payload for the event.
17
+ def payload
18
+ {}
19
+ end
20
+
21
+ # Override equality to allow for deduplication
22
+ # The basic implementation is to check if the other object is an instance of the same class.
23
+ # This works for events that have no attributes.
24
+ # For events with attributes, you should override this method to compare the attributes.
25
+ def ==(other)
26
+ other.is_a?(self.class)
27
+ end
28
+
29
+ # @see #==
30
+ alias_method :eql?, :==
31
+
32
+ # @see #==
33
+ def hash
34
+ self.class.hash
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'generate_metrics'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'distributions' event
10
+ class Distributions < GenerateMetrics
11
+ def type
12
+ 'distributions'
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'generate-metrics' event
10
+ class GenerateMetrics < Base
11
+ attr_reader :namespace, :metric_series
12
+
13
+ def type
14
+ 'generate-metrics'
15
+ end
16
+
17
+ def initialize(namespace, metric_series)
18
+ super()
19
+ @namespace = namespace
20
+ @metric_series = metric_series
21
+ end
22
+
23
+ def payload
24
+ {
25
+ namespace: @namespace,
26
+ series: @metric_series.map(&:to_h)
27
+ }
28
+ end
29
+
30
+ def ==(other)
31
+ other.is_a?(GenerateMetrics) && other.namespace == @namespace && other.metric_series == @metric_series
32
+ end
33
+
34
+ alias_method :eql?, :==
35
+
36
+ def hash
37
+ [self.class, @namespace, @metric_series].hash
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'logs' event.
10
+ # Logs with the same content are deduplicated at flush time.
11
+ class Log < Base
12
+ LEVELS = {
13
+ error: 'ERROR',
14
+ warn: 'WARN',
15
+ }.freeze
16
+
17
+ LEVELS_STRING = LEVELS.values.freeze
18
+
19
+ attr_reader :message, :level, :stack_trace, :count
20
+
21
+ def type
22
+ 'logs'
23
+ end
24
+
25
+ # @param message [String] the log message
26
+ # @param level [Symbol, String] the log level. Either :error, :warn, 'ERROR', or 'WARN'.
27
+ # @param stack_trace [String, nil] the stack trace
28
+ # @param count [Integer] the number of times the log was emitted. Used for deduplication.
29
+ def initialize(message:, level:, stack_trace: nil, count: 1)
30
+ super()
31
+ @message = message
32
+ @stack_trace = stack_trace
33
+
34
+ if level.is_a?(String) && LEVELS_STRING.include?(level)
35
+ # String level is used during object copy for deduplication
36
+ @level = level
37
+ elsif level.is_a?(Symbol)
38
+ # Symbol level is used by the regular log emitter user
39
+ @level = LEVELS.fetch(level) { |k| raise ArgumentError, "Invalid log level :#{k}" }
40
+ else
41
+ raise ArgumentError, "Invalid log level #{level}"
42
+ end
43
+
44
+ @count = count
45
+ end
46
+
47
+ def payload
48
+ {
49
+ logs: [
50
+ {
51
+ message: @message,
52
+ level: @level,
53
+ stack_trace: @stack_trace,
54
+ count: @count,
55
+ }.compact
56
+ ]
57
+ }
58
+ end
59
+
60
+ # override equality to allow for deduplication
61
+ def ==(other)
62
+ other.is_a?(Log) &&
63
+ other.message == @message &&
64
+ other.level == @level && other.stack_trace == @stack_trace && other.count == @count
65
+ end
66
+
67
+ alias_method :eql?, :==
68
+
69
+ def hash
70
+ [self.class, @message, @level, @stack_trace, @count].hash
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Event
7
+ # Telemetry class for the 'message-batch' event.
8
+ class MessageBatch < Base
9
+ attr_reader :events
10
+
11
+ def type
12
+ 'message-batch'
13
+ end
14
+
15
+ def initialize(events)
16
+ super()
17
+ @events = events
18
+ end
19
+
20
+ def payload
21
+ @events.map do |event|
22
+ {
23
+ request_type: event.type,
24
+ payload: event.payload,
25
+ }
26
+ end
27
+ end
28
+
29
+ def ==(other)
30
+ other.is_a?(MessageBatch) && other.events == @events
31
+ end
32
+
33
+ alias_method :eql?, :==
34
+
35
+ def hash
36
+ [self.class, @events].hash
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # app-client-configuration-change event emitted instead of
10
+ # app-started event for telemetry startups other than the initial
11
+ # one in a process.
12
+ #
13
+ # dd-trace-rb generally creates a new component tree whenever
14
+ # the tracer is reconfigured via Datadog.configure (with some
15
+ # components potentially reused, if their configuration has not
16
+ # changed). Telemetry system tests on the other hand expect there
17
+ # to be one "tracer" per process, and do not permit multiple
18
+ # app-started events to be emitted.
19
+ #
20
+ # To resolve this conflict, we replace second and onward app-started
21
+ # events with app-client-configuration-change events.
22
+ # To avoid diffing configuration, we send all parameters that are
23
+ # sent in app-started event.
24
+ #
25
+ # It's a "quick fix" on top of a not-so-quick fix that omitted
26
+ # second and subsequent app-started (and app-closing) events in the
27
+ # first place, and only works with the existing hackery of app-started
28
+ # and app-closing events.
29
+ class SynthAppClientConfigurationChange < AppStarted
30
+ def type
31
+ 'app-client-configuration-change'
32
+ end
33
+
34
+ def payload
35
+ {
36
+ configuration: configuration,
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end