datadog 2.30.0 → 2.45.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 (966) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +450 -1
  3. data/README.md +3 -0
  4. data/bin/ddprofrb +4 -4
  5. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  6. data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
  7. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
  8. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -1
  9. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +368 -151
  10. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +2 -6
  11. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
  12. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +29 -16
  13. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
  14. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -170
  15. data/ext/datadog_profiling_native_extension/collectors_stack.h +24 -5
  16. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +909 -552
  17. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +25 -9
  18. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  19. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +44 -19
  20. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -12
  21. data/ext/datadog_profiling_native_extension/extconf.rb +86 -104
  22. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
  23. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
  24. data/ext/datadog_profiling_native_extension/heap_recorder.c +393 -279
  25. data/ext/datadog_profiling_native_extension/heap_recorder.h +50 -31
  26. data/ext/datadog_profiling_native_extension/http_transport.c +10 -5
  27. data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
  28. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  29. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +847 -510
  30. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +38 -14
  31. data/ext/datadog_profiling_native_extension/profiling.c +65 -27
  32. data/ext/datadog_profiling_native_extension/ruby_helpers.c +37 -107
  33. data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -7
  34. data/ext/datadog_profiling_native_extension/stack_recorder.c +130 -93
  35. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -4
  36. data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
  37. data/ext/datadog_profiling_native_extension/time_helpers.h +25 -19
  38. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +4 -2
  39. data/ext/libdatadog_api/crashtracker.c +7 -8
  40. data/ext/libdatadog_api/datadog_ruby_common.c +44 -19
  41. data/ext/libdatadog_api/datadog_ruby_common.h +7 -12
  42. data/ext/libdatadog_api/di.c +218 -0
  43. data/ext/libdatadog_api/extconf.rb +40 -26
  44. data/ext/libdatadog_api/feature_flags.c +34 -0
  45. data/ext/libdatadog_api/init.c +13 -2
  46. data/ext/libdatadog_api/otel_thread_context.c +268 -0
  47. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  48. data/ext/libdatadog_api/trace_exporter.c +1998 -0
  49. data/ext/libdatadog_api/trace_exporter.h +5 -0
  50. data/ext/libdatadog_extconf_helpers.rb +63 -13
  51. data/lib/datadog/ai_guard/autoload.rb +10 -0
  52. data/lib/datadog/ai_guard/component.rb +24 -13
  53. data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
  54. data/lib/datadog/ai_guard/configuration.rb +119 -2
  55. data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
  56. data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
  57. data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
  58. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
  59. data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
  60. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
  61. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +54 -23
  62. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
  63. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
  64. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
  65. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
  66. data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
  67. data/lib/datadog/ai_guard/evaluation/content_part.rb +48 -0
  68. data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
  69. data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
  70. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +8 -6
  71. data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
  72. data/lib/datadog/ai_guard/evaluation/request.rb +8 -59
  73. data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
  74. data/lib/datadog/ai_guard/evaluation/result.rb +11 -16
  75. data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
  76. data/lib/datadog/ai_guard/evaluation.rb +75 -17
  77. data/lib/datadog/ai_guard/ext.rb +16 -0
  78. data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +15 -11
  79. data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
  80. data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
  81. data/lib/datadog/ai_guard/redaction/result.rb +29 -0
  82. data/lib/datadog/ai_guard/redaction.rb +80 -0
  83. data/lib/datadog/ai_guard.rb +70 -43
  84. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +22 -43
  85. data/lib/datadog/appsec/actions_handler.rb +6 -6
  86. data/lib/datadog/appsec/anonymizer.rb +1 -1
  87. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +2 -2
  88. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  89. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  90. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +2 -2
  91. data/lib/datadog/appsec/api_security/route_extractor.rb +26 -14
  92. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  93. data/lib/datadog/appsec/api_security.rb +1 -1
  94. data/lib/datadog/appsec/assets/blocked.html +1 -108
  95. data/lib/datadog/appsec/assets.rb +7 -7
  96. data/lib/datadog/appsec/autoload.rb +4 -4
  97. data/lib/datadog/appsec/component.rb +29 -22
  98. data/lib/datadog/appsec/compressed_json.rb +7 -7
  99. data/lib/datadog/appsec/configuration.rb +436 -1
  100. data/lib/datadog/appsec/context.rb +10 -8
  101. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  102. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  103. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  104. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
  105. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
  106. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
  107. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +146 -0
  108. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  109. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  110. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  111. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  112. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  113. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +14 -13
  114. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  115. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  116. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  117. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  118. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +76 -21
  119. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  120. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  121. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +72 -18
  122. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  123. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +66 -21
  124. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  125. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -8
  126. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  127. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
  128. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  129. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +56 -17
  130. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  131. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +46 -30
  132. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
  133. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  134. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  135. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  136. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +51 -61
  137. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  138. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +43 -4
  139. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +25 -9
  140. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  141. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  142. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  143. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  144. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  145. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  146. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  147. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  148. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +74 -21
  149. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  150. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  151. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +34 -13
  152. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  153. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  154. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  155. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  156. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  157. data/lib/datadog/appsec/default_header_tags.rb +52 -0
  158. data/lib/datadog/appsec/event.rb +14 -14
  159. data/lib/datadog/appsec/ext.rb +11 -10
  160. data/lib/datadog/appsec/extensions.rb +2 -2
  161. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -14
  162. data/lib/datadog/appsec/metrics/collector.rb +18 -1
  163. data/lib/datadog/appsec/metrics/exporter.rb +17 -11
  164. data/lib/datadog/appsec/metrics/telemetry.rb +15 -3
  165. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  166. data/lib/datadog/appsec/metrics.rb +4 -4
  167. data/lib/datadog/appsec/monitor/gateway/watcher.rb +18 -12
  168. data/lib/datadog/appsec/monitor.rb +1 -1
  169. data/lib/datadog/appsec/processor/rule_loader.rb +32 -32
  170. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  171. data/lib/datadog/appsec/remote.rb +15 -9
  172. data/lib/datadog/appsec/response.rb +22 -22
  173. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
  174. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
  175. data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
  176. data/lib/datadog/appsec/route_normalizer.rb +80 -0
  177. data/lib/datadog/appsec/security_engine/engine.rb +40 -40
  178. data/lib/datadog/appsec/security_engine/runner.rb +3 -3
  179. data/lib/datadog/appsec/security_event.rb +2 -2
  180. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  181. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  182. data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
  183. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  184. data/lib/datadog/appsec/utils/http/media_type.rb +5 -6
  185. data/lib/datadog/appsec/utils/http/url_encoded.rb +79 -24
  186. data/lib/datadog/appsec.rb +21 -24
  187. data/lib/datadog/auto_instrument.rb +2 -2
  188. data/lib/datadog/core/buffer/cruby.rb +1 -1
  189. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  190. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  191. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  192. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  193. data/lib/datadog/core/configuration/base.rb +19 -7
  194. data/lib/datadog/core/configuration/components.rb +151 -37
  195. data/lib/datadog/core/configuration/components_state.rb +6 -1
  196. data/lib/datadog/core/configuration/config_helper.rb +12 -3
  197. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  198. data/lib/datadog/core/configuration/ext.rb +11 -11
  199. data/lib/datadog/core/configuration/option.rb +46 -21
  200. data/lib/datadog/core/configuration/option_definition.rb +43 -17
  201. data/lib/datadog/core/configuration/options.rb +42 -8
  202. data/lib/datadog/core/configuration/settings.rb +133 -105
  203. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  204. data/lib/datadog/core/configuration/supported_configurations.rb +33 -1
  205. data/lib/datadog/core/configuration.rb +9 -9
  206. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  207. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  208. data/lib/datadog/core/crashtracking/component.rb +17 -13
  209. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  210. data/lib/datadog/core/deprecations.rb +1 -1
  211. data/lib/datadog/core/diagnostics/environment_logger.rb +45 -8
  212. data/lib/datadog/core/diagnostics/health.rb +2 -2
  213. data/lib/datadog/core/encoding.rb +4 -4
  214. data/lib/datadog/core/environment/agent_info.rb +2 -2
  215. data/lib/datadog/core/environment/cgroup.rb +4 -4
  216. data/lib/datadog/core/environment/container.rb +11 -11
  217. data/lib/datadog/core/environment/execution.rb +3 -3
  218. data/lib/datadog/core/environment/ext.rb +21 -15
  219. data/lib/datadog/core/environment/gc.rb +1 -1
  220. data/lib/datadog/core/environment/git.rb +2 -2
  221. data/lib/datadog/core/environment/identity.rb +47 -11
  222. data/lib/datadog/core/environment/platform.rb +8 -8
  223. data/lib/datadog/core/environment/process.rb +54 -19
  224. data/lib/datadog/core/environment/socket.rb +15 -2
  225. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  226. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  227. data/lib/datadog/core/environment/yjit.rb +2 -2
  228. data/lib/datadog/core/error.rb +5 -5
  229. data/lib/datadog/core/evp.rb +11 -0
  230. data/lib/datadog/core/extensions.rb +1 -1
  231. data/lib/datadog/core/feature_flags.rb +3 -3
  232. data/lib/datadog/core/git/ext.rb +4 -4
  233. data/lib/datadog/core/knuth_sampler.rb +3 -1
  234. data/lib/datadog/core/logger.rb +3 -3
  235. data/lib/datadog/core/logging/ext.rb +1 -1
  236. data/lib/datadog/core/metrics/client.rb +26 -26
  237. data/lib/datadog/core/metrics/ext.rb +5 -5
  238. data/lib/datadog/core/metrics/helpers.rb +1 -1
  239. data/lib/datadog/core/metrics/logging.rb +2 -2
  240. data/lib/datadog/core/metrics/options.rb +5 -5
  241. data/lib/datadog/core/pin.rb +1 -1
  242. data/lib/datadog/core/process_discovery.rb +8 -8
  243. data/lib/datadog/core/rate_limiter.rb +1 -1
  244. data/lib/datadog/core/remote/client/capabilities.rb +77 -19
  245. data/lib/datadog/core/remote/client.rb +18 -18
  246. data/lib/datadog/core/remote/component.rb +66 -34
  247. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  248. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  249. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  250. data/lib/datadog/core/remote/configuration/repository.rb +4 -4
  251. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  252. data/lib/datadog/core/remote/configuration.rb +4 -4
  253. data/lib/datadog/core/remote/ext.rb +3 -3
  254. data/lib/datadog/core/remote/negotiation.rb +1 -1
  255. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  256. data/lib/datadog/core/remote/transport/config.rb +4 -4
  257. data/lib/datadog/core/remote/transport/http/config.rb +10 -10
  258. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  259. data/lib/datadog/core/remote/transport/http.rb +10 -10
  260. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  261. data/lib/datadog/core/remote/worker.rb +13 -5
  262. data/lib/datadog/core/runtime/ext.rb +22 -22
  263. data/lib/datadog/core/runtime/metrics.rb +10 -10
  264. data/lib/datadog/core/tag_builder.rb +18 -18
  265. data/lib/datadog/core/tag_normalizer.rb +7 -7
  266. data/lib/datadog/core/telemetry/component.rb +16 -13
  267. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  268. data/lib/datadog/core/telemetry/emitter.rb +5 -5
  269. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +10 -9
  270. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  271. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  272. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +3 -3
  273. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  274. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  275. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  276. data/lib/datadog/core/telemetry/event/app_started.rb +142 -193
  277. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  278. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  279. data/lib/datadog/core/telemetry/event/generate_metrics.rb +3 -3
  280. data/lib/datadog/core/telemetry/event/log.rb +6 -6
  281. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  282. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  283. data/lib/datadog/core/telemetry/event.rb +16 -22
  284. data/lib/datadog/core/telemetry/ext.rb +11 -10
  285. data/lib/datadog/core/telemetry/logger.rb +1 -1
  286. data/lib/datadog/core/telemetry/logging.rb +5 -5
  287. data/lib/datadog/core/telemetry/metric.rb +9 -9
  288. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  289. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  290. data/lib/datadog/core/telemetry/request.rb +6 -8
  291. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +16 -11
  292. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  293. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  294. data/lib/datadog/core/telemetry/worker.rb +26 -6
  295. data/lib/datadog/core/transport/ext.rb +14 -14
  296. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  297. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  298. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  299. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  300. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  301. data/lib/datadog/core/transport/http/builder.rb +6 -6
  302. data/lib/datadog/core/transport/http/client.rb +2 -2
  303. data/lib/datadog/core/transport/http/response.rb +1 -1
  304. data/lib/datadog/core/transport/http.rb +9 -7
  305. data/lib/datadog/core/transport/response.rb +1 -1
  306. data/lib/datadog/core/transport/transport.rb +2 -2
  307. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +172 -20
  308. data/lib/datadog/core/utils/base64_codec.rb +23 -0
  309. data/lib/datadog/core/utils/duration.rb +1 -1
  310. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  311. data/lib/datadog/core/utils/forking.rb +3 -1
  312. data/lib/datadog/core/utils/hash.rb +0 -23
  313. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  314. data/lib/datadog/core/utils/network.rb +11 -11
  315. data/lib/datadog/core/utils/only_once.rb +1 -1
  316. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  317. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  318. data/lib/datadog/core/utils/sequence.rb +3 -6
  319. data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
  320. data/lib/datadog/core/utils/time.rb +18 -52
  321. data/lib/datadog/core/utils/url.rb +1 -1
  322. data/lib/datadog/core/utils.rb +5 -5
  323. data/lib/datadog/core/workers/async.rb +2 -2
  324. data/lib/datadog/core/workers/polling.rb +2 -2
  325. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  326. data/lib/datadog/core.rb +7 -5
  327. data/lib/datadog/data_streams/configuration.rb +40 -1
  328. data/lib/datadog/data_streams/ext.rb +1 -1
  329. data/lib/datadog/data_streams/extensions.rb +2 -2
  330. data/lib/datadog/data_streams/pathway_context.rb +28 -30
  331. data/lib/datadog/data_streams/processor.rb +93 -62
  332. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  333. data/lib/datadog/data_streams/transport/http.rb +5 -5
  334. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  335. data/lib/datadog/data_streams.rb +5 -5
  336. data/lib/datadog/di/base.rb +16 -8
  337. data/lib/datadog/di/boot.rb +25 -24
  338. data/lib/datadog/di/capture_expression.rb +21 -0
  339. data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
  340. data/lib/datadog/di/capture_limits.rb +41 -0
  341. data/lib/datadog/di/code_tracker.rb +218 -16
  342. data/lib/datadog/di/component.rb +123 -37
  343. data/lib/datadog/di/configuration.rb +241 -2
  344. data/lib/datadog/di/context.rb +9 -3
  345. data/lib/datadog/di/contrib/active_record.rb +6 -2
  346. data/lib/datadog/di/contrib/railtie.rb +1 -1
  347. data/lib/datadog/di/contrib.rb +5 -5
  348. data/lib/datadog/di/el/compiler.rb +114 -38
  349. data/lib/datadog/di/el/evaluator.rb +82 -2
  350. data/lib/datadog/di/el/expression.rb +13 -2
  351. data/lib/datadog/di/el.rb +3 -3
  352. data/lib/datadog/di/error.rb +10 -0
  353. data/lib/datadog/di/fatal_exceptions.rb +26 -0
  354. data/lib/datadog/di/instrumenter.rb +528 -184
  355. data/lib/datadog/di/logger.rb +3 -3
  356. data/lib/datadog/di/preload.rb +1 -1
  357. data/lib/datadog/di/probe.rb +69 -2
  358. data/lib/datadog/di/probe_builder.rb +98 -15
  359. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  360. data/lib/datadog/di/probe_file_loader.rb +14 -9
  361. data/lib/datadog/di/probe_manager.rb +83 -20
  362. data/lib/datadog/di/probe_notification_builder.rb +178 -25
  363. data/lib/datadog/di/probe_notifier_worker.rb +57 -37
  364. data/lib/datadog/di/probe_repository.rb +1 -1
  365. data/lib/datadog/di/proc_responder.rb +1 -1
  366. data/lib/datadog/di/redactor.rb +16 -1
  367. data/lib/datadog/di/remote.rb +187 -26
  368. data/lib/datadog/di/serializer.rb +79 -35
  369. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  370. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  371. data/lib/datadog/di/transport/http/input.rb +2 -2
  372. data/lib/datadog/di/transport/http.rb +10 -10
  373. data/lib/datadog/di/transport/input.rb +18 -14
  374. data/lib/datadog/di/utils.rb +43 -15
  375. data/lib/datadog/di.rb +147 -3
  376. data/lib/datadog/error_tracking/collector.rb +3 -2
  377. data/lib/datadog/error_tracking/component.rb +12 -12
  378. data/lib/datadog/error_tracking/configuration.rb +55 -2
  379. data/lib/datadog/error_tracking/ext.rb +7 -7
  380. data/lib/datadog/error_tracking/extensions.rb +2 -2
  381. data/lib/datadog/error_tracking/filters.rb +4 -4
  382. data/lib/datadog/error_tracking.rb +6 -6
  383. data/lib/datadog/kit/appsec/events/v2.rb +91 -33
  384. data/lib/datadog/kit/appsec/events.rb +25 -25
  385. data/lib/datadog/kit/enable_core_dumps.rb +3 -3
  386. data/lib/datadog/kit/identity.rb +18 -18
  387. data/lib/datadog/kit/tracing/method_tracer.rb +9 -6
  388. data/lib/datadog/kit.rb +1 -1
  389. data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
  390. data/lib/datadog/open_feature/agentless/parser.rb +43 -0
  391. data/lib/datadog/open_feature/agentless/response.rb +19 -0
  392. data/lib/datadog/open_feature/agentless/transport.rb +103 -0
  393. data/lib/datadog/open_feature/component.rb +118 -13
  394. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
  395. data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
  396. data/lib/datadog/open_feature/configuration/source.rb +43 -0
  397. data/lib/datadog/open_feature/configuration.rb +140 -1
  398. data/lib/datadog/open_feature/evaluation_engine.rb +38 -12
  399. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  400. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  401. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  402. data/lib/datadog/open_feature/exposures/event.rb +17 -10
  403. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  404. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  405. data/lib/datadog/open_feature/ext.rb +32 -6
  406. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +442 -0
  407. data/lib/datadog/open_feature/flag_evaluation/writer.rb +544 -0
  408. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +105 -0
  409. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +51 -0
  410. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  411. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  412. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  413. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  414. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  415. data/lib/datadog/open_feature/native_evaluator.rb +43 -7
  416. data/lib/datadog/open_feature/noop_evaluator.rb +8 -3
  417. data/lib/datadog/open_feature/provider.rb +115 -21
  418. data/lib/datadog/open_feature/remote.rb +8 -8
  419. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  420. data/lib/datadog/open_feature/transport.rb +71 -12
  421. data/lib/datadog/open_feature.rb +2 -2
  422. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  423. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  424. data/lib/datadog/opentelemetry/configuration/settings.rb +95 -28
  425. data/lib/datadog/opentelemetry/ext.rb +9 -0
  426. data/lib/datadog/opentelemetry/logs.rb +98 -0
  427. data/lib/datadog/opentelemetry/metrics.rb +17 -44
  428. data/lib/datadog/opentelemetry/sdk/configurator.rb +46 -6
  429. data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
  430. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
  431. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +9 -16
  432. data/lib/datadog/opentelemetry/sdk/propagator.rb +17 -11
  433. data/lib/datadog/opentelemetry/sdk/span_processor.rb +18 -15
  434. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  435. data/lib/datadog/opentelemetry/sdk.rb +19 -0
  436. data/lib/datadog/opentelemetry/signal_configuration.rb +57 -0
  437. data/lib/datadog/opentelemetry/trace.rb +4 -1
  438. data/lib/datadog/opentelemetry.rb +8 -7
  439. data/lib/datadog/profiling/collectors/code_provenance.rb +36 -11
  440. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +45 -3
  441. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +10 -4
  442. data/lib/datadog/profiling/collectors/info.rb +19 -10
  443. data/lib/datadog/profiling/collectors/thread_context.rb +16 -22
  444. data/lib/datadog/profiling/component.rb +43 -37
  445. data/lib/datadog/profiling/exporter.rb +43 -16
  446. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +6 -5
  447. data/lib/datadog/profiling/ext.rb +0 -2
  448. data/lib/datadog/profiling/flush.rb +21 -12
  449. data/lib/datadog/profiling/http_transport.rb +13 -2
  450. data/lib/datadog/profiling/load_native_extension.rb +2 -2
  451. data/lib/datadog/profiling/profiler.rb +13 -5
  452. data/lib/datadog/profiling/scheduler.rb +2 -2
  453. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  454. data/lib/datadog/profiling/stack_recorder.rb +0 -8
  455. data/lib/datadog/profiling/tag_builder.rb +19 -19
  456. data/lib/datadog/profiling/tasks/exec.rb +9 -4
  457. data/lib/datadog/profiling/tasks/help.rb +1 -0
  458. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  459. data/lib/datadog/profiling.rb +32 -29
  460. data/lib/datadog/ruby_version.rb +25 -0
  461. data/lib/datadog/single_step_instrument.rb +2 -2
  462. data/lib/datadog/symbol_database/component.rb +734 -0
  463. data/lib/datadog/symbol_database/configuration.rb +73 -0
  464. data/lib/datadog/symbol_database/extensions.rb +19 -0
  465. data/lib/datadog/symbol_database/extractor.rb +1092 -0
  466. data/lib/datadog/symbol_database/file_hash.rb +48 -0
  467. data/lib/datadog/symbol_database/logger.rb +43 -0
  468. data/lib/datadog/symbol_database/remote.rb +195 -0
  469. data/lib/datadog/symbol_database/scope.rb +102 -0
  470. data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
  471. data/lib/datadog/symbol_database/service_version.rb +66 -0
  472. data/lib/datadog/symbol_database/symbol.rb +69 -0
  473. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  474. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  475. data/lib/datadog/symbol_database/transport.rb +54 -0
  476. data/lib/datadog/symbol_database/uploader.rb +230 -0
  477. data/lib/datadog/symbol_database.rb +71 -0
  478. data/lib/datadog/tracing/analytics.rb +1 -1
  479. data/lib/datadog/tracing/buffer.rb +8 -8
  480. data/lib/datadog/tracing/client_ip.rb +4 -4
  481. data/lib/datadog/tracing/component.rb +41 -7
  482. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  483. data/lib/datadog/tracing/configuration/dynamic.rb +13 -11
  484. data/lib/datadog/tracing/configuration/ext.rb +53 -38
  485. data/lib/datadog/tracing/configuration/http.rb +2 -2
  486. data/lib/datadog/tracing/configuration/settings.rb +58 -17
  487. data/lib/datadog/tracing/context.rb +25 -3
  488. data/lib/datadog/tracing/context_provider.rb +11 -7
  489. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  490. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  491. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +9 -6
  492. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +8 -5
  493. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +9 -6
  494. data/lib/datadog/tracing/contrib/action_cable/events.rb +5 -5
  495. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  496. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +8 -5
  497. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  498. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  499. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  500. data/lib/datadog/tracing/contrib/action_mailer/event.rb +7 -4
  501. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  502. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  503. data/lib/datadog/tracing/contrib/action_mailer/events.rb +3 -3
  504. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  505. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  506. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  507. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -12
  508. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  509. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +31 -3
  510. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +5 -3
  511. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  512. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  513. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  514. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  515. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  516. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  517. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  518. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +10 -7
  519. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +11 -8
  520. data/lib/datadog/tracing/contrib/action_view/events.rb +3 -3
  521. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  522. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  523. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  524. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  525. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  526. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
  527. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  528. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +10 -7
  529. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +10 -7
  530. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +10 -7
  531. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +10 -7
  532. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +10 -7
  533. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +10 -7
  534. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  535. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  536. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  537. data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -5
  538. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  539. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  540. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +7 -7
  541. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +8 -9
  542. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +3 -3
  543. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  544. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  545. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  546. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  547. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +9 -9
  548. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  549. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  550. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +9 -9
  551. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +12 -14
  552. data/lib/datadog/tracing/contrib/active_record/events.rb +3 -3
  553. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  554. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  555. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  556. data/lib/datadog/tracing/contrib/active_record/utils.rb +4 -4
  557. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  558. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +14 -17
  559. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  560. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +5 -8
  561. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  562. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  563. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  564. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  565. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  566. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  567. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  568. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +3 -3
  569. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  570. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  571. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  572. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  573. data/lib/datadog/tracing/contrib/aws/ext.rb +26 -26
  574. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -11
  575. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  576. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  577. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  578. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  579. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  580. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  581. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  582. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  583. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  584. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  585. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  586. data/lib/datadog/tracing/contrib/component.rb +1 -1
  587. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  588. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  589. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  590. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  591. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  592. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  593. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  594. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  595. data/lib/datadog/tracing/contrib/configurable.rb +20 -5
  596. data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
  597. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  598. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  599. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  600. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  601. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +6 -10
  602. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  603. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  604. data/lib/datadog/tracing/contrib/dalli/quantize.rb +3 -3
  605. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  606. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  607. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  608. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  609. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -5
  610. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  611. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  612. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  613. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  614. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +12 -16
  615. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +4 -4
  616. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  617. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +9 -13
  618. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  619. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  620. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +4 -11
  621. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  622. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  623. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  624. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  625. data/lib/datadog/tracing/contrib/excon/middleware.rb +10 -14
  626. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  627. data/lib/datadog/tracing/contrib/ext.rb +20 -18
  628. data/lib/datadog/tracing/contrib/extensions.rb +11 -2
  629. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  630. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  631. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  632. data/lib/datadog/tracing/contrib/faraday/middleware.rb +10 -14
  633. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  634. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  635. data/lib/datadog/tracing/contrib/grape/endpoint.rb +59 -29
  636. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  637. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  638. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  639. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  640. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  641. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  642. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  643. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  644. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  645. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +38 -37
  646. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  647. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  648. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
  649. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +11 -15
  650. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  651. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  652. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +11 -9
  653. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  654. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  655. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  656. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  657. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  658. data/lib/datadog/tracing/contrib/grpc.rb +7 -6
  659. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +4 -3
  660. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  661. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  662. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  663. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  664. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +4 -3
  665. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +6 -4
  666. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  667. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  668. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  669. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +10 -8
  670. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  671. data/lib/datadog/tracing/contrib/http/instrumentation.rb +10 -14
  672. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  673. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  674. data/lib/datadog/tracing/contrib/http.rb +7 -6
  675. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  676. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  677. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +12 -12
  678. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  679. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  680. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  681. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  682. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +10 -14
  683. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  684. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  685. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  686. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  687. data/lib/datadog/tracing/contrib/kafka/event.rb +4 -3
  688. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  689. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  690. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  691. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  692. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  693. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  694. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  695. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  696. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  697. data/lib/datadog/tracing/contrib/kafka/events.rb +10 -10
  698. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  699. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +4 -4
  700. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +6 -6
  701. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  702. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  703. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  704. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +11 -9
  705. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  706. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  707. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  708. data/lib/datadog/tracing/contrib/karafka/patcher.rb +9 -9
  709. data/lib/datadog/tracing/contrib/karafka.rb +7 -6
  710. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  711. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  712. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  713. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  714. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  715. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  716. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  717. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  718. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +9 -9
  719. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  720. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -21
  721. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  722. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  723. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +7 -11
  724. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  725. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  726. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  727. data/lib/datadog/tracing/contrib/opensearch/ext.rb +23 -23
  728. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  729. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +15 -19
  730. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  731. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  732. data/lib/datadog/tracing/contrib/patcher.rb +3 -3
  733. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  734. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  735. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +19 -23
  736. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  737. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  738. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  739. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  740. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +8 -10
  741. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  742. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  743. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  744. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +19 -16
  745. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +3 -3
  746. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  747. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  748. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  749. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  750. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  751. data/lib/datadog/tracing/contrib/que/tracer.rb +3 -2
  752. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  753. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -9
  754. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  755. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  756. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  757. data/lib/datadog/tracing/contrib/racecar/events.rb +4 -4
  758. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  759. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  760. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  761. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +9 -3
  762. data/lib/datadog/tracing/contrib/rack/ext.rb +43 -16
  763. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  764. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +24 -1
  765. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  766. data/lib/datadog/tracing/contrib/rack/middlewares.rb +28 -25
  767. data/lib/datadog/tracing/contrib/rack/patcher.rb +5 -5
  768. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -4
  769. data/lib/datadog/tracing/contrib/rack/route_inference.rb +12 -10
  770. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +124 -6
  771. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  772. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  773. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  774. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  775. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  776. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  777. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  778. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -9
  779. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  780. data/lib/datadog/tracing/contrib/rails/runner.rb +4 -2
  781. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  782. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  783. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +9 -7
  784. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  785. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  786. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +3 -3
  787. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  788. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  789. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  790. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  791. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  792. data/lib/datadog/tracing/contrib/redis/quantize.rb +40 -6
  793. data/lib/datadog/tracing/contrib/redis/tags.rb +6 -11
  794. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +16 -8
  795. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  796. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  797. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  798. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  799. data/lib/datadog/tracing/contrib/resque/resque_job.rb +6 -5
  800. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  801. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  802. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  803. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  804. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +6 -10
  805. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  806. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -5
  807. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -5
  808. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  809. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  810. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  811. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  812. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  813. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  814. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  815. data/lib/datadog/tracing/contrib/sequel/database.rb +7 -10
  816. data/lib/datadog/tracing/contrib/sequel/dataset.rb +6 -5
  817. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  818. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  819. data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
  820. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  821. data/lib/datadog/tracing/contrib/sequel/utils.rb +103 -16
  822. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  823. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  824. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  825. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  826. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -2
  827. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -8
  828. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  829. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +12 -10
  830. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  831. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  832. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  833. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  834. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  835. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  836. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  837. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  838. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +15 -14
  839. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +10 -10
  840. data/lib/datadog/tracing/contrib/sidekiq.rb +7 -6
  841. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +3 -3
  842. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  843. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  844. data/lib/datadog/tracing/contrib/sinatra/framework.rb +2 -2
  845. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  846. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  847. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +11 -10
  848. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +9 -8
  849. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  850. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  851. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  852. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  853. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +5 -4
  854. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  855. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  856. data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
  857. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  858. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  859. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  860. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  861. data/lib/datadog/tracing/contrib/stripe/request.rb +4 -4
  862. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  863. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  864. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  865. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +5 -4
  866. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  867. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  868. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  869. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  870. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +7 -11
  871. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  872. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  873. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  874. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +3 -3
  875. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +16 -13
  876. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  877. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +11 -9
  878. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  879. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  880. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  881. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  882. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  883. data/lib/datadog/tracing/contrib/waterdrop.rb +7 -6
  884. data/lib/datadog/tracing/contrib.rb +62 -54
  885. data/lib/datadog/tracing/correlation.rb +12 -12
  886. data/lib/datadog/tracing/diagnostics/environment_logger.rb +15 -12
  887. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  888. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  889. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  890. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  891. data/lib/datadog/tracing/distributed/baggage.rb +81 -28
  892. data/lib/datadog/tracing/distributed/datadog.rb +34 -32
  893. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  894. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  895. data/lib/datadog/tracing/distributed/propagation.rb +46 -11
  896. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  897. data/lib/datadog/tracing/distributed/trace_context.rb +29 -263
  898. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  899. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  900. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  901. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  902. data/lib/datadog/tracing/event.rb +2 -2
  903. data/lib/datadog/tracing/ext.rb +9 -0
  904. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  905. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  906. data/lib/datadog/tracing/metadata/ext.rb +79 -66
  907. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  908. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  909. data/lib/datadog/tracing/metadata/tagging.rb +5 -5
  910. data/lib/datadog/tracing/metadata.rb +4 -4
  911. data/lib/datadog/tracing/otel_thread_context.rb +99 -0
  912. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  913. data/lib/datadog/tracing/pipeline.rb +3 -3
  914. data/lib/datadog/tracing/remote.rb +227 -21
  915. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  916. data/lib/datadog/tracing/sampling/ext.rb +9 -7
  917. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  918. data/lib/datadog/tracing/sampling/priority_sampler.rb +17 -4
  919. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  920. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  921. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  922. data/lib/datadog/tracing/sampling/rule.rb +5 -5
  923. data/lib/datadog/tracing/sampling/rule_sampler.rb +68 -37
  924. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  925. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  926. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  927. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  928. data/lib/datadog/tracing/sampling/span/rule_parser.rb +10 -10
  929. data/lib/datadog/tracing/span.rb +9 -9
  930. data/lib/datadog/tracing/span_event.rb +5 -5
  931. data/lib/datadog/tracing/span_operation.rb +39 -26
  932. data/lib/datadog/tracing/sync_writer.rb +12 -7
  933. data/lib/datadog/tracing/trace_digest.rb +29 -4
  934. data/lib/datadog/tracing/trace_operation.rb +112 -31
  935. data/lib/datadog/tracing/trace_segment.rb +10 -10
  936. data/lib/datadog/tracing/tracer.rb +83 -29
  937. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  938. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  939. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  940. data/lib/datadog/tracing/transport/http.rb +10 -10
  941. data/lib/datadog/tracing/transport/io/client.rb +3 -3
  942. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  943. data/lib/datadog/tracing/transport/io/traces.rb +5 -5
  944. data/lib/datadog/tracing/transport/io.rb +3 -3
  945. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  946. data/lib/datadog/tracing/transport/native.rb +380 -0
  947. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  948. data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
  949. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  950. data/lib/datadog/tracing/transport/trace_formatter.rb +23 -13
  951. data/lib/datadog/tracing/transport/traces.rb +12 -32
  952. data/lib/datadog/tracing/utils.rb +2 -2
  953. data/lib/datadog/tracing/workers.rb +4 -3
  954. data/lib/datadog/tracing/writer.rb +22 -9
  955. data/lib/datadog/tracing.rb +3 -3
  956. data/lib/datadog/version.rb +4 -4
  957. data/lib/datadog.rb +15 -11
  958. metadata +109 -23
  959. data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
  960. data/lib/datadog/ai_guard/configuration/settings.rb +0 -113
  961. data/lib/datadog/appsec/configuration/settings.rb +0 -423
  962. data/lib/datadog/core/utils/base64.rb +0 -22
  963. data/lib/datadog/data_streams/configuration/settings.rb +0 -49
  964. data/lib/datadog/di/configuration/settings.rb +0 -243
  965. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
  966. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -82
