datadog 2.28.0 → 2.41.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 (941) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +412 -1
  3. data/bin/ddprofrb +4 -4
  4. data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
  5. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
  6. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +281 -57
  8. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  9. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
  10. data/ext/datadog_profiling_native_extension/collectors_stack.c +245 -160
  11. data/ext/datadog_profiling_native_extension/collectors_stack.h +23 -4
  12. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +725 -432
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
  14. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  15. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +44 -19
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +17 -12
  17. data/ext/datadog_profiling_native_extension/extconf.rb +44 -40
  18. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
  19. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
  20. data/ext/datadog_profiling_native_extension/heap_recorder.c +230 -81
  21. data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
  22. data/ext/datadog_profiling_native_extension/http_transport.c +61 -69
  23. data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
  24. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -16
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +300 -108
  26. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -9
  27. data/ext/datadog_profiling_native_extension/profiling.c +44 -5
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.c +40 -34
  29. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +26 -8
  30. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -3
  31. data/ext/datadog_profiling_native_extension/stack_recorder.c +94 -69
  32. data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
  33. data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
  34. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +4 -2
  35. data/ext/libdatadog_api/crashtracker.c +12 -8
  36. data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
  37. data/ext/libdatadog_api/datadog_ruby_common.c +44 -19
  38. data/ext/libdatadog_api/datadog_ruby_common.h +17 -12
  39. data/ext/libdatadog_api/di.c +203 -0
  40. data/ext/libdatadog_api/extconf.rb +38 -44
  41. data/ext/libdatadog_api/feature_flags.c +26 -0
  42. data/ext/libdatadog_api/init.c +9 -2
  43. data/ext/libdatadog_api/trace_exporter.c +1312 -0
  44. data/ext/libdatadog_api/trace_exporter.h +5 -0
  45. data/ext/libdatadog_extconf_helpers.rb +98 -15
  46. data/lib/datadog/ai_guard/api_client.rb +9 -7
  47. data/lib/datadog/ai_guard/autoload.rb +10 -0
  48. data/lib/datadog/ai_guard/component.rb +11 -9
  49. data/lib/datadog/ai_guard/configuration.rb +106 -2
  50. data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
  51. data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
  52. data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
  53. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
  54. data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
  55. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
  56. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +41 -3
  57. data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
  58. data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
  59. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +3 -1
  60. data/lib/datadog/ai_guard/evaluation/request.rb +22 -17
  61. data/lib/datadog/ai_guard/evaluation/result.rb +3 -1
  62. data/lib/datadog/ai_guard/evaluation.rb +51 -7
  63. data/lib/datadog/ai_guard/ext.rb +15 -0
  64. data/lib/datadog/ai_guard.rb +34 -8
  65. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +22 -43
  66. data/lib/datadog/appsec/actions_handler.rb +6 -6
  67. data/lib/datadog/appsec/anonymizer.rb +1 -1
  68. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +2 -2
  69. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  70. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  71. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +2 -2
  72. data/lib/datadog/appsec/api_security/route_extractor.rb +26 -14
  73. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  74. data/lib/datadog/appsec/api_security.rb +1 -1
  75. data/lib/datadog/appsec/assets/blocked.html +2 -1
  76. data/lib/datadog/appsec/assets.rb +7 -7
  77. data/lib/datadog/appsec/autoload.rb +4 -4
  78. data/lib/datadog/appsec/component.rb +29 -22
  79. data/lib/datadog/appsec/compressed_json.rb +7 -7
  80. data/lib/datadog/appsec/configuration.rb +436 -1
  81. data/lib/datadog/appsec/context.rb +49 -12
  82. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  83. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  84. data/lib/datadog/appsec/contrib/active_record/patcher.rb +7 -4
  85. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
  86. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
  87. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
  88. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +146 -0
  89. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  91. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  92. data/lib/datadog/appsec/contrib/devise/integration.rb +5 -5
  93. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  94. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +14 -13
  95. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  96. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  97. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  98. data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
  99. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +118 -14
  100. data/lib/datadog/appsec/contrib/faraday/integration.rb +5 -5
  101. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  102. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +119 -12
  103. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  104. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +76 -26
  105. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  106. data/lib/datadog/appsec/contrib/graphql/integration.rb +10 -9
  107. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  108. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
  109. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  110. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +56 -21
  111. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  112. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +46 -30
  113. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
  114. data/lib/datadog/appsec/contrib/rack/integration.rb +7 -7
  115. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  116. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  117. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +63 -52
  118. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  119. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +43 -4
  120. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +25 -9
  121. data/lib/datadog/appsec/contrib/rails/integration.rb +6 -6
  122. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  123. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +3 -1
  124. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  125. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  126. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  127. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  128. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
  129. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +131 -13
  130. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  131. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  132. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +35 -12
  133. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  134. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  135. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  136. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  137. data/lib/datadog/appsec/counter_sampler.rb +25 -0
  138. data/lib/datadog/appsec/default_header_tags.rb +52 -0
  139. data/lib/datadog/appsec/event.rb +15 -31
  140. data/lib/datadog/appsec/ext.rb +11 -10
  141. data/lib/datadog/appsec/extensions.rb +2 -2
  142. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  143. data/lib/datadog/appsec/instrumentation/gateway.rb +3 -16
  144. data/lib/datadog/appsec/metrics/collector.rb +18 -1
  145. data/lib/datadog/appsec/metrics/exporter.rb +17 -11
  146. data/lib/datadog/appsec/metrics/telemetry.rb +15 -3
  147. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -2
  148. data/lib/datadog/appsec/metrics.rb +4 -4
  149. data/lib/datadog/appsec/monitor/gateway/watcher.rb +18 -12
  150. data/lib/datadog/appsec/monitor.rb +1 -1
  151. data/lib/datadog/appsec/processor/rule_loader.rb +32 -32
  152. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  153. data/lib/datadog/appsec/remote.rb +15 -9
  154. data/lib/datadog/appsec/response.rb +22 -22
  155. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
  156. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
  157. data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
  158. data/lib/datadog/appsec/route_normalizer.rb +80 -0
  159. data/lib/datadog/appsec/security_engine/engine.rb +54 -33
  160. data/lib/datadog/appsec/security_engine/runner.rb +3 -3
  161. data/lib/datadog/appsec/security_event.rb +2 -2
  162. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  163. data/lib/datadog/appsec/utils/http/body.rb +41 -0
  164. data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
  165. data/lib/datadog/appsec/utils/http/media_range.rb +17 -16
  166. data/lib/datadog/appsec/utils/http/media_type.rb +28 -36
  167. data/lib/datadog/appsec/utils/http/url_encoded.rb +107 -0
  168. data/lib/datadog/appsec.rb +21 -24
  169. data/lib/datadog/auto_instrument.rb +2 -2
  170. data/lib/datadog/core/buffer/cruby.rb +1 -1
  171. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  172. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  173. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  174. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  175. data/lib/datadog/core/configuration/base.rb +19 -7
  176. data/lib/datadog/core/configuration/components.rb +166 -36
  177. data/lib/datadog/core/configuration/components_state.rb +6 -1
  178. data/lib/datadog/core/configuration/config_helper.rb +12 -3
  179. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  180. data/lib/datadog/core/configuration/ext.rb +11 -11
  181. data/lib/datadog/core/configuration/option.rb +48 -22
  182. data/lib/datadog/core/configuration/option_definition.rb +43 -17
  183. data/lib/datadog/core/configuration/options.rb +43 -9
  184. data/lib/datadog/core/configuration/settings.rb +155 -106
  185. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  186. data/lib/datadog/core/configuration/supported_configurations.rb +44 -1
  187. data/lib/datadog/core/configuration.rb +11 -11
  188. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  189. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  190. data/lib/datadog/core/crashtracking/component.rb +78 -26
  191. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  192. data/lib/datadog/core/deprecations.rb +1 -1
  193. data/lib/datadog/core/diagnostics/environment_logger.rb +45 -8
  194. data/lib/datadog/core/diagnostics/health.rb +2 -2
  195. data/lib/datadog/core/encoding.rb +4 -4
  196. data/lib/datadog/core/environment/agent_info.rb +65 -1
  197. data/lib/datadog/core/environment/cgroup.rb +4 -4
  198. data/lib/datadog/core/environment/container.rb +11 -11
  199. data/lib/datadog/core/environment/execution.rb +3 -3
  200. data/lib/datadog/core/environment/ext.rb +21 -15
  201. data/lib/datadog/core/environment/gc.rb +1 -1
  202. data/lib/datadog/core/environment/git.rb +2 -2
  203. data/lib/datadog/core/environment/identity.rb +47 -11
  204. data/lib/datadog/core/environment/platform.rb +8 -8
  205. data/lib/datadog/core/environment/process.rb +54 -19
  206. data/lib/datadog/core/environment/socket.rb +15 -2
  207. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  208. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  209. data/lib/datadog/core/environment/yjit.rb +2 -2
  210. data/lib/datadog/core/error.rb +5 -5
  211. data/lib/datadog/core/evp.rb +11 -0
  212. data/lib/datadog/core/extensions.rb +1 -1
  213. data/lib/datadog/core/feature_flags.rb +3 -3
  214. data/lib/datadog/core/git/ext.rb +4 -4
  215. data/lib/datadog/core/knuth_sampler.rb +3 -1
  216. data/lib/datadog/core/logger.rb +4 -4
  217. data/lib/datadog/core/logging/ext.rb +1 -1
  218. data/lib/datadog/core/metrics/client.rb +26 -26
  219. data/lib/datadog/core/metrics/ext.rb +5 -5
  220. data/lib/datadog/core/metrics/helpers.rb +1 -1
  221. data/lib/datadog/core/metrics/logging.rb +3 -3
  222. data/lib/datadog/core/metrics/options.rb +5 -5
  223. data/lib/datadog/core/pin.rb +1 -1
  224. data/lib/datadog/core/process_discovery.rb +23 -22
  225. data/lib/datadog/core/rate_limiter.rb +3 -1
  226. data/lib/datadog/core/remote/client/capabilities.rb +67 -15
  227. data/lib/datadog/core/remote/client.rb +18 -18
  228. data/lib/datadog/core/remote/component.rb +70 -34
  229. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  230. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  231. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  232. data/lib/datadog/core/remote/configuration/repository.rb +4 -4
  233. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  234. data/lib/datadog/core/remote/configuration.rb +4 -4
  235. data/lib/datadog/core/remote/ext.rb +3 -3
  236. data/lib/datadog/core/remote/negotiation.rb +1 -1
  237. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  238. data/lib/datadog/core/remote/transport/config.rb +9 -15
  239. data/lib/datadog/core/remote/transport/http/config.rb +10 -10
  240. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  241. data/lib/datadog/core/remote/transport/http.rb +10 -10
  242. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  243. data/lib/datadog/core/remote/worker.rb +5 -5
  244. data/lib/datadog/core/runtime/ext.rb +22 -22
  245. data/lib/datadog/core/runtime/metrics.rb +11 -12
  246. data/lib/datadog/core/tag_builder.rb +18 -18
  247. data/lib/datadog/core/tag_normalizer.rb +7 -7
  248. data/lib/datadog/core/telemetry/component.rb +16 -26
  249. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  250. data/lib/datadog/core/telemetry/emitter.rb +5 -5
  251. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +10 -9
  252. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  253. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  254. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +3 -3
  255. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  256. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  257. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  258. data/lib/datadog/core/telemetry/event/app_started.rb +142 -193
  259. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  260. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  261. data/lib/datadog/core/telemetry/event/generate_metrics.rb +3 -3
  262. data/lib/datadog/core/telemetry/event/log.rb +6 -6
  263. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  264. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  265. data/lib/datadog/core/telemetry/event.rb +16 -22
  266. data/lib/datadog/core/telemetry/ext.rb +11 -10
  267. data/lib/datadog/core/telemetry/logger.rb +1 -1
  268. data/lib/datadog/core/telemetry/logging.rb +5 -5
  269. data/lib/datadog/core/telemetry/metric.rb +9 -9
  270. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  271. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  272. data/lib/datadog/core/telemetry/request.rb +6 -8
  273. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +16 -11
  274. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  275. data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -9
  276. data/lib/datadog/core/telemetry/worker.rb +26 -6
  277. data/lib/datadog/core/transport/ext.rb +14 -13
  278. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  279. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  280. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  281. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  282. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  283. data/lib/datadog/core/transport/http/builder.rb +6 -6
  284. data/lib/datadog/core/transport/http/client.rb +2 -2
  285. data/lib/datadog/core/transport/http/response.rb +5 -1
  286. data/lib/datadog/core/transport/http.rb +9 -7
  287. data/lib/datadog/core/transport/parcel.rb +61 -9
  288. data/lib/datadog/core/transport/response.rb +1 -1
  289. data/lib/datadog/core/transport/transport.rb +2 -2
  290. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +172 -20
  291. data/lib/datadog/core/utils/base64_codec.rb +23 -0
  292. data/lib/datadog/core/utils/duration.rb +1 -1
  293. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  294. data/lib/datadog/core/utils/fnv.rb +26 -0
  295. data/lib/datadog/core/utils/forking.rb +3 -1
  296. data/lib/datadog/core/utils/hash.rb +0 -23
  297. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  298. data/lib/datadog/core/utils/network.rb +11 -11
  299. data/lib/datadog/core/utils/only_once.rb +1 -1
  300. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  301. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  302. data/lib/datadog/core/utils/sequence.rb +3 -6
  303. data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
  304. data/lib/datadog/core/utils/time.rb +18 -52
  305. data/lib/datadog/core/utils/url.rb +1 -1
  306. data/lib/datadog/core/utils.rb +5 -5
  307. data/lib/datadog/core/workers/async.rb +2 -2
  308. data/lib/datadog/core/workers/interval_loop.rb +13 -6
  309. data/lib/datadog/core/workers/polling.rb +2 -2
  310. data/lib/datadog/core/workers/queue.rb +0 -4
  311. data/lib/datadog/core/workers/runtime_metrics.rb +13 -5
  312. data/lib/datadog/core.rb +13 -6
  313. data/lib/datadog/data_streams/configuration.rb +40 -1
  314. data/lib/datadog/data_streams/ext.rb +1 -1
  315. data/lib/datadog/data_streams/extensions.rb +2 -2
  316. data/lib/datadog/data_streams/pathway_context.rb +8 -8
  317. data/lib/datadog/data_streams/processor.rb +87 -85
  318. data/lib/datadog/data_streams/transport/http/stats.rb +9 -3
  319. data/lib/datadog/data_streams/transport/http.rb +5 -9
  320. data/lib/datadog/data_streams/transport/stats.rb +10 -17
  321. data/lib/datadog/data_streams.rb +5 -5
  322. data/lib/datadog/di/base.rb +16 -8
  323. data/lib/datadog/di/boot.rb +25 -23
  324. data/lib/datadog/di/capture_expression.rb +21 -0
  325. data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
  326. data/lib/datadog/di/capture_limits.rb +41 -0
  327. data/lib/datadog/di/code_tracker.rb +218 -16
  328. data/lib/datadog/di/component.rb +137 -39
  329. data/lib/datadog/di/configuration.rb +241 -2
  330. data/lib/datadog/di/context.rb +15 -3
  331. data/lib/datadog/di/contrib/active_record.rb +6 -2
  332. data/lib/datadog/di/contrib/railtie.rb +1 -1
  333. data/lib/datadog/di/contrib.rb +5 -5
  334. data/lib/datadog/di/el/compiler.rb +114 -38
  335. data/lib/datadog/di/el/evaluator.rb +82 -2
  336. data/lib/datadog/di/el/expression.rb +13 -2
  337. data/lib/datadog/di/el.rb +3 -3
  338. data/lib/datadog/di/error.rb +10 -0
  339. data/lib/datadog/di/fatal_exceptions.rb +26 -0
  340. data/lib/datadog/di/instrumenter.rb +608 -255
  341. data/lib/datadog/di/logger.rb +1 -1
  342. data/lib/datadog/di/preload.rb +1 -1
  343. data/lib/datadog/di/probe.rb +71 -3
  344. data/lib/datadog/di/probe_builder.rb +98 -15
  345. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  346. data/lib/datadog/di/probe_file_loader.rb +16 -11
  347. data/lib/datadog/di/probe_manager.rb +153 -73
  348. data/lib/datadog/di/probe_notification_builder.rb +218 -38
  349. data/lib/datadog/di/probe_notifier_worker.rb +111 -35
  350. data/lib/datadog/di/probe_repository.rb +198 -0
  351. data/lib/datadog/di/proc_responder.rb +4 -0
  352. data/lib/datadog/di/redactor.rb +16 -1
  353. data/lib/datadog/di/remote.rb +193 -33
  354. data/lib/datadog/di/serializer.rb +201 -39
  355. data/lib/datadog/di/transport/diagnostics.rb +10 -12
  356. data/lib/datadog/di/transport/http/diagnostics.rb +5 -3
  357. data/lib/datadog/di/transport/http/input.rb +3 -3
  358. data/lib/datadog/di/transport/http.rb +22 -13
  359. data/lib/datadog/di/transport/input.rb +65 -24
  360. data/lib/datadog/di/utils.rb +43 -15
  361. data/lib/datadog/di.rb +147 -3
  362. data/lib/datadog/error_tracking/collector.rb +3 -2
  363. data/lib/datadog/error_tracking/component.rb +12 -12
  364. data/lib/datadog/error_tracking/configuration.rb +55 -2
  365. data/lib/datadog/error_tracking/ext.rb +7 -7
  366. data/lib/datadog/error_tracking/extensions.rb +2 -2
  367. data/lib/datadog/error_tracking/filters.rb +4 -4
  368. data/lib/datadog/error_tracking.rb +6 -6
  369. data/lib/datadog/kit/appsec/events/v2.rb +91 -33
  370. data/lib/datadog/kit/appsec/events.rb +25 -25
  371. data/lib/datadog/kit/enable_core_dumps.rb +3 -3
  372. data/lib/datadog/kit/identity.rb +18 -18
  373. data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
  374. data/lib/datadog/kit.rb +1 -1
  375. data/lib/datadog/open_feature/component.rb +62 -13
  376. data/lib/datadog/open_feature/configuration.rb +24 -1
  377. data/lib/datadog/open_feature/evaluation_engine.rb +9 -9
  378. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  379. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  380. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  381. data/lib/datadog/open_feature/exposures/event.rb +7 -7
  382. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  383. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  384. data/lib/datadog/open_feature/ext.rb +13 -6
  385. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
  386. data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
  387. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +102 -0
  388. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +51 -0
  389. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  390. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  391. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  392. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  393. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  394. data/lib/datadog/open_feature/native_evaluator.rb +23 -1
  395. data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
  396. data/lib/datadog/open_feature/provider.rb +106 -21
  397. data/lib/datadog/open_feature/remote.rb +3 -3
  398. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  399. data/lib/datadog/open_feature/transport.rb +73 -22
  400. data/lib/datadog/open_feature.rb +2 -2
  401. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  402. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  403. data/lib/datadog/opentelemetry/configuration/settings.rb +95 -28
  404. data/lib/datadog/opentelemetry/ext.rb +9 -0
  405. data/lib/datadog/opentelemetry/logs.rb +98 -0
  406. data/lib/datadog/opentelemetry/metrics.rb +17 -44
  407. data/lib/datadog/opentelemetry/sdk/configurator.rb +46 -6
  408. data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
  409. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
  410. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +9 -16
  411. data/lib/datadog/opentelemetry/sdk/propagator.rb +16 -10
  412. data/lib/datadog/opentelemetry/sdk/span_processor.rb +18 -15
  413. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  414. data/lib/datadog/opentelemetry/sdk.rb +19 -0
  415. data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
  416. data/lib/datadog/opentelemetry/trace.rb +1 -1
  417. data/lib/datadog/opentelemetry.rb +8 -7
  418. data/lib/datadog/profiling/collectors/code_provenance.rb +36 -11
  419. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +50 -3
  420. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +12 -4
  421. data/lib/datadog/profiling/collectors/info.rb +17 -4
  422. data/lib/datadog/profiling/collectors/thread_context.rb +16 -18
  423. data/lib/datadog/profiling/component.rb +62 -33
  424. data/lib/datadog/profiling/exporter.rb +38 -13
  425. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +6 -5
  426. data/lib/datadog/profiling/ext.rb +0 -2
  427. data/lib/datadog/profiling/flush.rb +21 -12
  428. data/lib/datadog/profiling/http_transport.rb +18 -8
  429. data/lib/datadog/profiling/load_native_extension.rb +2 -2
  430. data/lib/datadog/profiling/profiler.rb +28 -13
  431. data/lib/datadog/profiling/scheduler.rb +2 -2
  432. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  433. data/lib/datadog/profiling/stack_recorder.rb +0 -8
  434. data/lib/datadog/profiling/tag_builder.rb +19 -19
  435. data/lib/datadog/profiling/tasks/exec.rb +9 -4
  436. data/lib/datadog/profiling/tasks/help.rb +1 -0
  437. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  438. data/lib/datadog/profiling.rb +32 -29
  439. data/lib/datadog/ruby_version.rb +25 -0
  440. data/lib/datadog/single_step_instrument.rb +2 -2
  441. data/lib/datadog/symbol_database/component.rb +734 -0
  442. data/lib/datadog/symbol_database/configuration.rb +73 -0
  443. data/lib/datadog/symbol_database/extensions.rb +19 -0
  444. data/lib/datadog/symbol_database/extractor.rb +1110 -0
  445. data/lib/datadog/symbol_database/file_hash.rb +48 -0
  446. data/lib/datadog/symbol_database/logger.rb +43 -0
  447. data/lib/datadog/symbol_database/remote.rb +195 -0
  448. data/lib/datadog/symbol_database/scope.rb +102 -0
  449. data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
  450. data/lib/datadog/symbol_database/service_version.rb +66 -0
  451. data/lib/datadog/symbol_database/symbol.rb +69 -0
  452. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  453. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  454. data/lib/datadog/symbol_database/transport.rb +54 -0
  455. data/lib/datadog/symbol_database/uploader.rb +230 -0
  456. data/lib/datadog/symbol_database.rb +71 -0
  457. data/lib/datadog/tracing/analytics.rb +1 -1
  458. data/lib/datadog/tracing/buffer.rb +8 -8
  459. data/lib/datadog/tracing/client_ip.rb +4 -4
  460. data/lib/datadog/tracing/component.rb +39 -7
  461. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  462. data/lib/datadog/tracing/configuration/dynamic.rb +13 -11
  463. data/lib/datadog/tracing/configuration/ext.rb +52 -38
  464. data/lib/datadog/tracing/configuration/http.rb +2 -2
  465. data/lib/datadog/tracing/configuration/settings.rb +51 -17
  466. data/lib/datadog/tracing/context.rb +1 -1
  467. data/lib/datadog/tracing/context_provider.rb +2 -2
  468. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  469. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  470. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +9 -6
  471. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +8 -5
  472. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +9 -6
  473. data/lib/datadog/tracing/contrib/action_cable/events.rb +5 -5
  474. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  475. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +8 -5
  476. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  477. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  478. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  479. data/lib/datadog/tracing/contrib/action_mailer/event.rb +7 -4
  480. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  481. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  482. data/lib/datadog/tracing/contrib/action_mailer/events.rb +3 -3
  483. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  484. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  485. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  486. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -12
  487. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  488. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +31 -3
  489. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +5 -3
  490. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  491. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  492. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  493. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  494. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  495. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  496. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  497. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +10 -7
  498. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +11 -8
  499. data/lib/datadog/tracing/contrib/action_view/events.rb +3 -3
  500. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  501. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  502. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  503. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  504. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  505. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
  506. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  507. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +10 -7
  508. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +10 -7
  509. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +10 -7
  510. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +10 -7
  511. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +10 -7
  512. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +10 -7
  513. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  514. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  515. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  516. data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -5
  517. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  518. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  519. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +7 -7
  520. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +8 -9
  521. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +3 -3
  522. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  523. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  524. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  525. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  526. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +9 -9
  527. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  528. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  529. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +9 -9
  530. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +11 -14
  531. data/lib/datadog/tracing/contrib/active_record/events.rb +3 -3
  532. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  533. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  534. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  535. data/lib/datadog/tracing/contrib/active_record/utils.rb +4 -4
  536. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  537. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +14 -17
  538. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  539. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +5 -8
  540. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  541. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  542. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  543. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  544. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  545. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  546. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  547. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +3 -3
  548. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  549. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  550. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  551. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  552. data/lib/datadog/tracing/contrib/aws/ext.rb +26 -26
  553. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -11
  554. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  555. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  556. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  557. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  558. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  559. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  560. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  561. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  562. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  563. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  564. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  565. data/lib/datadog/tracing/contrib/component.rb +1 -1
  566. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  567. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  568. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  569. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  570. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  571. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  572. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  573. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  574. data/lib/datadog/tracing/contrib/configurable.rb +20 -5
  575. data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
  576. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  577. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  578. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  579. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  580. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +6 -10
  581. data/lib/datadog/tracing/contrib/dalli/integration.rb +10 -7
  582. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  583. data/lib/datadog/tracing/contrib/dalli/quantize.rb +3 -3
  584. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  585. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  586. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  587. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  588. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -5
  589. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  590. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  591. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  592. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  593. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +12 -16
  594. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +4 -4
  595. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +7 -3
  596. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +9 -13
  597. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -12
  598. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  599. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +4 -11
  600. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  601. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +10 -7
  602. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -10
  603. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  604. data/lib/datadog/tracing/contrib/excon/middleware.rb +10 -14
  605. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  606. data/lib/datadog/tracing/contrib/ext.rb +20 -18
  607. data/lib/datadog/tracing/contrib/extensions.rb +11 -2
  608. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +9 -6
  609. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -10
  610. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  611. data/lib/datadog/tracing/contrib/faraday/middleware.rb +10 -14
  612. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  613. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  614. data/lib/datadog/tracing/contrib/grape/endpoint.rb +30 -27
  615. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  616. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +15 -10
  617. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  618. data/lib/datadog/tracing/contrib/grape/patcher.rb +10 -5
  619. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  620. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  621. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  622. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  623. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  624. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +38 -37
  625. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  626. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +7 -4
  627. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
  628. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +11 -15
  629. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  630. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  631. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +11 -9
  632. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -13
  633. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  634. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  635. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  636. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  637. data/lib/datadog/tracing/contrib/grpc.rb +7 -6
  638. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +4 -3
  639. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  640. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  641. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  642. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  643. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +4 -3
  644. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +6 -4
  645. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  646. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +9 -6
  647. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  648. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +10 -8
  649. data/lib/datadog/tracing/contrib/http/ext.rb +11 -10
  650. data/lib/datadog/tracing/contrib/http/instrumentation.rb +10 -14
  651. data/lib/datadog/tracing/contrib/http/integration.rb +7 -9
  652. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  653. data/lib/datadog/tracing/contrib/http.rb +7 -6
  654. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +9 -6
  655. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -10
  656. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +12 -12
  657. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  658. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  659. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +9 -6
  660. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -10
  661. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +10 -14
  662. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  663. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  664. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  665. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  666. data/lib/datadog/tracing/contrib/kafka/event.rb +4 -3
  667. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  668. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  669. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  670. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  671. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  672. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  673. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  674. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  675. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  676. data/lib/datadog/tracing/contrib/kafka/events.rb +10 -10
  677. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  678. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +4 -4
  679. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +6 -6
  680. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  681. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  682. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +7 -3
  683. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +11 -9
  684. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -12
  685. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  686. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  687. data/lib/datadog/tracing/contrib/karafka/patcher.rb +9 -9
  688. data/lib/datadog/tracing/contrib/karafka.rb +7 -6
  689. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  690. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  691. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  692. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  693. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  694. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  695. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  696. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  697. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +9 -9
  698. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  699. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -21
  700. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +9 -3
  701. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  702. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +9 -12
  703. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  704. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  705. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  706. data/lib/datadog/tracing/contrib/opensearch/ext.rb +23 -23
  707. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  708. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +15 -19
  709. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  710. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  711. data/lib/datadog/tracing/contrib/patcher.rb +3 -3
  712. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +9 -3
  713. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  714. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +21 -24
  715. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  716. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  717. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  718. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  719. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +8 -10
  720. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  721. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  722. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  723. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +26 -13
  724. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +7 -3
  725. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +29 -5
  726. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +7 -4
  727. data/lib/datadog/tracing/contrib/que/ext.rb +19 -18
  728. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  729. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  730. data/lib/datadog/tracing/contrib/que/tracer.rb +3 -2
  731. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  732. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -9
  733. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  734. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  735. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  736. data/lib/datadog/tracing/contrib/racecar/events.rb +4 -4
  737. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  738. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  739. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  740. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +14 -4
  741. data/lib/datadog/tracing/contrib/rack/ext.rb +43 -15
  742. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  743. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +24 -1
  744. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  745. data/lib/datadog/tracing/contrib/rack/middlewares.rb +28 -25
  746. data/lib/datadog/tracing/contrib/rack/patcher.rb +5 -5
  747. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -4
  748. data/lib/datadog/tracing/contrib/rack/route_inference.rb +27 -13
  749. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +124 -6
  750. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  751. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +8 -5
  752. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -14
  753. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  754. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  755. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  756. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  757. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -9
  758. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  759. data/lib/datadog/tracing/contrib/rails/runner.rb +4 -2
  760. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  761. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  762. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +9 -7
  763. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  764. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  765. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +3 -3
  766. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  767. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  768. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  769. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  770. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  771. data/lib/datadog/tracing/contrib/redis/quantize.rb +40 -6
  772. data/lib/datadog/tracing/contrib/redis/tags.rb +6 -11
  773. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +16 -8
  774. data/lib/datadog/tracing/contrib/registerable.rb +11 -0
  775. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  776. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  777. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  778. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  779. data/lib/datadog/tracing/contrib/resque/resque_job.rb +6 -5
  780. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +7 -4
  781. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -9
  782. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  783. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  784. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +6 -10
  785. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  786. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -5
  787. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -5
  788. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  789. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  790. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  791. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  792. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  793. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  794. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  795. data/lib/datadog/tracing/contrib/sequel/database.rb +7 -10
  796. data/lib/datadog/tracing/contrib/sequel/dataset.rb +6 -5
  797. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  798. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  799. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  800. data/lib/datadog/tracing/contrib/sequel/utils.rb +116 -16
  801. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  802. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  803. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  804. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  805. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -2
  806. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -8
  807. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +7 -3
  808. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +12 -10
  809. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -29
  810. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  811. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  812. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  813. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  814. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  815. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  816. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  817. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +15 -14
  818. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +10 -10
  819. data/lib/datadog/tracing/contrib/sidekiq.rb +7 -6
  820. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +8 -4
  821. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  822. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -16
  823. data/lib/datadog/tracing/contrib/sinatra/framework.rb +2 -2
  824. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  825. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  826. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +11 -10
  827. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +9 -8
  828. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  829. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  830. data/lib/datadog/tracing/contrib/sneakers/integration.rb +19 -8
  831. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  832. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +5 -4
  833. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  834. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  835. data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
  836. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  837. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  838. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  839. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  840. data/lib/datadog/tracing/contrib/stripe/request.rb +4 -4
  841. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  842. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  843. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  844. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +5 -4
  845. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  846. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  847. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +9 -3
  848. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  849. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +10 -12
  850. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  851. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  852. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  853. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +3 -3
  854. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
  855. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +7 -3
  856. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +11 -9
  857. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -3
  858. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  859. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  860. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  861. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  862. data/lib/datadog/tracing/contrib/waterdrop.rb +7 -6
  863. data/lib/datadog/tracing/contrib.rb +62 -54
  864. data/lib/datadog/tracing/correlation.rb +12 -12
  865. data/lib/datadog/tracing/diagnostics/environment_logger.rb +14 -12
  866. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  867. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  868. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  869. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  870. data/lib/datadog/tracing/distributed/baggage.rb +82 -28
  871. data/lib/datadog/tracing/distributed/datadog.rb +32 -30
  872. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +4 -17
  873. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  874. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  875. data/lib/datadog/tracing/distributed/propagation.rb +43 -11
  876. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  877. data/lib/datadog/tracing/distributed/trace_context.rb +108 -85
  878. data/lib/datadog/tracing/event.rb +2 -2
  879. data/lib/datadog/tracing/ext.rb +9 -0
  880. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  881. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  882. data/lib/datadog/tracing/metadata/ext.rb +79 -65
  883. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  884. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  885. data/lib/datadog/tracing/metadata/tagging.rb +5 -5
  886. data/lib/datadog/tracing/metadata.rb +4 -4
  887. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  888. data/lib/datadog/tracing/pipeline.rb +3 -3
  889. data/lib/datadog/tracing/remote.rb +48 -10
  890. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  891. data/lib/datadog/tracing/sampling/ext.rb +9 -7
  892. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  893. data/lib/datadog/tracing/sampling/priority_sampler.rb +17 -4
  894. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  895. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  896. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  897. data/lib/datadog/tracing/sampling/rule.rb +5 -5
  898. data/lib/datadog/tracing/sampling/rule_sampler.rb +66 -37
  899. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  900. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  901. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  902. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  903. data/lib/datadog/tracing/sampling/span/rule_parser.rb +10 -10
  904. data/lib/datadog/tracing/span.rb +9 -9
  905. data/lib/datadog/tracing/span_event.rb +5 -5
  906. data/lib/datadog/tracing/span_operation.rb +39 -26
  907. data/lib/datadog/tracing/sync_writer.rb +12 -8
  908. data/lib/datadog/tracing/trace_digest.rb +7 -0
  909. data/lib/datadog/tracing/trace_operation.rb +90 -21
  910. data/lib/datadog/tracing/trace_segment.rb +10 -10
  911. data/lib/datadog/tracing/tracer.rb +63 -22
  912. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  913. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  914. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  915. data/lib/datadog/tracing/transport/http.rb +10 -10
  916. data/lib/datadog/tracing/transport/io/client.rb +8 -11
  917. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  918. data/lib/datadog/tracing/transport/io/traces.rb +33 -39
  919. data/lib/datadog/tracing/transport/io.rb +3 -3
  920. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  921. data/lib/datadog/tracing/transport/native.rb +387 -0
  922. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  923. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  924. data/lib/datadog/tracing/transport/trace_formatter.rb +20 -9
  925. data/lib/datadog/tracing/transport/traces.rb +13 -19
  926. data/lib/datadog/tracing/utils.rb +2 -2
  927. data/lib/datadog/tracing/workers.rb +4 -3
  928. data/lib/datadog/tracing/writer.rb +22 -10
  929. data/lib/datadog/tracing.rb +3 -3
  930. data/lib/datadog/version.rb +4 -4
  931. data/lib/datadog.rb +15 -11
  932. metadata +91 -23
  933. data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
  934. data/lib/datadog/ai_guard/configuration/settings.rb +0 -110
  935. data/lib/datadog/appsec/configuration/settings.rb +0 -409
  936. data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
  937. data/lib/datadog/core/utils/base64.rb +0 -22
  938. data/lib/datadog/data_streams/configuration/settings.rb +0 -49
  939. data/lib/datadog/di/configuration/settings.rb +0 -234
  940. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
  941. data/lib/datadog/tracing/workers/trace_writer.rb +0 -204