@@ -226,6 +226,18 @@ typedef struct {
226
226
  bool serialize_ran;
227
227
  } call_serialize_without_gvl_arguments;
228
228
 
229
+ typedef struct {
230
+ // Set by caller
231
+ stack_recorder_state *state;
232
+ locked_profile_slot active_slot;
233
+ ddog_prof_Slice_Location locations;
234
+ sample_values values;
235
+ sample_labels labels;
236
+
237
+ // Set by callee
238
+ ddog_prof_Profile_Result result;
239
+ } record_sample_arguments;
240
+
229
241
  static VALUE _native_new(VALUE klass);
230
242
  static void initialize_slot_concurrency_control(stack_recorder_state *state);
231
243
  static void stack_recorder_typed_data_mark(void *data);
@@ -235,6 +247,8 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
235
247
  static VALUE _native_serialize(VALUE self, VALUE recorder_instance);
236
248
  static VALUE ruby_time_from(ddog_Timespec ddprof_time);
237
249
  static void *call_serialize_without_gvl(void *call_args);
250
+ static VALUE record_sample_locked(VALUE record_sample_arguments_as_value);
251
+ static VALUE record_sample_unlock_ensure(VALUE record_sample_arguments_as_value);
238
252
  static locked_profile_slot sampler_lock_active_profile(stack_recorder_state *state);