@@ -5,7 +5,7 @@
5
5
  #include "libdatadog_helpers.h"
6
6
  #include "time_helpers.h"
7
7
 
8
- // Note on calloc vs ruby_xcalloc use:
8
+ // note on calloc vs ruby_xcalloc use:
9
9
  // * Whenever we're allocating memory after being called by the Ruby VM in a "regular" situation (e.g. initializer)
10
10
  // we should use `ruby_xcalloc` to give the VM visibility into what we're doing + give it a chance to manage GC
11
11
  // * BUT, when we're being called during a sample, being in the middle of an object allocation is a very special
@@ -58,7 +58,7 @@ typedef struct {
58
58
  heap_frame frames[];
59
59
  } heap_record;
60
60
  static heap_record* heap_record_new(heap_recorder*, ddog_prof_Slice_Location);
61
- static void heap_record_free(heap_recorder*, heap_record*);
61
+ static void heap_record_free(heap_recorder*, heap_record*, bool should_unintern);
62
62
 
63
63
  #if MAX_FRAMES_LIMIT > UINT16_MAX
64
64
  #error Frames len type not compatible with MAX_FRAMES_LIMIT
@@ -75,10 +75,20 @@ typedef struct {
75
75
  live_object_data object_data;
76
76
  } object_record;
77
77
  static object_record* object_record_new(long, heap_record*, live_object_data);
78
- static void object_record_free(heap_recorder*, object_record*);
78
+ static void object_record_free(heap_recorder*, object_record*, bool should_unintern);
79
79
  static VALUE object_record_inspect(heap_recorder*, object_record*);
80
80
  static object_record SKIPPED_RECORD = {0};
81
81
 
82
+ // A pending recording is used to defer the object_id call on Ruby 4+
83
+ // where calling rb_obj_id during on_newobj_event is unsafe.
84
+ typedef struct {
85
+ VALUE object_ref;
86
+ heap_record *heap_record;
87
+ live_object_data object_data;
88
+ } pending_recording;
89
+
90
+ #define MAX_PENDING_RECORDINGS 256
91
+
82
92
  struct heap_recorder {
83
93
  // Config
84
94
  // Whether the recorder should try to determine approximate sizes for tracked objects.
@@ -130,6 +140,15 @@ struct heap_recorder {
130
140
  // Data for a heap recording that was started but not yet ended
131
141
  object_record *active_recording;
132
142
 
143
+ // Pending recordings that need to be finalized after on_newobj_event completes.
144
+ // On Ruby 4+, we can't call rb_obj_id during the newobj event, so we store the
145
+ // VALUE reference here and finalize it via a postponed job.
146
+ pending_recording pending_recordings[MAX_PENDING_RECORDINGS];
147
+ // Temporary storage for the recording in progress, used between start and end
148
+ VALUE active_deferred_object;
149
+ live_object_data active_deferred_object_data;
150
+ uint16_t pending_recordings_count;
151
+
133
152
  // Reusable arrays, implementing a flyweight pattern for things like iteration
134
153
  #define REUSABLE_LOCATIONS_SIZE MAX_FRAMES_LIMIT
135
154
  ddog_prof_Location *reusable_locations;
@@ -163,6 +182,9 @@ struct heap_recorder {
163
182
  double ewma_objects_alive;
164
183
  double ewma_objects_dead;
165
184
  double ewma_objects_skipped;
185
+
186
+ unsigned long deferred_recordings_skipped_buffer_full;
187
+ unsigned long deferred_recordings_finalized;
166
188
  } stats_lifetime;
167
189
  };
168
190
 
@@ -174,12 +196,13 @@ typedef struct {
174
196
  static heap_record* get_or_create_heap_record(heap_recorder*, ddog_prof_Slice_Location);
175
197
  static void cleanup_heap_record_if_unused(heap_recorder*, heap_record*);
176
198
  static void on_committed_object_record_cleanup(heap_recorder *heap_recorder, object_record *record);
177
- static int st_heap_record_entry_free(st_data_t, st_data_t, st_data_t);
178
- static int st_object_record_entry_free(st_data_t, st_data_t, st_data_t);
199
+ static int st_heap_record_entry_free_no_unintern(st_data_t, st_data_t, st_data_t);
200
+ static int st_object_record_entry_free_no_unintern(st_data_t, st_data_t, st_data_t);
179
201
  static int st_object_record_update(st_data_t, st_data_t, st_data_t);
180
202
  static int st_object_records_iterate(st_data_t, st_data_t, st_data_t);
181
203
  static int st_object_records_debug(st_data_t key, st_data_t value, st_data_t extra);
182
204
  static int update_object_record_entry(st_data_t*, st_data_t*, st_data_t, int);
205
+ static void inc_tracked_objects_or_fail(heap_record *heap_record);
183
206
  static void commit_recording(heap_recorder *, heap_record *, object_record *active_recording);
184
207
  static VALUE end_heap_allocation_recording(VALUE end_heap_allocation_args);
185
208
  static void heap_recorder_update(heap_recorder *heap_recorder, bool full_update);
@@ -187,6 +210,7 @@ static inline double ewma_stat(double previous, double current);
187
210
  static void unintern_or_raise(heap_recorder *, ddog_prof_ManagedStringId);
188
211
  static void unintern_all_or_raise(heap_recorder *recorder, ddog_prof_Slice_ManagedStringId ids);
189
212
  static VALUE get_ruby_string_or_raise(heap_recorder*, ddog_prof_ManagedStringId);
213
+ static long obj_id_or_fail(VALUE obj);
190
214
 
191
215
  // ==========================
192
216
  // Heap Recorder External API
@@ -210,6 +234,7 @@ heap_recorder* heap_recorder_new(ddog_prof_ManagedStringStorage string_storage)
210
234
  recorder->size_enabled = true;
211
235
  recorder->sample_rate = 1; // By default do no sampling on top of what allocation profiling already does
212
236
  recorder->string_storage = string_storage;
237
+ recorder->active_deferred_object = Qnil;
213
238
 
214
239
  return recorder;
215
240
  }
@@ -225,17 +250,24 @@ void heap_recorder_free(heap_recorder *heap_recorder) {
225
250
  heap_recorder_finish_iteration(heap_recorder);
226
251
  }
227
252
 
253
+ // NOTE: We don't unintern the strings referenced by the records we're about to free, thus we use
254
+ // `..._no_unintern` and `should_unintern: false`. This is intentional: `heap_recorder_free` is only ever called as part of
255
+ // tearing down the entire stack recorder, and the caller drops the whole managed string storage right after
256
+ // (see `stack_recorder_typed_data_free`), so there's no need to spend effort updating the managed string table.
257
+ // Crucially, this also keeps us from crashing: this code runs from the stack recorder's GC free callback, and
258
+ // because uninterning can fail, we can't raise exceptions in the middle of a dfree.
259
+
228
260
  // Clean-up all object records
229
- st_foreach(heap_recorder->object_records, st_object_record_entry_free, (st_data_t) heap_recorder);
261
+ st_foreach(heap_recorder->object_records, st_object_record_entry_free_no_unintern, (st_data_t) heap_recorder);
230
262
  st_free_table(heap_recorder->object_records);
231
263
 
232
264
  // Clean-up all heap records (this includes those only referred to by queued_samples)
233
- st_foreach(heap_recorder->heap_records, st_heap_record_entry_free, (st_data_t) heap_recorder);
265
+ st_foreach(heap_recorder->heap_records, st_heap_record_entry_free_no_unintern, (st_data_t) heap_recorder);
234
266
  st_free_table(heap_recorder->heap_records);
235
267
 
236
268
  if (heap_recorder->active_recording != NULL && heap_recorder->active_recording != &SKIPPED_RECORD) {
237
269
  // If there's a partial object record, clean it up as well
238
- object_record_free(heap_recorder, heap_recorder->active_recording);
270
+ object_record_free(heap_recorder, heap_recorder->active_recording, false);
239
271
  }
240
272
 
241
273
  ruby_xfree(heap_recorder->reusable_locations);
@@ -281,7 +313,7 @@ void heap_recorder_after_fork(heap_recorder *heap_recorder) {
281
313
  // simply be noticed on next heap_recorder_prepare_iteration.
282
314
  //
283
315
  // There is one small caveat though: fork only preserves one thread and in a Ruby app, that
284
- // will be the thread holding on to the GVL. Since we support iteration on the heap recorder
316
+ // will be the thread holding the GVL. Since we support iteration on the heap recorder
285
317
  // outside of the GVL, any state specific to that interaction may be inconsistent after fork
286
318
  // (e.g. an acquired lock for thread safety). Iteration operates on object_records_snapshot
287
319
  // though and that one will be updated on next heap_recorder_prepare_iteration so we really
@@ -294,9 +326,9 @@ void heap_recorder_after_fork(heap_recorder *heap_recorder) {
294
326
  heap_recorder->stats_lifetime = (struct stats_lifetime) {0};
295
327
  }
296
328
 
297
- void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice alloc_class) {
329
+ bool start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice alloc_class) {
298
330
  if (heap_recorder == NULL) {
299
- return;
331
+ return false;
300
332
  }
301
333
 
302
334
  if (heap_recorder->active_recording != NULL) {
@@ -316,25 +348,49 @@ void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj
316
348
  || heap_recorder->updating
317
349
  ) {
318
350
  heap_recorder->active_recording = &SKIPPED_RECORD;
319
- return;
351
+ return false;
320
352
  }
321
353
 
322
- heap_recorder->num_recordings_skipped = 0;
354
+ bool needs_after_allocation = false;
323
355
 
324
- VALUE ruby_obj_id = rb_obj_id(new_obj);
325
- if (!FIXNUM_P(ruby_obj_id)) {
326
- raise_error(rb_eRuntimeError, "Detected a bignum object id. These are not supported by heap profiling.");
356
+ #ifdef USE_DEFERRED_HEAP_ALLOCATION_RECORDING
357
+ // Skip if we've hit the pending recordings limit or if there's already a deferred object being recorded
358
+ if (heap_recorder->pending_recordings_count >= MAX_PENDING_RECORDINGS) {
359
+ heap_recorder->stats_lifetime.deferred_recordings_skipped_buffer_full++;
360
+ heap_recorder->active_recording = &SKIPPED_RECORD;
361
+ return true; // If the buffer is full, we keep asking for a callback (see `needs_after_allocation` below)
362
+ } else {
363
+ // The intuition here is: We start by asking for an `after_allocation` callback when the buffer is about to go
364
+ // from empty -> non-empty, because this is going to be mapped onto a postponed job, so after it gets queued once
365
+ // it doesn't seem worth it to keep spamming requests.
366
+ //
367
+ // Yet, if for some reason the postponed job doesn't flush the pending list (or if e.g. it ran with `during_sample == true` and thus
368
+ // was skipped) we need to have some mechanism to recover -- and so if the buffer starts accumulating too much we
369
+ // start always requesting the callback to happen so that we eventually flush the buffer.
370
+ needs_after_allocation =
371
+ heap_recorder->pending_recordings_count == 0 || heap_recorder->pending_recordings_count >= (MAX_PENDING_RECORDINGS / 2);
327
372
  }
373
+ #endif
328
374
 
329
- heap_recorder->active_recording = object_record_new(
330
- FIX2LONG(ruby_obj_id),
331
- NULL,
332
- (live_object_data) {
333
- .weight = weight * heap_recorder->sample_rate,
334
- .class = intern_or_raise(heap_recorder->string_storage, alloc_class),
335
- .alloc_gen = rb_gc_count(),
336
- }
337
- );
375
+ heap_recorder->num_recordings_skipped = 0;
376
+
377
+ live_object_data object_data = (live_object_data) {
378
+ .weight = weight * heap_recorder->sample_rate,
379
+ .class = intern_or_raise(heap_recorder->string_storage, alloc_class),
380
+ .alloc_gen = rb_gc_count(),
381
+ };
382
+
383
+ #ifdef USE_DEFERRED_HEAP_ALLOCATION_RECORDING
384
+ // On Ruby 4+, we can't call rb_obj_id during on_newobj_event as it mutates the object.
385
+ // Instead, we store the VALUE reference and will get the object_id later via a postponed job.
386
+ // active_deferred_object != Qnil indicates we're in deferred mode.
387
+ heap_recorder->active_deferred_object = new_obj;
388
+ heap_recorder->active_deferred_object_data = object_data;
389
+ #else
390
+ heap_recorder->active_recording = object_record_new(obj_id_or_fail(new_obj), NULL, object_data);
391
+ #endif
392
+
393
+ return needs_after_allocation;
338
394
  }
339
395
 
340
396
  // end_heap_allocation_recording_with_rb_protect gets called while the stack_recorder is holding one of the profile
@@ -351,7 +407,6 @@ int end_heap_allocation_recording_with_rb_protect(heap_recorder *heap_recorder,
351
407
  return 0;
352
408
  }
353
409
 
354
-
355
410
  int exception_state;
356
411
  end_heap_allocation_args args = {
357
412
  .heap_recorder = heap_recorder,
@@ -367,26 +422,48 @@ static VALUE end_heap_allocation_recording(VALUE protect_args) {
367
422
  heap_recorder *heap_recorder = args->heap_recorder;
368
423
  ddog_prof_Slice_Location locations = args->locations;
369
424
 
370
- object_record *active_recording = heap_recorder->active_recording;
425
+ #ifdef USE_DEFERRED_HEAP_ALLOCATION_RECORDING
426
+ if (heap_recorder->active_deferred_object == Qnil) {
427
+ // Recording ended without having been started?
428
+ raise_error(rb_eRuntimeError, "Ended a heap recording that was not started");
429
+ }
430
+ #else
431
+ object_record *active_recording = heap_recorder->active_recording;
371
432
 
372
- if (active_recording == NULL) {
373
- // Recording ended without having been started?
374
- raise_error(rb_eRuntimeError, "Ended a heap recording that was not started");
375
- }
376
- // From now on, mark the global active recording as invalid so we can short-circuit at any point
377
- // and not end up with a still active recording. the local active_recording still holds the
378
- // data required for committing though.
379
- heap_recorder->active_recording = NULL;
433
+ if (active_recording == NULL) {
434
+ // Recording ended without having been started?
435
+ raise_error(rb_eRuntimeError, "Ended a heap recording that was not started");
436
+ }
437
+ // From now on, mark the global active recording as invalid so we can short-circuit at any point
438
+ // and not end up with a still active recording. the local active_recording still holds the
439
+ // data required for committing though.
440
+ heap_recorder->active_recording = NULL;
380
441
 
381
- if (active_recording == &SKIPPED_RECORD) { // special marker when we decided to skip due to sampling
382
- // Note: Remember to update the short circuit in end_heap_allocation_recording_with_rb_protect if this logic changes
383
- return Qnil;
384
- }
442
+ if (active_recording == &SKIPPED_RECORD) {
443
+ raise_error(
444
+ rb_eRuntimeError,
445
+ "BUG: end_heap_allocation_recording should never observe SKIPPED_RECORDING because " \
446
+ "end_heap_allocation_recording_with_rb_protect is supposed to test for it directly"
447
+ );
448
+ }
449
+ #endif
385
450
 
386
451
  heap_record *heap_record = get_or_create_heap_record(heap_recorder, locations);
387
-
388
- // And then commit the new allocation.
389
- commit_recording(heap_recorder, heap_record, active_recording);
452
+ inc_tracked_objects_or_fail(heap_record);
453
+
454
+ #ifdef USE_DEFERRED_HEAP_ALLOCATION_RECORDING
455
+ // Commit is delayed, so we need to record all we'll need for it
456
+ pending_recording *pending = &heap_recorder->pending_recordings[heap_recorder->pending_recordings_count++];
457
+ pending->object_ref = heap_recorder->active_deferred_object;
458
+ pending->heap_record = heap_record;
459
+ pending->object_data = heap_recorder->active_deferred_object_data;
460
+
461
+ heap_recorder->active_deferred_object = Qnil;
462
+ heap_recorder->active_deferred_object_data = (live_object_data) {0};
463
+ #else
464
+ // And then commit the new allocation
465
+ commit_recording(heap_recorder, heap_record, active_recording);
466
+ #endif
390
467
 
391
468
  return Qnil;
392
469
  }
@@ -399,6 +476,48 @@ void heap_recorder_update_young_objects(heap_recorder *heap_recorder) {
399
476
  heap_recorder_update(heap_recorder, /* full_update: */ false);
400
477
  }
401
478
 
479
+ void heap_recorder_finalize_pending_recordings(heap_recorder *heap_recorder) {
480
+ if (heap_recorder == NULL) {
481
+ return; // Nothing to do
482
+ }
483
+
484
+ uint count = heap_recorder->pending_recordings_count;
485
+ if (count == 0) {
486
+ return; // Nothing to do
487
+ }
488
+
489
+ heap_recorder->stats_lifetime.deferred_recordings_finalized += count;
490
+
491
+ for (uint i = 0; i < count; i++) {
492
+ pending_recording *pending = &heap_recorder->pending_recordings[i];
493
+
494
+ // This is the step we couldn't do during the original sample call -- we're now expected to be called in a context
495
+ // where it's finally safe to call this
496
+ long obj_id = obj_id_or_fail(pending->object_ref);
497
+
498
+ // Create the object record now that we have the object_id
499
+ object_record *record = object_record_new(obj_id, pending->heap_record, pending->object_data);
500
+
501
+ commit_recording(heap_recorder, pending->heap_record, record);
502
+ }
503
+
504
+ heap_recorder->pending_recordings_count = 0;
505
+ }
506
+
507
+ // Mark pending recordings to prevent GC from collecting the objects
508
+ // while they're waiting to be finalized
509
+ void heap_recorder_mark_pending_recordings(heap_recorder *heap_recorder) {
510
+ if (heap_recorder == NULL) {
511
+ return;
512
+ }
513
+
514
+ for (uint i = 0; i < heap_recorder->pending_recordings_count; i++) {
515
+ rb_gc_mark(heap_recorder->pending_recordings[i].object_ref);
516
+ }
517
+
518
+ rb_gc_mark(heap_recorder->active_deferred_object);
519
+ }
520
+
402
521
  // NOTE: This function needs and assumes it gets called with the GVL being held.
403
522
  // But importantly **some of the operations inside `st_object_record_update` may cause a thread switch**,
404
523
  // so we can't assume a single update happens in a single "atomic" step -- other threads may get some running time
@@ -547,20 +666,21 @@ bool heap_recorder_for_each_live_object(
547
666
 
548
667
  VALUE heap_recorder_state_snapshot(heap_recorder *heap_recorder) {
549
668
  VALUE arguments[] = {
550
- ID2SYM(rb_intern("num_object_records")), /* => */ LONG2NUM(heap_recorder->object_records->num_entries),
551
- ID2SYM(rb_intern("num_heap_records")), /* => */ LONG2NUM(heap_recorder->heap_records->num_entries),
669
+ ID2SYM(rb_intern("num_object_records")), /* => */ ULONG2NUM(heap_recorder->object_records->num_entries),
670
+ ID2SYM(rb_intern("num_heap_records")), /* => */ ULONG2NUM(heap_recorder->heap_records->num_entries),
671
+ ID2SYM(rb_intern("pending_recordings_count")), /* => */ ULONG2NUM(heap_recorder->pending_recordings_count),
552
672
 
553
673
  // Stats as of last update
554
- ID2SYM(rb_intern("last_update_objects_alive")), /* => */ LONG2NUM(heap_recorder->stats_last_update.objects_alive),
555
- ID2SYM(rb_intern("last_update_objects_dead")), /* => */ LONG2NUM(heap_recorder->stats_last_update.objects_dead),
556
- ID2SYM(rb_intern("last_update_objects_skipped")), /* => */ LONG2NUM(heap_recorder->stats_last_update.objects_skipped),
557
- ID2SYM(rb_intern("last_update_objects_frozen")), /* => */ LONG2NUM(heap_recorder->stats_last_update.objects_frozen),
674
+ ID2SYM(rb_intern("last_update_objects_alive")), /* => */ ULONG2NUM(heap_recorder->stats_last_update.objects_alive),
675
+ ID2SYM(rb_intern("last_update_objects_dead")), /* => */ ULONG2NUM(heap_recorder->stats_last_update.objects_dead),
676
+ ID2SYM(rb_intern("last_update_objects_skipped")), /* => */ ULONG2NUM(heap_recorder->stats_last_update.objects_skipped),
677
+ ID2SYM(rb_intern("last_update_objects_frozen")), /* => */ ULONG2NUM(heap_recorder->stats_last_update.objects_frozen),
558
678
 
559
679
  // Lifetime stats
560
- ID2SYM(rb_intern("lifetime_updates_successful")), /* => */ LONG2NUM(heap_recorder->stats_lifetime.updates_successful),
561
- ID2SYM(rb_intern("lifetime_updates_skipped_concurrent")), /* => */ LONG2NUM(heap_recorder->stats_lifetime.updates_skipped_concurrent),
562
- ID2SYM(rb_intern("lifetime_updates_skipped_gcgen")), /* => */ LONG2NUM(heap_recorder->stats_lifetime.updates_skipped_gcgen),
563
- ID2SYM(rb_intern("lifetime_updates_skipped_time")), /* => */ LONG2NUM(heap_recorder->stats_lifetime.updates_skipped_time),
680
+ ID2SYM(rb_intern("lifetime_updates_successful")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.updates_successful),
681
+ ID2SYM(rb_intern("lifetime_updates_skipped_concurrent")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.updates_skipped_concurrent),
682
+ ID2SYM(rb_intern("lifetime_updates_skipped_gcgen")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.updates_skipped_gcgen),
683
+ ID2SYM(rb_intern("lifetime_updates_skipped_time")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.updates_skipped_time),
564
684
  ID2SYM(rb_intern("lifetime_ewma_young_objects_alive")), /* => */ DBL2NUM(heap_recorder->stats_lifetime.ewma_young_objects_alive),
565
685
  ID2SYM(rb_intern("lifetime_ewma_young_objects_dead")), /* => */ DBL2NUM(heap_recorder->stats_lifetime.ewma_young_objects_dead),
566
686
  // Note: Here "young" refers to the young update; objects skipped includes non-young objects
@@ -568,15 +688,19 @@ VALUE heap_recorder_state_snapshot(heap_recorder *heap_recorder) {
568
688
  ID2SYM(rb_intern("lifetime_ewma_objects_alive")), /* => */ DBL2NUM(heap_recorder->stats_lifetime.ewma_objects_alive),
569
689
  ID2SYM(rb_intern("lifetime_ewma_objects_dead")), /* => */ DBL2NUM(heap_recorder->stats_lifetime.ewma_objects_dead),
570
690
  ID2SYM(rb_intern("lifetime_ewma_objects_skipped")), /* => */ DBL2NUM(heap_recorder->stats_lifetime.ewma_objects_skipped),
691
+
692
+ ID2SYM(rb_intern("lifetime_deferred_recordings_skipped_buffer_full")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.deferred_recordings_skipped_buffer_full),
693
+ ID2SYM(rb_intern("lifetime_deferred_recordings_finalized")), /* => */ ULONG2NUM(heap_recorder->stats_lifetime.deferred_recordings_finalized),
571
694
  };
572
695
  VALUE hash = rb_hash_new();
573
696
  for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(hash, arguments[i], arguments[i+1]);
697
+
574
698
  return hash;
575
699
  }
576
700
 
577
701
  typedef struct {
578
702
  heap_recorder *recorder;
579
- VALUE debug_str;
703
+ VALUE debug_ary;
580
704
  } debug_context;
581
705
 
582
706
  VALUE heap_recorder_testonly_debug(heap_recorder *heap_recorder) {
@@ -584,27 +708,30 @@ VALUE heap_recorder_testonly_debug(heap_recorder *heap_recorder) {
584
708
  raise_error(rb_eArgError, "heap_recorder is NULL");
585
709
  }
586
710
 
587
- VALUE debug_str = rb_str_new2("object records:\n");
588
- debug_context context = (debug_context) {.recorder = heap_recorder, .debug_str = debug_str};
711
+ VALUE debug_ary = rb_ary_new();
712
+ debug_context context = (debug_context) {.recorder = heap_recorder, .debug_ary = debug_ary};
589
713
  st_foreach(heap_recorder->object_records, st_object_records_debug, (st_data_t) &context);
590
714
 
591
- rb_str_catf(debug_str, "state snapshot: %"PRIsVALUE"\n------\n", heap_recorder_state_snapshot(heap_recorder));
592
-
593
- return debug_str;
715
+ return rb_ary_new_from_args(2,
716
+ rb_ary_new_from_args(2, ID2SYM(rb_intern("records")), debug_ary),
717
+ rb_ary_new_from_args(2, ID2SYM(rb_intern("state")), heap_recorder_state_snapshot(heap_recorder))
718
+ );
594
719
  }
595
720
 
596
721
  // ==========================
597
722
  // Heap Recorder Internal API
598
723
  // ==========================
599
- static int st_heap_record_entry_free(st_data_t key, DDTRACE_UNUSED st_data_t value, st_data_t extra_arg) {
724
+ // NOTE: Only expected to be used from heap_recorder_free, which will separately destroy the string table
725
+ static int st_heap_record_entry_free_no_unintern(st_data_t key, DDTRACE_UNUSED st_data_t value, st_data_t extra_arg) {
600
726
  heap_recorder *recorder = (heap_recorder *) extra_arg;
601
- heap_record_free(recorder, (heap_record *) key);
727
+ heap_record_free(recorder, (heap_record *) key, false);
602
728
  return ST_DELETE;
603
729
  }
604
730
 
605
- static int st_object_record_entry_free(DDTRACE_UNUSED st_data_t key, st_data_t value, st_data_t extra_arg) {
731
+ // NOTE: Only expected to be used from heap_recorder_free, which will separately destroy the string table
732
+ static int st_object_record_entry_free_no_unintern(DDTRACE_UNUSED st_data_t key, st_data_t value, st_data_t extra_arg) {
606
733
  heap_recorder *recorder = (heap_recorder *) extra_arg;
607
- object_record_free(recorder, (object_record *) value);
734
+ object_record_free(recorder, (object_record *) value, false);
608
735
  return ST_DELETE;
609
736
  }
610
737
 
@@ -710,11 +837,10 @@ static int st_object_records_iterate(DDTRACE_UNUSED st_data_t key, st_data_t val
710
837
 
711
838
  static int st_object_records_debug(DDTRACE_UNUSED st_data_t key, st_data_t value, st_data_t extra) {
712
839
  debug_context *context = (debug_context*) extra;
713
- VALUE debug_str = context->debug_str;
714
840
 
715
841
  object_record *record = (object_record*) value;
716
842
 
717
- rb_str_catf(debug_str, "%"PRIsVALUE"\n", object_record_inspect(context->recorder, record));
843
+ rb_ary_push(context->debug_ary, object_record_inspect(context->recorder, record));
718
844
 
719
845
  return ST_CONTINUE;
720
846
  }
@@ -728,14 +854,17 @@ static int update_object_record_entry(DDTRACE_UNUSED st_data_t *key, st_data_t *
728
854
  return ST_CONTINUE;
729
855
  }
730
856
 
731
- static void commit_recording(heap_recorder *heap_recorder, heap_record *heap_record, object_record *active_recording) {
732
- // Link the object record with the corresponding heap record. This was the last remaining thing we
733
- // needed to fully build the object_record.
734
- active_recording->heap_record = heap_record;
857
+ static void inc_tracked_objects_or_fail(heap_record *heap_record) {
735
858
  if (heap_record->num_tracked_objects == UINT32_MAX) {
736
859
  raise_error(rb_eRuntimeError, "Reached maximum number of tracked objects for heap record");
737
860
  }
738
861
  heap_record->num_tracked_objects++;
862
+ }
863
+
864
+ static void commit_recording(heap_recorder *heap_recorder, heap_record *heap_record, object_record *active_recording) {
865
+ // Link the object record with the corresponding heap record. This was the last remaining thing we
866
+ // needed to fully build the object_record.
867
+ active_recording->heap_record = heap_record;
739
868
 
740
869
  int existing_error = st_update(heap_recorder->object_records, active_recording->obj_id, update_object_record_entry, (st_data_t) active_recording);
741
870
  if (existing_error) {
@@ -768,7 +897,7 @@ static heap_record* get_or_create_heap_record(heap_recorder *heap_recorder, ddog
768
897
  heap_record *new_or_existing_record = NULL; // Will be set inside update_heap_record_entry_with_new_allocation
769
898
  bool existing = st_update(heap_recorder->heap_records, (st_data_t) stack, update_heap_record_entry_with_new_allocation, (st_data_t) &new_or_existing_record);
770
899
  if (existing) {
771
- heap_record_free(heap_recorder, stack);
900
+ heap_record_free(heap_recorder, stack, true);
772
901
  }
773
902
 
774
903
  return new_or_existing_record;
@@ -783,7 +912,7 @@ static void cleanup_heap_record_if_unused(heap_recorder *heap_recorder, heap_rec
783
912
  if (!st_delete(heap_recorder->heap_records, (st_data_t*) &heap_record, NULL)) {
784
913
  raise_error(rb_eRuntimeError, "Attempted to cleanup an untracked heap_record");
785
914
  };
786
- heap_record_free(heap_recorder, heap_record);
915
+ heap_record_free(heap_recorder, heap_record, true);
787
916
  }
788
917
 
789
918
  static void on_committed_object_record_cleanup(heap_recorder *heap_recorder, object_record *record) {
@@ -805,7 +934,7 @@ static void on_committed_object_record_cleanup(heap_recorder *heap_recorder, obj
805
934
  // One less object using this heap record, it may have become unused...
806
935
  cleanup_heap_record_if_unused(heap_recorder, heap_record);
807
936
 
808
- object_record_free(heap_recorder, record);
937
+ object_record_free(heap_recorder, record, true);
809
938
  }
810
939
 
811
940
  // =================
@@ -819,8 +948,12 @@ object_record* object_record_new(long obj_id, heap_record *heap_record, live_obj
819
948
  return record;
820
949
  }
821
950
 
822
- void object_record_free(heap_recorder *recorder, object_record *record) {
823
- unintern_or_raise(recorder, record->object_data.class);
951
+ void object_record_free(heap_recorder *recorder, object_record *record, bool should_unintern) {
952
+ // When tearing down the whole recorder state, we skip uninterning as it's not needed (the managed
953
+ // string table is going to be destroyed anyway) and if there's any failures we can't raise
954
+ // in the middle of a dfree callback.
955
+ if (should_unintern) unintern_or_raise(recorder, record->object_data.class);
956
+
824
957
  free(record); // See "note on calloc vs ruby_xcalloc use" above
825
958
  }
826
959
 
@@ -892,15 +1025,20 @@ heap_record* heap_record_new(heap_recorder *recorder, ddog_prof_Slice_Location l
892
1025
  return stack;
893
1026
  }
894
1027
 
895
- void heap_record_free(heap_recorder *recorder, heap_record *stack) {
896
- ddog_prof_ManagedStringId *ids = recorder->reusable_ids;
897
-
898
- // Put all the ids in the same array; doesn't really matter the order
899
- for (u_int16_t i = 0; i < stack->frames_len; i++) {
900
- ids[i] = stack->frames[i].filename;
901
- ids[i + stack->frames_len] = stack->frames[i].name;
1028
+ void heap_record_free(heap_recorder *recorder, heap_record *stack, bool should_unintern) {
1029
+ // When tearing down the whole recorder state, we skip uninterning as it's not needed (the managed
1030
+ // string table is going to be destroyed anyway) and if there's any failures we can't raise
1031
+ // in the middle of a dfree callback.
1032
+ if (should_unintern) {
1033
+ ddog_prof_ManagedStringId *ids = recorder->reusable_ids;
1034
+
1035
+ // Put all the ids in the same array; doesn't really matter the order
1036
+ for (u_int16_t i = 0; i < stack->frames_len; i++) {
1037
+ ids[i] = stack->frames[i].filename;
1038
+ ids[i + stack->frames_len] = stack->frames[i].name;
1039
+ }
1040
+ unintern_all_or_raise(recorder, (ddog_prof_Slice_ManagedStringId) { .ptr = ids, .len = stack->frames_len * 2 });
902
1041
  }
903
- unintern_all_or_raise(recorder, (ddog_prof_Slice_ManagedStringId) { .ptr = ids, .len = stack->frames_len * 2 });
904
1042
 
905
1043
  free(stack); // See "note on calloc vs ruby_xcalloc use" above
906
1044
  }
@@ -955,6 +1093,17 @@ static VALUE get_ruby_string_or_raise(heap_recorder *recorder, ddog_prof_Managed
955
1093
  return ruby_string;
956
1094
  }
957
1095
 
1096
+ static long obj_id_or_fail(VALUE obj) {
1097
+ VALUE ruby_obj_id = rb_obj_id(obj);
1098
+ if (!FIXNUM_P(ruby_obj_id)) {
1099
+ // Bignum object ids indicate the fixnum range is exhausted - all future IDs will also be bignums.
1100
+ // Heap profiling cannot continue.
1101
+ raise_error(rb_eRuntimeError, "Heap profiling: bignum object id detected. Heap profiling cannot continue.");
1102
+ }
1103
+
1104
+ return FIX2LONG(ruby_obj_id);
1105
+ }
1106
+
958
1107
  static inline double ewma_stat(double previous, double current) {
959
1108
  double alpha = 0.3;
960
1109
  return (1 - alpha) * previous + alpha * current;
@@ -105,7 +105,9 @@ void heap_recorder_after_fork(heap_recorder *heap_recorder);
105
105
  // The sampling weight of this object.
106
106
  //
107
107
  // WARN: It needs to be paired with a ::end_heap_allocation_recording call.
108
- void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice alloc_class);
108
+ // Returns needs_after_allocation: true whenever the pending_recordings buffer goes from empty to non-empty and thus
109
+ // a after_sample callback is required to flush it
110
+ bool start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice alloc_class);
109
111
 
110
112
  // End a previously started heap allocation recording on the heap recorder.
111
113
  //
@@ -123,6 +125,15 @@ int end_heap_allocation_recording_with_rb_protect(heap_recorder *heap_recorder,
123
125
  // these objects quicker) and hopefully reduces tail latency (because there's less objects at serialization time to check).
124
126
  void heap_recorder_update_young_objects(heap_recorder *heap_recorder);
125
127
 
128
+ // Finalize any pending heap allocation recordings by getting their object IDs.
129
+ // This should be called via a postponed job, after the on_newobj_event has completed.
130
+ // Raises an exception if a fatal error occurs (e.g., bignum object ID detected).
131
+ void heap_recorder_finalize_pending_recordings(heap_recorder *heap_recorder);
132
+
133
+ // Mark pending recordings to prevent GC from collecting the objects
134
+ // while they're waiting for the recordings to be finalized.
135
+ void heap_recorder_mark_pending_recordings(heap_recorder *heap_recorder);
136
+
126
137
  // Update the heap recorder to reflect the latest state of the VM and prepare internal structures
127
138
  // for efficient iteration.
128
139
  //