239
253
  static void sampler_unlock_active_profile(locked_profile_slot active_slot);
240
254
  static profile_slot* serializer_flip_active_and_inactive_slots(stack_recorder_state *state);
@@ -247,18 +261,20 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_
247
261
  static void serializer_set_start_timestamp_for_next_profile(stack_recorder_state *state, ddog_Timespec start_time);
248
262
  static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint);
249
263
  static void reset_profile_slot(profile_slot *slot, ddog_Timespec start_timestamp);
250
- static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class);
251
264
  static VALUE _native_start_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
252
265
  static VALUE _native_end_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
253
266
  static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
254
267
  static VALUE _native_stats(DDTRACE_UNUSED VALUE self, VALUE instance);
255
268
  static VALUE build_profile_stats(profile_slot *slot, long serialization_time_ns, long heap_iteration_prep_time_ns, long heap_profile_build_time_ns);
256
- static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE object_id);
269
+ static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE record_id);
270
+ static VALUE _native_record_id_for(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE obj);
257
271
  static VALUE _native_heap_recorder_reset_last_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
258
- static VALUE _native_recorder_after_gc_step(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
272
+ static VALUE _native_heap_recorder_exhaust_record_ids(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
273
+ static VALUE _native_heap_recorder_set_object_alloc_gen(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE record_id, VALUE alloc_gen);
274
+ static VALUE _native_recorder_heap_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
259
275
  static VALUE _native_benchmark_intern(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE string, VALUE times, VALUE use_all);
260
276
  static VALUE _native_test_managed_string_storage_produces_valid_profiles(DDTRACE_UNUSED VALUE _self);
261
- static VALUE _native_finalize_pending_heap_recordings(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
277
+ static VALUE _native_commit_heap_recordings(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
262
278
 
263
279
  void stack_recorder_init(VALUE profiling_module) {
264
280
  VALUE stack_recorder_class = rb_define_class_under(profiling_module, "StackRecorder", rb_cObject);
@@ -283,7 +299,6 @@ void stack_recorder_init(VALUE profiling_module) {
283
299
  rb_define_singleton_method(testing_module, "_native_slot_one_mutex_locked?", _native_is_slot_one_mutex_locked, 1);
284
300
  rb_define_singleton_method(testing_module, "_native_slot_two_mutex_locked?", _native_is_slot_two_mutex_locked, 1);
285
301
  rb_define_singleton_method(testing_module, "_native_record_endpoint", _native_record_endpoint, 3);
286
- rb_define_singleton_method(testing_module, "_native_track_object", _native_track_object, 4);
287
302
  rb_define_singleton_method(testing_module, "_native_start_fake_slow_heap_serialization",
288
303
  _native_start_fake_slow_heap_serialization, 1);
289
304
  rb_define_singleton_method(testing_module, "_native_end_fake_slow_heap_serialization",
@@ -291,11 +306,14 @@ void stack_recorder_init(VALUE profiling_module) {
291
306
  rb_define_singleton_method(testing_module, "_native_debug_heap_recorder",
292
307
  _native_debug_heap_recorder, 1);
293
308
  rb_define_singleton_method(testing_module, "_native_is_object_recorded?", _native_is_object_recorded, 2);
309
+ rb_define_singleton_method(testing_module, "_native_record_id_for", _native_record_id_for, 2);
294
310
  rb_define_singleton_method(testing_module, "_native_heap_recorder_reset_last_update", _native_heap_recorder_reset_last_update, 1);
295
- rb_define_singleton_method(testing_module, "_native_recorder_after_gc_step", _native_recorder_after_gc_step, 1);
311
+ rb_define_singleton_method(testing_module, "_native_heap_recorder_exhaust_record_ids", _native_heap_recorder_exhaust_record_ids, 1);
312
+ rb_define_singleton_method(testing_module, "_native_heap_recorder_set_object_alloc_gen", _native_heap_recorder_set_object_alloc_gen, 3);
313
+ rb_define_singleton_method(testing_module, "_native_recorder_heap_update", _native_recorder_heap_update, 1);
296
314
  rb_define_singleton_method(testing_module, "_native_benchmark_intern", _native_benchmark_intern, 4);
297
315
  rb_define_singleton_method(testing_module, "_native_test_managed_string_storage_produces_valid_profiles", _native_test_managed_string_storage_produces_valid_profiles, 0);
298
- rb_define_singleton_method(testing_module, "_native_finalize_pending_heap_recordings", _native_finalize_pending_heap_recordings, 1);
316
+ rb_define_singleton_method(testing_module, "_native_commit_heap_recordings", _native_commit_heap_recordings, 1);
299
317
 
300
318
  ok_symbol = ID2SYM(rb_intern_const("ok"));
301
319
  error_symbol = ID2SYM(rb_intern_const("error"));
@@ -391,7 +409,7 @@ static void initialize_profiles(stack_recorder_state *state, ddog_prof_Slice_Sam
391
409
  static void stack_recorder_typed_data_mark(void *state_ptr) {
392
410
  stack_recorder_state *state = (stack_recorder_state *) state_ptr;
393
411
 
394
- heap_recorder_mark_pending_recordings(state->heap_recorder);
412
+ heap_recorder_mark(state->heap_recorder);
395
413
  }
396
414
 
397
415
  static void stack_recorder_typed_data_free(void *state_ptr) {
@@ -416,20 +434,16 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
416
434
  if (options == Qnil) options = rb_hash_new();
417
435
 
418
436
  VALUE recorder_instance = rb_hash_fetch(options, ID2SYM(rb_intern("self_instance")));
419
- VALUE cpu_time_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("cpu_time_enabled")));
420
437
  VALUE alloc_samples_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("alloc_samples_enabled")));
421
438
  VALUE heap_samples_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_samples_enabled")));
422
439
  VALUE heap_size_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_size_enabled")));
423
440
  VALUE heap_sample_every = rb_hash_fetch(options, ID2SYM(rb_intern("heap_sample_every")));
424
- VALUE timeline_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("timeline_enabled")));
425
441
  VALUE heap_clean_after_gc_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_clean_after_gc_enabled")));
426
442
 
427
- ENFORCE_BOOLEAN(cpu_time_enabled);
428
443
  ENFORCE_BOOLEAN(alloc_samples_enabled);
429
444
  ENFORCE_BOOLEAN(heap_samples_enabled);
430
445
  ENFORCE_BOOLEAN(heap_size_enabled);
431
446
  ENFORCE_TYPE(heap_sample_every, T_FIXNUM);
432
- ENFORCE_BOOLEAN(timeline_enabled);
433
447
  ENFORCE_BOOLEAN(heap_clean_after_gc_enabled);
434
448
 
435
449
  stack_recorder_state *state;
@@ -440,11 +454,9 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
440
454
  heap_recorder_set_sample_rate(state->heap_recorder, NUM2INT(heap_sample_every));
441
455
 
442
456
  uint8_t requested_values_count = ALL_VALUE_TYPES_COUNT -
443
- (cpu_time_enabled == Qtrue ? 0 : 1) -
444
457
  (alloc_samples_enabled == Qtrue? 0 : 2) -
445
458
  (heap_samples_enabled == Qtrue ? 0 : 1) -
446
- (heap_size_enabled == Qtrue ? 0 : 1) -
447
- (timeline_enabled == Qtrue ? 0 : 1);
459
+ (heap_size_enabled == Qtrue ? 0 : 1);
448
460
 
449
461
  if (requested_values_count == ALL_VALUE_TYPES_COUNT) return Qtrue; // Nothing to do, this is the default
450
462
 
@@ -466,12 +478,13 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
466
478
  enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_WALL_TIME;
467
479
  state->position_for[WALL_TIME_VALUE_ID] = next_enabled_pos++;
468
480
 
469
- if (cpu_time_enabled == Qtrue) {
470
- enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_CPU_TIME;
471
- state->position_for[CPU_TIME_VALUE_ID] = next_enabled_pos++;
472
- } else {
473
- state->position_for[CPU_TIME_VALUE_ID] = next_disabled_pos++;
474
- }
481
+ // CPU_TIME is always enabled
482
+ enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_CPU_TIME;
483
+ state->position_for[CPU_TIME_VALUE_ID] = next_enabled_pos++;
484
+
485
+ // TIMELINE is always enabled
486
+ enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_TIMELINE;
487
+ state->position_for[TIMELINE_VALUE_ID] = next_enabled_pos++;
475
488
 
476
489
  if (alloc_samples_enabled == Qtrue) {
477
490
  enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_ALLOC_SAMPLES;
@@ -506,13 +519,6 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
506
519
  state->heap_recorder = NULL;
507
520
  }
508
521
 
509
- if (timeline_enabled == Qtrue) {
510
- enabled_sample_types[next_enabled_pos] = DDOG_PROF_SAMPLE_TYPE_TIMELINE;
511
- state->position_for[TIMELINE_VALUE_ID] = next_enabled_pos++;
512
- } else {
513
- state->position_for[TIMELINE_VALUE_ID] = next_disabled_pos++;
514
- }
515
-
516
522
  ddog_prof_Profile_drop(&state->profile_slot_one.profile);
517
523
  ddog_prof_Profile_drop(&state->profile_slot_two.profile);
518
524
 
@@ -526,17 +532,17 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan
526
532
  stack_recorder_state *state;
527
533
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
528
534
 
529
- ddog_Timespec finish_timestamp = system_epoch_now_timespec();
530
- // Need to do this while still holding on to the Global VM Lock; see comments on method for why
531
- serializer_set_start_timestamp_for_next_profile(state, finish_timestamp);
532
-
533
- long heap_iteration_prep_start_time_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
535
+ long heap_iteration_prep_start_time_ns = monotonic_wall_time_now_ns();
534
536
  // Prepare the iteration on heap recorder we'll be doing outside the GVL. The preparation needs to
535
- // happen while holding on to the GVL.
537
+ // happen while holding the GVL.
536
538
  // NOTE: While rare, it's possible for the GVL to be released inside this function (see comments on `heap_recorder_update`)
537
539
  // and thus don't assume this is an "atomic" step -- other threads may get some running time in the meanwhile.
538
540
  heap_recorder_prepare_iteration(state->heap_recorder);
539
- long heap_iteration_prep_time_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE) - heap_iteration_prep_start_time_ns;
541
+ long heap_iteration_prep_time_ns = monotonic_wall_time_now_ns() - heap_iteration_prep_start_time_ns;
542
+
543
+ ddog_Timespec finish_timestamp = system_epoch_now_timespec();
544
+ // Need to do this while still holding the Global VM Lock; see comments on method for why
545
+ serializer_set_start_timestamp_for_next_profile(state, finish_timestamp);
540
546
 
541
547
  // We'll release the Global VM Lock while we're calling serialize, so that the Ruby VM can continue to work while this
542
548
  // is pending
@@ -560,7 +566,7 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan
560
566
  rb_thread_call_without_gvl2(call_serialize_without_gvl, &args, NULL /* No interruption function needed in this case */, NULL /* Not needed */);
561
567
  }
562
568
 
563
- // Cleanup after heap recorder iteration. This needs to happen while holding on to the GVL.
569
+ // Cleanup after heap recorder iteration. This needs to happen while holding the GVL.
564
570
  heap_recorder_finish_iteration(state->heap_recorder);
565
571
 
566
572
  // NOTE: We are focusing on the serialization time outside of the GVL in this stat here. This doesn't
@@ -606,7 +612,28 @@ void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations,
606
612
  stack_recorder_state *state;
607
613
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
608
614
 
609
- locked_profile_slot active_slot = sampler_lock_active_profile(state);
615
+ record_sample_arguments args = {
616
+ .state = state,
617
+ .active_slot = sampler_lock_active_profile(state),
618
+ .locations = locations,
619
+ .values = values,
620
+ .labels = labels,
621
+ };
622
+
623
+ // NOTE: The heap recorder is allowed to raise exceptions if something's wrong. We use `rb_ensure` to make sure we
624
+ // properly unlock the active slot mutex on our way out. Otherwise, this would later lead to deadlocks (since the
625
+ // active slot mutex is not expected to be locked forever).
626
+ rb_ensure(record_sample_locked, (VALUE) &args, record_sample_unlock_ensure, (VALUE) &args);
627
+
628
+ if (args.result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
629
+ raise_error(rb_eArgError, "Failed to record sample: %"PRIsVALUE, get_error_details_and_drop(&args.result.err));
630
+ }
631
+ }
632
+
633
+ static VALUE record_sample_locked(VALUE record_sample_arguments_as_value) {
634
+ record_sample_arguments *args = (record_sample_arguments *) record_sample_arguments_as_value;
635
+ stack_recorder_state *state = args->state;
636
+ sample_values values = args->values;
610
637
 
611
638
  // Note: We initialize this array to have ALL_VALUE_TYPES_COUNT but only tell libdatadog to use the first
612
639
  // state->enabled_values_count values. This simplifies handling disabled value types -- we still put them on the
@@ -622,49 +649,39 @@ void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations,
622
649
  metric_values[position_for[ALLOC_SAMPLES_UNSCALED_VALUE_ID]] = values.alloc_samples_unscaled;
623
650
  metric_values[position_for[TIMELINE_VALUE_ID]] = values.timeline_wall_time_ns;
624
651
 
625
- if (values.heap_sample) {
626
- // If we got an allocation sample end the heap allocation recording to commit the heap sample.
627
- // FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening
628
- // very late in the allocation-sampling path (which is shared with the cpu sampling path). This can
629
- // be fixed with some refactoring but for now this leads to a less impactful change.
630
- //
631
- // NOTE: The heap recorder is allowed to raise exceptions if something's wrong. But we also need to handle it
632
- // on this side to make sure we properly unlock the active slot mutex on our way out. Otherwise, this would
633
- // later lead to deadlocks (since the active slot mutex is not expected to be locked forever).
634
- int exception_state = end_heap_allocation_recording_with_rb_protect(state->heap_recorder, locations);
635
- if (exception_state) {
636
- sampler_unlock_active_profile(active_slot);
637
- rb_jump_tag(exception_state);
638
- }
652
+ if (values.heap_sample != NULL) {
653
+ heap_recorder_record_allocation(
654
+ state->heap_recorder,
655
+ values.heap_sample->new_object,
656
+ values.alloc_samples,
657
+ values.heap_sample->alloc_class,
658
+ args->locations,
659
+ &values.heap_sample->out_needs_commit
660
+ );
639
661
  }
640
662
 
641
- ddog_prof_Profile_Result result = ddog_prof_Profile_add(
642
- &active_slot.data->profile,
663
+ args->result = ddog_prof_Profile_add(
664
+ &args->active_slot.data->profile,
643
665
  (ddog_prof_Sample) {
644
- .locations = locations,
666
+ .locations = args->locations,
645
667
  .values = (ddog_Slice_I64) {.ptr = metric_values, .len = state->enabled_values_count},
646
- .labels = labels.labels
668
+ .labels = args->labels.labels
647
669
  },
648
- labels.end_timestamp_ns
670
+ /* To disable end_timestamp_ns to get aggregated profiles in pprof, replace the below with `0` */
671
+ args->labels.end_timestamp_ns
649
672
  );
650
673
 
651
- active_slot.data->stats.recorded_samples++;
652
-
653
- sampler_unlock_active_profile(active_slot);
674
+ args->active_slot.data->stats.recorded_samples++;
654
675
 
655
- if (result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
656
- raise_error(rb_eArgError, "Failed to record sample: %"PRIsVALUE, get_error_details_and_drop(&result.err));
657
- }
676
+ return Qnil; // Unused
658
677
  }
659
678
 
660
- // Returns needs_after_allocation: true whenever an after_sample callback is required
661
- bool track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice alloc_class) {
662
- stack_recorder_state *state;
663
- TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
664
- // FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening
665
- // very late in the allocation-sampling path (which is shared with the cpu sampling path). This can
666
- // be fixed with some refactoring but for now this leads to a less impactful change.
667
- return start_heap_allocation_recording(state->heap_recorder, new_object, sample_weight, alloc_class);
679
+ static VALUE record_sample_unlock_ensure(VALUE record_sample_arguments_as_value) {
680
+ record_sample_arguments *args = (record_sample_arguments *) record_sample_arguments_as_value;
681
+
682
+ sampler_unlock_active_profile(args->active_slot);
683
+
684
+ return Qnil; // Unused
668
685
  }
669
686
 
670
687
  void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint) {
@@ -682,18 +699,18 @@ void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_
682
699
  }
683
700
  }
684
701
 
685
- void recorder_after_gc_step(VALUE recorder_instance) {
702
+ void recorder_heap_update_may_lose_gvl(VALUE recorder_instance) {
686
703
  stack_recorder_state *state;
687
704
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
688
705
 
689
706
  if (state->heap_clean_after_gc_enabled) heap_recorder_update_young_objects(state->heap_recorder);
690
707
  }
691
708
 
692
- void recorder_after_sample(VALUE recorder_instance) {
709
+ void recorder_commit_heap_recordings_may_lose_gvl(VALUE recorder_instance) {
693
710
  stack_recorder_state *state;
694
711
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
695
712
 
696
- heap_recorder_finalize_pending_recordings(state->heap_recorder);
713
+ heap_recorder_commit_recordings_may_lose_gvl(state->heap_recorder);
697
714
  }
698
715
 
699
716
  #define MAX_LEN_HEAP_ITERATION_ERROR_MSG 256
@@ -783,7 +800,7 @@ static void build_heap_profile_without_gvl(stack_recorder_state *state, profile_
783
800
  static void *call_serialize_without_gvl(void *call_args) {
784
801
  call_serialize_without_gvl_arguments *args = (call_serialize_without_gvl_arguments *) call_args;
785
802
 
786
- long serialize_no_gvl_start_time_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
803
+ long serialize_no_gvl_start_time_ns = monotonic_wall_time_now_ns();
787
804
 
788
805
  profile_slot *slot_now_inactive = serializer_flip_active_and_inactive_slots(args->state);
789
806
  args->slot = slot_now_inactive;
@@ -791,13 +808,13 @@ static void *call_serialize_without_gvl(void *call_args) {
791
808
  // Now that we have the inactive profile with all but heap samples, lets fill it with heap data
792
809
  // without needing to race with the active sampler
793
810
  build_heap_profile_without_gvl(args->state, args->slot);
794
- args->heap_profile_build_time_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE) - serialize_no_gvl_start_time_ns;
811
+ args->heap_profile_build_time_ns = monotonic_wall_time_now_ns() - serialize_no_gvl_start_time_ns;
795
812
 
796
813
  // Note: The profile gets reset by the serialize call
797
814
  args->result = ddog_prof_Profile_serialize(&args->slot->profile, &args->slot->start_timestamp, &args->finish_timestamp);
798
815
  args->advance_gen_result = ddog_prof_ManagedStringStorage_advance_gen(args->state->string_storage);
799
816
  args->serialize_ran = true;
800
- args->serialize_no_gvl_time_ns = long_max_of(0, monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE) - serialize_no_gvl_start_time_ns);
817
+ args->serialize_no_gvl_time_ns = long_max_of(0, monotonic_wall_time_now_ns() - serialize_no_gvl_start_time_ns);
801
818
 
802
819
  return NULL; // Unused
803
820
  }
@@ -897,7 +914,7 @@ static VALUE test_slot_mutex_state(VALUE recorder_instance, int slot) {
897
914
  }
898
915
 
899
916
  static ddog_Timespec system_epoch_now_timespec(void) {
900
- long now_ns = system_epoch_time_now_ns(RAISE_ON_FAILURE);
917
+ long now_ns = system_epoch_time_now_ns();
901
918
  return (ddog_Timespec) {.seconds = now_ns / SECONDS_AS_NS(1), .nanoseconds = now_ns % SECONDS_AS_NS(1)};
902
919
  }
903
920
 
@@ -905,6 +922,9 @@ static ddog_Timespec system_epoch_now_timespec(void) {
905
922
  //
906
923
  // Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
907
924
  // trigger samples at the same time.
925
+ //
926
+ // Note that tests call this method directly in the same process without forking,
927
+ // and in such a case non-current Threads keep running.
908
928
  static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_instance) {
909
929
  stack_recorder_state *state;
910
930
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
@@ -935,15 +955,6 @@ static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_
935
955
  return Qtrue;
936
956
  }
937
957
 
938
- static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class) {
939
- ENFORCE_TYPE(weight, T_FIXNUM);
940
- bool needs_after_allocation = track_object(recorder_instance, new_obj, NUM2UINT(weight), char_slice_from_ruby_string(alloc_class));
941
-
942
- // We could instead choose to automatically trigger the after allocation here; yet, it seems kinda nice to keep it manual for
943
- // the tests so we can pull on each lever separately and observe "the sausage being made" in steps
944
- return needs_after_allocation ? Qtrue : Qfalse;
945
- }
946
-
947
958
  static void reset_profile_slot(profile_slot *slot, ddog_Timespec start_timestamp) {
948
959
  ddog_prof_Profile_Result reset_result = ddog_prof_Profile_reset(&slot->profile);
949
960
  if (reset_result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
@@ -1021,13 +1032,39 @@ static VALUE build_profile_stats(profile_slot *slot, long serialization_time_ns,
1021
1032
  return stats_as_hash;
1022
1033
  }
1023
1034
 
1024
- static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE obj_id) {
1025
- ENFORCE_TYPE(obj_id, T_FIXNUM);
1035
+ static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE record_id) {
1036
+ ENFORCE_TYPE(record_id, T_FIXNUM);
1037
+
1038
+ stack_recorder_state *state;
1039
+ TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
1040
+
1041
+ return heap_recorder_testonly_is_object_recorded(state->heap_recorder, FIX2LONG(record_id));
1042
+ }
1043
+
1044
+ static VALUE _native_record_id_for(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE obj) {
1045
+ stack_recorder_state *state;
1046
+ TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
1047
+
1048
+ return heap_recorder_testonly_record_id_for(state->heap_recorder, obj);
1049
+ }
1026
1050
 
1051
+ static VALUE _native_heap_recorder_exhaust_record_ids(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
1027
1052
  stack_recorder_state *state;
1028
1053
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
1029
1054
 
1030
- return heap_recorder_testonly_is_object_recorded(state->heap_recorder, obj_id);
1055
+ heap_recorder_testonly_exhaust_record_ids(state->heap_recorder);
1056
+ return Qtrue;
1057
+ }
1058
+
1059
+ static VALUE _native_heap_recorder_set_object_alloc_gen(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE record_id, VALUE alloc_gen) {
1060
+ ENFORCE_TYPE(record_id, T_FIXNUM);
1061
+ ENFORCE_TYPE(alloc_gen, T_FIXNUM);
1062
+
1063
+ stack_recorder_state *state;
1064
+ TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
1065
+
1066
+ heap_recorder_testonly_set_object_alloc_gen(state->heap_recorder, FIX2LONG(record_id), NUM2SIZET(alloc_gen));
1067
+ return Qtrue;
1031
1068
  }
1032
1069
 
1033
1070
  static VALUE _native_heap_recorder_reset_last_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
@@ -1039,8 +1076,8 @@ static VALUE _native_heap_recorder_reset_last_update(DDTRACE_UNUSED VALUE _self,
1039
1076
  return Qtrue;
1040
1077
  }
1041
1078
 
1042
- static VALUE _native_recorder_after_gc_step(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
1043
- recorder_after_gc_step(recorder_instance);
1079
+ static VALUE _native_recorder_heap_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
1080
+ recorder_heap_update_may_lose_gvl(recorder_instance);
1044
1081
  return Qtrue;
1045
1082
  }
1046
1083
 
@@ -1150,11 +1187,11 @@ static VALUE _native_test_managed_string_storage_produces_valid_profiles(DDTRACE
1150
1187
  return rb_ary_new_from_args(2, encoded_pprof_1, encoded_pprof_2);
1151
1188
  }
1152
1189
 
1153
- static VALUE _native_finalize_pending_heap_recordings(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
1190
+ static VALUE _native_commit_heap_recordings(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
1154
1191
  stack_recorder_state *state;
1155
1192
  TypedData_Get_Struct(recorder_instance, stack_recorder_state, &stack_recorder_typed_data, state);
1156
1193
 
1157
- heap_recorder_finalize_pending_recordings(state->heap_recorder);
1194
+ heap_recorder_commit_recordings_may_lose_gvl(state->heap_recorder);
1158
1195
 
1159
1196
  return Qtrue;
1160
1197
  }
@@ -3,14 +3,23 @@
3
3
  #include <datadog/profiling.h>
4
4
  #include <ruby.h>
5
5
 
6
+ typedef struct {
7
+ // In: The object being allocated, and its class. (Its weight is the `alloc_samples` in `sample_values` below.)
8
+ VALUE new_object;
9
+ ddog_CharSlice alloc_class;
10
+ // Out: Set by `record_sample` to whether a `recorder_commit_heap_recordings_may_lose_gvl` callback is needed
11
+ bool out_needs_commit;
12
+ } heap_sample_values;
13
+
6
14
  typedef struct {
7
15
  int64_t cpu_time_ns;
8
16
  int64_t wall_time_ns;
9
17
  uint32_t cpu_or_wall_samples;
10
18
  uint32_t alloc_samples;
11
19
  uint32_t alloc_samples_unscaled;
12
- bool heap_sample;
13
20
  int64_t timeline_wall_time_ns;
21
+ // When not NULL, this sample also gets recorded for heap profiling
22
+ heap_sample_values *heap_sample;
14
23
  } sample_values;
15
24
 
16
25
  typedef struct {
@@ -26,7 +35,6 @@ typedef struct {
26
35
 
27
36
  void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, sample_values values, sample_labels labels);
28
37
  void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint);
29
- __attribute__((warn_unused_result)) bool track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice alloc_class);
30
- void recorder_after_sample(VALUE recorder_instance);
31
- void recorder_after_gc_step(VALUE recorder_instance);
38
+ void recorder_commit_heap_recordings_may_lose_gvl(VALUE recorder_instance);
39
+ void recorder_heap_update_may_lose_gvl(VALUE recorder_instance);
32
40
  VALUE enforce_recorder_instance(VALUE object);
@@ -28,10 +28,8 @@ long monotonic_to_system_epoch_ns(monotonic_to_system_epoch_state *state, long m
28
28
  (state->delta_to_epoch_ns + monotonic_wall_time_ns > state->system_epoch_ns_reference + SECONDS_AS_NS(60));
29
29
 
30
30
  if (reference_needs_update) {
31
- state->system_epoch_ns_reference = system_epoch_time_now_ns(RAISE_ON_FAILURE);
32
- long current_monotonic_wall_time_ns = monotonic_wall_time_now_ns(RAISE_ON_FAILURE);
33
-
34
- state->delta_to_epoch_ns = state->system_epoch_ns_reference - current_monotonic_wall_time_ns;
31
+ state->system_epoch_ns_reference = system_epoch_time_now_ns();
32
+ state->delta_to_epoch_ns = state->system_epoch_ns_reference - monotonic_wall_time_now_ns();
35
33
  }
36
34
 
37
35
  return state->delta_to_epoch_ns + monotonic_wall_time_ns;
@@ -1,39 +1,49 @@
1
1
  #pragma once
2
2
 
3
- #include <stdbool.h>
3
+ #include <ruby.h>
4
4
  #include <errno.h>
5
+ #include <stdbool.h>
5
6
  #include <time.h>
6
7
 
7
- #include "extconf.h" // Needed for HAVE_CLOCK_MONOTONIC_COARSE
8
- #include "ruby_helpers.h"
8
+ #include "extconf.h"
9
9
 
10
- #define SECONDS_AS_NS(value) (value * 1000 * 1000 * 1000L)
11
- #define MILLIS_AS_NS(value) (value * 1000 * 1000L)
12
-
13
- typedef enum { RAISE_ON_FAILURE, DO_NOT_RAISE_ON_FAILURE } raise_on_failure_setting;
10
+ #define SECONDS_AS_NS(value) ((value) * 1000L * 1000L * 1000L)
11
+ #define MILLIS_AS_NS(value) ((value) * 1000L * 1000L)
12
+ #define MICROS_AS_NS(value) ((value) * 1000L)
14
13
 
15
14
  #define INVALID_TIME -1
16
15
 
17
16
  typedef struct {
17
+ // INVALID_TIME until the first conversion, and the only field used to decide if the state needs to be (re)computed
18
18
  long system_epoch_ns_reference;
19
19
  long delta_to_epoch_ns;
20
20
  } monotonic_to_system_epoch_state;
21
21
 
22
- #define MONOTONIC_TO_SYSTEM_EPOCH_INITIALIZER {.system_epoch_ns_reference = INVALID_TIME, .delta_to_epoch_ns = INVALID_TIME}
22
+ #define MONOTONIC_TO_SYSTEM_EPOCH_INITIALIZER {.system_epoch_ns_reference = INVALID_TIME}
23
23
 
24
- static inline long retrieve_clock_as_ns(clockid_t clock_id, raise_on_failure_setting raise_on_failure) {
24
+ // clock_id MUST be one of CLOCK_REALTIME/CLOCK_MONOTONIC_FOR_PROFILING/CLOCK_MONOTONIC_COARSE_FOR_PROFILING
25
+ // as for those we're guaranteed to never see failures here unless something is really off
26
+ static inline long retrieve_clock_as_ns(clockid_t clock_id) {
25
27
  struct timespec clock_value;
26
28
 
27
- if (clock_gettime(clock_id, &clock_value) != 0) {
28
- if (raise_on_failure == RAISE_ON_FAILURE) ENFORCE_SUCCESS_GVL(errno);
29
- return 0;
29
+ if (RB_UNLIKELY(clock_gettime(clock_id, &clock_value) != 0)) {
30
+ rb_bug("[ddtrace] clock_gettime(%d) unexpectedly failed (errno=%d) but it should always succeed, libc/kernel bug?", (int) clock_id, errno);
30
31
  }
31
32
 
32
33
  return clock_value.tv_nsec + SECONDS_AS_NS(clock_value.tv_sec);
33
34
  }
34
35
 
35
- static inline long monotonic_wall_time_now_ns(raise_on_failure_setting raise_on_failure) { return retrieve_clock_as_ns(CLOCK_MONOTONIC, raise_on_failure); }
36
- static inline long system_epoch_time_now_ns(raise_on_failure_setting raise_on_failure) { return retrieve_clock_as_ns(CLOCK_REALTIME, raise_on_failure); }
36
+ // CLOCK_MONOTONIC on macOS only has microsecond precision, CLOCK_MONOTONIC_RAW has nanosecond precision
37
+ #ifdef __APPLE__
38
+ #define CLOCK_MONOTONIC_FOR_PROFILING CLOCK_MONOTONIC_RAW
39
+ #define CLOCK_MONOTONIC_COARSE_FOR_PROFILING CLOCK_MONOTONIC_RAW_APPROX
40
+ #else
41
+ #define CLOCK_MONOTONIC_FOR_PROFILING CLOCK_MONOTONIC
42
+ #define CLOCK_MONOTONIC_COARSE_FOR_PROFILING CLOCK_MONOTONIC_COARSE
43
+ #endif
44
+
45
+ static inline long monotonic_wall_time_now_ns(void) { return retrieve_clock_as_ns(CLOCK_MONOTONIC_FOR_PROFILING); }
46
+ static inline long system_epoch_time_now_ns(void) { return retrieve_clock_as_ns(CLOCK_REALTIME); }
37
47
 
38
48
  // Coarse instants use CLOCK_MONOTONIC_COARSE on Linux which is expected to provide resolution in the millisecond range:
39
49
  // https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/7/html/reference_guide/sect-posix_clocks#Using_clock_getres_to_compare_clock_resolution
@@ -46,11 +56,7 @@ typedef struct {
46
56
  static inline coarse_instant to_coarse_instant(long timestamp_ns) { return (coarse_instant) {.timestamp_ns = timestamp_ns}; }
47
57
 
48
58
  static inline coarse_instant monotonic_coarse_wall_time_now_ns(void) {
49
- #ifdef HAVE_CLOCK_MONOTONIC_COARSE // Linux
50
- return to_coarse_instant(retrieve_clock_as_ns(CLOCK_MONOTONIC_COARSE, DO_NOT_RAISE_ON_FAILURE));
51
- #else // macOS
52
- return to_coarse_instant(retrieve_clock_as_ns(CLOCK_MONOTONIC, DO_NOT_RAISE_ON_FAILURE));
53
- #endif
59
+ return to_coarse_instant(retrieve_clock_as_ns(CLOCK_MONOTONIC_COARSE_FOR_PROFILING));
54
60
  }
55
61
 
56
62
  long monotonic_to_system_epoch_ns(monotonic_to_system_epoch_state *state, long monotonic_wall_time_ns);
@@ -4,7 +4,7 @@
4
4
  //
5
5
  // Specifically, when the profiler is sampling, we're never supposed to call into Ruby code (e.g. methods
6
6
  // implemented using Ruby code) or allocate Ruby objects.
7
- // That's because those events introduce thread switch points, and really we don't the VM switching between threads
7
+ // That's because those events introduce thread switch points, and really we don't want the VM switching between threads
8
8
  // in the middle of the profiler sampling. This includes raising exceptions.
9
9
  //
10
10
  // Raising exceptions as the very last operation, to stop the profiler is ok, but comes a caveat: raising exceptions
@@ -18,10 +18,12 @@
18
18
  // in most (all?) thread switch points, Ruby will check for interrupts and run the postponed jobs.
19
19
  //
20
20
  // Thus, if we set a flag while we're sampling (inside_unsafe_context), trigger the postponed job, and then only unset
21
- // the flag after sampling, he correct thing to happen is that the postponed job should never see the flag.
21
+ // the flag after sampling, the correct thing to happen is that the postponed job should never see the flag.
22
22
  //
23
23
  // If, however, we have a bug and there's a thread switch point, our postponed job will see the flag and immediately
24
24
  // stop the Ruby VM before further damage happens (and hopefully giving us a stack trace clearly pointing to the culprit).
25
+ //
26
+ // Note that this check currently does not detect Ruby object allocations, as those do not check for interrupts.
25
27
 
26
28
  void unsafe_api_calls_check_init(void);
27
29
 
@@ -51,12 +51,8 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
51
51
 
52
52
  VALUE version = datadog_gem_version();
53
53
 
54
- // Tags and endpoint are heap-allocated, so after here we can't raise exceptions otherwise we'll leak this memory
54
+ // Tags are heap-allocated, so after here we can't raise exceptions otherwise we'll leak this memory
55
55
  // Start of exception-free zone to prevent leaks {{
56
- ddog_Endpoint *endpoint = ddog_endpoint_from_url(char_slice_from_ruby_string(agent_base_url));
57
- if (endpoint == NULL) {
58
- raise_error(rb_eRuntimeError, "Failed to create endpoint from agent_base_url: %"PRIsVALUE, agent_base_url);
59
- }
60
56
  ddog_Vec_Tag tags = convert_tags(tags_as_array);
61
57
 
62
58
  ddog_crasht_Config config = {
@@ -73,9 +69,11 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
73
69
  // overriding what Ruby set up seems a saner default to keep anyway.
74
70
  .create_alt_stack = false,
75
71
  .use_alt_stack = true,
76
- .endpoint = endpoint,
72
+ .endpoint = {.url = char_slice_from_ruby_string(agent_base_url)},
77
73
  .resolve_frames = DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER,
78
74
  .timeout_ms = FIX2INT(upload_timeout_seconds) * 1000,
75
+ .collect_all_threads = true,
76
+ .max_threads = 128,
79
77
  };
80
78
 
81
79
  ddog_crasht_Metadata metadata = {
@@ -106,11 +104,12 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
106
104
  ) :
107
105
  ddog_crasht_update_on_fork(config, receiver_config, metadata);
108
106
 
109
- first_init = false;
107
+ // We use first_init to know which of [init, reconfigure] needs to be called. BUT if init failed we actually need
108
+ // to call init next time again, not reconfigure.
109
+ if (result.tag == DDOG_VOID_RESULT_OK) first_init = false;
110
110
 
111
111
  // Clean up before potentially raising any exceptions
112
112
  ddog_Vec_Tag_drop(tags);
113
- ddog_endpoint_drop(endpoint);
114
113
  // }} End of exception-free zone to prevent leaks
115
114
 
116
115
  CHECK_VOID_RESULT("Failed to start/update the crash tracker", result);