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
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core/utils/time'
3
+ require_relative "../core/rate_limiter"
4
+ require_relative "../core/utils/time"
5
+ require_relative "../ruby_version"
6
+ require_relative "fatal_exceptions"
7
+ require_relative "capture_expression_evaluator"
4
8
 
5
9
  # rubocop:disable Lint/AssignmentInCondition
6
10
  # rubocop:disable Style/AndOr
@@ -66,12 +70,22 @@ module Datadog
66
70
  #
67
71
  # @api private
68
72
  class Instrumenter
73
+ # Maximum number of capturing-probe snapshots admitted per second across the
74
+ # whole process.
75
+ GLOBAL_SNAPSHOT_RATE_LIMIT = 20
76
+
77
+ # Maximum number of non-capturing probe emissions admitted per second across
78
+ # the whole process.
79
+ GLOBAL_LOG_RATE_LIMIT = 5000
80
+
69
81
  def initialize(settings, serializer, logger, code_tracker: nil, telemetry: nil)
70
82
  @settings = settings
71
83
  @serializer = serializer
72
84
  @logger = logger
73
85
  @telemetry = telemetry
74
86
  @code_tracker = code_tracker
87
+ @global_snapshot_rate_limiter = Datadog::Core::TokenBucket.new(GLOBAL_SNAPSHOT_RATE_LIMIT)
88
+ @global_log_rate_limiter = Datadog::Core::TokenBucket.new(GLOBAL_LOG_RATE_LIMIT)
75
89
 
76
90
  @lock = Mutex.new
77
91
  end
@@ -82,6 +96,37 @@ module Datadog
82
96
  attr_reader :telemetry
83
97
  attr_reader :code_tracker
84
98
 
99
+ # The code tracker is a global singleton created lazily by
100
+ # DI.activate_tracking. When DI is enabled after boot via remote
101
+ # configuration this instrumenter was already built with a nil tracker;
102
+ # Component#start! assigns the now-current tracker here.
103
+ attr_writer :code_tracker
104
+
105
+ # Process-wide snapshot rate limiter.
106
+ # @return [Datadog::Core::TokenBucket]
107
+ attr_reader :global_snapshot_rate_limiter
108
+ # Process-wide log rate limiter.
109
+ # @return [Datadog::Core::TokenBucket]
110
+ attr_reader :global_log_rate_limiter
111
+
112
+ def capture_expression_evaluator
113
+ @capture_expression_evaluator ||= CaptureExpressionEvaluator.new(
114
+ settings: settings, serializer: serializer, logger: logger, telemetry: telemetry,
115
+ )
116
+ end
117
+
118
+ # Returns the process-wide rate limiter for the probe.
119
+ #
120
+ # @param probe [Probe] the probe whose invocation is being rate limited
121
+ # @return [Datadog::Core::TokenBucket] the shared limiter for the probe's category
122
+ def probe_global_rate_limiter(probe)
123
+ if probe.capturing?
124
+ global_snapshot_rate_limiter
125
+ else
126
+ global_log_rate_limiter
127
+ end
128
+ end
129
+
85
130
  # This is a substitute for Thread::Backtrace::Location
86
131
  # which does not have a public constructor.
87
132
  # Used for the fabricated stack frame for the method itself
@@ -89,7 +134,24 @@ module Datadog
89
134
  # from the method but from outside of the method).
90
135
  Location = Struct.new(:path, :lineno, :label)
91
136
 
137
+ # Method probes can only target instance methods. The implementation uses
138
+ # Module#prepend with a module that defines an instance method matching the
139
+ # probe's target — class/singleton methods (def self.foo, module_function)
140
+ # are not reachable via prepend on the class itself. Line probes are
141
+ # unaffected since they install via TracePoint, not method dispatch.
92
142
  def hook_method(probe, responder)
143
+ # Reject method probes targeting any class or module in the Datadog
144
+ # namespace. The tracer uses these classes internally while building
145
+ # and dispatching probe snapshots; allowing a method probe on them
146
+ # would let DI's own code paths re-enter the probe wrapper. Line
147
+ # probes are unaffected (TracePoint is self-disabling during its
148
+ # callback) and are not rejected here.
149
+ type_name = probe.type_name
150
+ if type_name && datadog_namespace_type_name?(type_name)
151
+ raise Error::ProbeTargetForbidden,
152
+ "Method probes on the Datadog namespace are not permitted: #{type_name}##{probe.method_name}"
153
+ end
154
+
93
155
  lock.synchronize do
94
156
  if probe.instrumentation_module
95
157
  # Already instrumented, warn?
@@ -98,10 +160,9 @@ module Datadog
98
160
  end
99
161
 
100
162
  cls = symbolize_class_name(probe.type_name)
101
- serializer = self.serializer
102
- method_name = probe.method_name
103
- loc = begin
104
- cls.instance_method(method_name).source_location
163
+ method_name = probe.method_name!
164
+ target_method = begin
165
+ cls.instance_method(method_name)
105
166
  rescue NameError
106
167
  # The target method is not defined.
107
168
  # This could be because it will be explicitly defined later
@@ -109,169 +170,98 @@ module Datadog
109
170
  # or the method is virtual (provided by a method_missing handler).
110
171
  # In these cases we do not have a source location for the
111
172
  # target method here.
173
+ nil
112
174
  end
113
- rate_limiter = probe.rate_limiter
114
- settings = self.settings
115
- instrumenter = self
116
175
 
117
- mod = Module.new do
118
- define_method(method_name) do |*args, **kwargs, &target_block| # steep:ignore NoMethod
119
- # Steep: Unsure why it cannot detect kwargs in this block. Workaround:
120
- # @type var kwargs: ::Hash[::Symbol, untyped]
121
- di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
176
+ # Reject method probes whose target method resolves to Kernel#lambda,
177
+ # including inherited targets. Every class inherits Kernel#lambda, so a
178
+ # probe naming any type that does not override lambda (Object#lambda,
179
+ # String#lambda, a plain user class, ...) prepends the wrapper ahead of
180
+ # Kernel#lambda and reaches the wrapper's super(&block) path. On
181
+ # Ruby 3.3+ that path raises ArgumentError for every lambda { ... }
182
+ # call site passing a captured block, breaking lambda creation
183
+ # process-wide. Resolving the method owner catches the inherited case
184
+ # that a textual "Kernel" name match misses; a type that defines its
185
+ # own lambda has a different owner and is left alone. Probing lambda
186
+ # creation has no legitimate customer use case. See #5560.
187
+ if method_name == "lambda" && target_method&.owner == ::Kernel
188
+ raise Error::ProbeTargetForbidden,
189
+ "Method probes on Kernel#lambda are not permitted: #{probe.type_name}##{method_name}"
190
+ end
122
191
 
123
- if continue = probe.enabled?
124
- if condition = probe.condition
125
- begin
126
- # This context will be recreated later, unlike for line probes.
127
- #
128
- # We do not need the stack for condition evaluation, therefore
129
- # stack is not passed to Context here.
130
- context = Context.new(
131
- locals: serializer.combine_args(args, kwargs, self),
132
- target_self: self,
133
- probe: probe, settings: settings, serializer: serializer,
134
- )
135
- continue = condition.satisfied?(context)
136
- rescue => exc
137
- # Evaluation error exception can be raised for "expected"
138
- # errors, we probably need another setting to control whether
139
- # these exceptions are propagated.
140
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions &&
141
- !exc.is_a?(DI::Error::ExpressionEvaluationError)
142
-
143
- if context
144
- # We want to report evaluation errors for conditions
145
- # as probe snapshots. However, if we failed to create
146
- # the context, we won't be able to report anything as
147
- # the probe notifier builder requires a context.
148
- begin
149
- responder.probe_condition_evaluation_failed_callback(context, exc)
150
- rescue => nested_exc
151
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
152
-
153
- instrumenter.logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc}" }
154
- instrumenter.telemetry&.report(nested_exc, description: "Error in probe condition evaluation failed callback")
155
- end
156
- else
157
- _ = 42 # stop standard from wrecking this code
158
-
159
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
160
-
161
- instrumenter.logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc}" }
162
- instrumenter.telemetry&.report(exc, description: "Error evaluating condition without context")
163
- # If execution gets here, there is probably a bug in the tracer.
164
- end
165
-
166
- continue = false
167
- end
168
- end
169
- end
192
+ loc = target_method&.source_location
193
+ # @type var instrumenter: Instrumenter
194
+ instrumenter = self
170
195
 
171
- if continue and rate_limiter.nil? || rate_limiter.allow?
172
- # Arguments may be mutated by the method, therefore
173
- # they need to be serialized prior to method invocation.
174
- serialized_entry_args = if probe.capture_snapshot?
175
- serializer.serialize_args(args, kwargs, self,
176
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
177
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
196
+ mod = Module.new do
197
+ # Argument delegation follows docs/Delegation.md: on Ruby 3+
198
+ # positional and keyword arguments are captured and forwarded
199
+ # separately; on Ruby < 3 everything is captured into a single
200
+ # splat that ruby2_keywords flags, which is the only way to forward
201
+ # a trailing hash while preserving its positional-vs-keyword
202
+ # identity. The pre-3 branch is what lets an empty trailing hash
203
+ # (e.g. foo('x', {})) reach the original method intact.
204
+ #
205
+ # Re-entrancy guard: if we are already inside a DI method-probe
206
+ # callback, skip DI processing and call the original method
207
+ # directly. This prevents SystemStackError when a method probe is
208
+ # set on a stdlib method that DI itself calls during method-probe
209
+ # snapshot building (e.g., String#length, Hash#each). Line probes
210
+ # do not enter the guard — they rely on Ruby's TracePoint, which
211
+ # self-disables during its own callback. Nested invocations during
212
+ # DI processing also bypass the rate limiter: they are not
213
+ # user-observable probe firings, just internal calls that happen to
214
+ # land on a probed method. Guard storage is fiber-local;
215
+ # DI.in_probe?/enter_probe/leave_probe are implemented in C and
216
+ # access it directly, bypassing Thread#[]/Thread#[]= method dispatch
217
+ # so user probes on those cannot recurse.
218
+ #
219
+ # The original method is invoked via super. That super call lives
220
+ # in a block passed to #run_method_probe and captures its binding
221
+ # from inside this define_method block — the only place super
222
+ # resolves to the prepended-on class's method. #run_method_probe
223
+ # invokes it with yield, which does not dispatch Proc#call, so a
224
+ # user probe on Proc#call cannot intercept the trampoline, and no
225
+ # Proc is allocated for the block.
226
+ if RubyVersion.is?(">= 3")
227
+ define_method(method_name) do |*args, **kwargs, &target_block|
228
+ # steep:ignore FallbackAny below: Steep cannot narrow the
229
+ # **kwargs parameter inside this define_method block, so it
230
+ # falls back to untyped at the super and run_method_probe sites.
231
+ if DI.in_probe?
232
+ return super(*args, **kwargs, &target_block) # steep:ignore FallbackAny
178
233
  end
179
- # We intentionally do not use Core::Utils::Time.get_time
180
- # here because the time provider may be overridden by the
181
- # customer, and DI is not allowed to invoke customer code.
182
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
183
-
184
- di_duration = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) - di_start_time
185
234
 
186
- rv = nil
187
- begin
188
- # Under Ruby 2.6 we cannot just call super(*args, **kwargs)
189
- # for methods defined via method_missing.
190
- rv = if args.any?
191
- if kwargs.any?
192
- super(*args, **kwargs, &target_block)
193
- else
194
- super(*args, &target_block)
195
- end
196
- elsif kwargs.any?
197
- super(**kwargs, &target_block)
198
- else
199
- super(&target_block)
200
- end
201
- rescue NoMemoryError, Interrupt, SystemExit
202
- raise
203
- rescue Exception => exc # standard:disable Lint/RescueException
204
- # We will raise the exception captured here later, after
205
- # the instrumentation callback runs.
235
+ instrumenter.run_method_probe(
236
+ args, kwargs, target_block, # steep:ignore FallbackAny
237
+ self,
238
+ probe, responder,
239
+ loc, method_name,
240
+ ) do
241
+ super(*args, **kwargs, &target_block) # steep:ignore FallbackAny
206
242
  end
207
-
208
- end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
209
- duration = end_time - start_time
210
-
211
- # Restart DI timer.
212
- # The DI execution duration covers time spent in DI code before
213
- # the customer method is invoked and time spent in DI code
214
- # after the customer method finishes.
215
- di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
216
-
217
- # The method itself is not part of the stack trace because
218
- # we are getting the stack trace from outside of the method.
219
- # Add the method in manually as the top frame.
220
- method_frame = if loc
221
- [Location.new(loc.first, loc.last, method_name)]
222
- else
223
- # For virtual and lazily-defined methods, we do not have
224
- # the original source location here, and they won't be
225
- # included in the stack trace currently.
226
- # TODO when begin/end trace points are added for local
227
- # variable capture in method probes, we should be able
228
- # to obtain actual method execution location and use
229
- # that location here.
230
- []
243
+ end
244
+ else
245
+ define_method(method_name) do |*args, &target_block|
246
+ if DI.in_probe?
247
+ return super(*args, &target_block)
231
248
  end
232
- # Steep: https://github.com/ruby/rbs/pull/2745
233
- caller_locs = method_frame + caller_locations # steep:ignore ArgumentTypeMismatch
234
- # TODO capture arguments at exit
235
-
236
- context = Context.new(locals: nil, target_self: self,
237
- probe: probe, settings: settings, serializer: serializer,
238
- serialized_entry_args: serialized_entry_args,
239
- caller_locations: caller_locs,
240
- return_value: rv, duration: duration, exception: exc,)
241
249
 
242
- responder.probe_executed_callback(context)
243
-
244
- instrumenter.send(:check_and_disable_if_exceeded, probe, responder, di_start_time, di_duration)
245
-
246
- if exc
247
- raise exc
248
- else
249
- rv
250
- end
251
- else
252
- # stop standard from trying to mess up my code
253
- _ = 42
254
-
255
- # The necessity to invoke super in each of these specific
256
- # ways is very difficult to test.
257
- # Existing tests, even though I wrote many, still don't
258
- # cause a failure if I replace all of the below with a
259
- # simple super(*args, **kwargs, &target_block).
260
- # But, let's be safe and go through the motions in case
261
- # there is actually a legitimate need for the breakdown.
262
- # TODO figure out how to test this properly.
263
- if args.any?
264
- if kwargs.any?
265
- super(*args, **kwargs, &target_block)
266
- else
267
- super(*args, &target_block)
268
- end
269
- elsif kwargs.any?
270
- super(**kwargs, &target_block)
271
- else
272
- super(&target_block)
250
+ # The super block replays the original *args (closed over here)
251
+ # so the ruby2_keywords-flagged trailing hash keeps its
252
+ # identity. run_method_probe receives the serialization-split
253
+ # arguments separately; forwarding does not use them.
254
+ pos_args, kwargs = instrumenter.kwargs_from_splat(args)
255
+ instrumenter.run_method_probe(
256
+ pos_args, kwargs, target_block,
257
+ self,
258
+ probe, responder,
259
+ loc, method_name,
260
+ ) do
261
+ super(*args, &target_block)
273
262
  end
274
263
  end
264
+ ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true)
275
265
  end
276
266
  end
277
267
 
@@ -331,7 +321,11 @@ module Datadog
331
321
  # Steep: Complex type narrowing (before calling hook_line,
332
322
  # we check that probe.line? is true which itself checks that probe.file is not nil)
333
323
  # Annotation do not work here as `file` is a method on probe, not a local variable.
334
- ret = code_tracker.iseqs_for_path_suffix(probe.file) # steep:ignore ArgumentTypeMismatch
324
+ ret = if code_tracker.respond_to?(:iseq_for_line)
325
+ code_tracker.iseq_for_line(probe.file, line_no) # steep:ignore ArgumentTypeMismatch
326
+ else
327
+ code_tracker.iseqs_for_path_suffix(probe.file) # steep:ignore ArgumentTypeMismatch
328
+ end
335
329
  unless ret
336
330
  if permit_untargeted_trace_points
337
331
  # Continue withoout targeting the trace point.
@@ -349,16 +343,16 @@ module Datadog
349
343
  # to instrument and install the hook when the file in
350
344
  # question is loaded (and hopefully, by then code tracking
351
345
  # is active, otherwise the line will never be instrumented.)
352
- raise_if_probe_in_loaded_features(probe)
353
- raise Error::DITargetNotDefined, "File not in code tracker registry: #{probe.file}"
346
+ raise_if_probe_in_loaded_features(probe, line_no, code_tracker)
347
+ raise Error::DITargetNotDefined, "File not in code tracker registry: #{probe.file}:#{line_no}"
354
348
  end
355
349
  end
356
350
  elsif !permit_untargeted_trace_points
357
351
  # Same as previous comment, if untargeted trace points are not
358
352
  # explicitly defined, and we do not have code tracking, do not
359
353
  # instrument the method.
360
- raise_if_probe_in_loaded_features(probe)
361
- raise Error::DITargetNotDefined, "File not in code tracker registry: #{probe.file}"
354
+ raise_if_probe_in_loaded_features(probe, line_no, nil)
355
+ raise Error::DITargetNotDefined, "File not in code tracker registry: #{probe.file}:#{line_no}"
362
356
  end
363
357
 
364
358
  if ret
@@ -475,6 +469,288 @@ module Datadog
475
469
 
476
470
  attr_reader :lock
477
471
 
472
+ # Body of the method probe wrapper. Extracted from the define_method
473
+ # block in #hook_method so the begin/ensure structure can use normal
474
+ # indentation. The original method is invoked with yield, calling the
475
+ # block passed by #hook_method; that block captures super's binding
476
+ # from inside the define_method block, the only place super resolves
477
+ # to the prepended-on class's method.
478
+ #
479
+ # Performance: this method takes eight positional parameters, not
480
+ # keyword parameters, deliberately. Every probed method invocation
481
+ # passes through here on the firing/disabled/rate-limited paths.
482
+ # Keyword-argument calls in Ruby allocate a fresh Hash on every call
483
+ # to materialize the keyword bindings; with eight keyword arguments
484
+ # (~300-1000 ns of allocation per invocation), that hash dominated
485
+ # the wrapper's per-call overhead. Positional parameters skip the
486
+ # allocation entirely. The cost is a long unlabeled signature and
487
+ # an unlabeled call site in #hook_method — both small price for
488
+ # eliminating per-call allocation on the hot path. The argument
489
+ # order matches #hook_method's call site exactly; do not reorder
490
+ # without updating both sides.
491
+ #
492
+ # @param args [Array] positional arguments passed to the probed method
493
+ # @param kwargs [Hash{Symbol => Object}] keyword arguments passed to the probed method
494
+ # @param target_block [Proc, nil] block argument passed to the probed method
495
+ # @param target_self [any] the receiver of the probed method invocation
496
+ # @param probe [Datadog::DI::Probe] the probe whose callback this invocation runs
497
+ # @param responder [#probe_executed_callback, #probe_condition_evaluation_failed_callback] callback target invoked with the built Context
498
+ # @param loc [Array(String, Integer), nil] source location of the probed method, or nil for virtual/lazily-defined methods
499
+ # @param method_name [String] name of the probed method, used as the synthetic top stack frame label
500
+ # @yield invokes the original method via super and returns its value
501
+ # @return [Object] the original method's return value, or re-raises its exception
502
+ def run_method_probe(args, kwargs, target_block, target_self,
503
+ probe, responder, loc, method_name)
504
+ # Disabled probe: skip DI processing entirely. enter_probe is not
505
+ # called on this path so the guard is never set — there is no DI
506
+ # work to guard, and any nested probed methods invoked by the
507
+ # original method should fire normally without short-circuit.
508
+ return yield unless probe.enabled?
509
+
510
+ DI.enter_probe
511
+ begin
512
+ di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
513
+
514
+ continue = true
515
+ if condition = probe.condition
516
+ begin
517
+ # This context will be recreated later, unlike for line probes.
518
+ #
519
+ # We do not need the stack for condition evaluation, therefore
520
+ # stack is not passed to Context here.
521
+ context = Context.new(
522
+ locals: serializer.combine_args(args, kwargs, target_self),
523
+ target_self: target_self,
524
+ probe: probe, settings: settings, serializer: serializer,
525
+ )
526
+ continue = condition.satisfied?(context)
527
+ rescue Exception => exc # standard:disable Lint/RescueException
528
+ Datadog::DI.reraise_if_fatal(exc)
529
+ # Evaluation error exception can be raised for "expected"
530
+ # errors, we probably need another setting to control whether
531
+ # these exceptions are propagated.
532
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions &&
533
+ !exc.is_a?(DI::Error::ExpressionEvaluationError)
534
+
535
+ if context
536
+ # We want to report evaluation errors for conditions
537
+ # as probe snapshots. However, if we failed to create
538
+ # the context, we won't be able to report anything as
539
+ # the probe notifier builder requires a context.
540
+ begin
541
+ responder.probe_condition_evaluation_failed_callback(context, condition, exc)
542
+ rescue Exception => nested_exc # standard:disable Lint/RescueException
543
+ Datadog::DI.reraise_if_fatal(nested_exc)
544
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
545
+
546
+ logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc.message}" }
547
+ telemetry&.report(nested_exc, description: "Error in probe condition evaluation failed callback")
548
+ end
549
+ else
550
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
551
+
552
+ logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc.message}" }
553
+ telemetry&.report(exc, description: "Error evaluating condition without context")
554
+ # If execution gets here, there is probably a bug in the tracer.
555
+ end
556
+
557
+ continue = false
558
+ end
559
+ end
560
+
561
+ rate_limiter = probe.rate_limiter
562
+ admitted = continue && (rate_limiter.nil? || rate_limiter.allow?)
563
+ if admitted && !probe_global_rate_limiter(probe).allow?
564
+ admitted = false
565
+ logger.trace { "di: #{probe.type} probe #{probe.id}: skipping due to global rate limit" }
566
+ end
567
+ if admitted
568
+ # Arguments may be mutated by the method, therefore
569
+ # they need to be serialized prior to method invocation.
570
+ serialized_entry_args = if probe.capture_snapshot?
571
+ serializer.serialize_args(args, kwargs, target_self,
572
+ **probe.snapshot_serializer_limits(settings))
573
+ end
574
+
575
+ entry_capture_expressions = nil
576
+ entry_capture_evaluation_errors = nil
577
+ if probe.capture_entry_expressions?
578
+ begin
579
+ entry_context = Context.new(
580
+ probe: probe, settings: settings, serializer: serializer,
581
+ target_self: target_self,
582
+ locals: serializer.combine_args(args, kwargs, target_self),
583
+ )
584
+ entry_capture_expressions, entry_capture_evaluation_errors =
585
+ capture_expression_evaluator.evaluate(probe, entry_context)
586
+ rescue Exception => exc # standard:disable Lint/RescueException
587
+ Datadog::DI.reraise_if_fatal(exc)
588
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
589
+
590
+ logger.debug { "di: error evaluating entry-time capture expressions: #{exc.class}: #{exc.message}" }
591
+ telemetry&.report(exc, description: "Error evaluating entry-time capture expressions")
592
+ end
593
+ end
594
+ # We intentionally do not use Core::Utils::Time.get_time
595
+ # here because the time provider may be overridden by the
596
+ # customer, and DI is not allowed to invoke customer code.
597
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
598
+
599
+ di_duration = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) - di_start_time
600
+
601
+ # Release re-entrancy guard for the original method so that
602
+ # probes on other methods (or recursive calls) fire normally
603
+ # during user code execution.
604
+ DI.leave_probe
605
+
606
+ rv = nil
607
+ begin
608
+ # yield invokes the super block without dispatching Proc#call,
609
+ # so a user probe on Proc#call cannot intercept the trampoline.
610
+ # The guard was just released above so nested probes on the
611
+ # customer method body fire normally — but Proc#call must
612
+ # remain bypassed regardless, because the disabled-probe early
613
+ # return at the top of this method also invokes the block.
614
+ rv = yield
615
+ rescue Exception => exc # standard:disable Lint/RescueException
616
+ Datadog::DI.reraise_if_fatal(exc)
617
+ # We will raise the (non-fatal) exception captured here later,
618
+ # after the instrumentation callback runs.
619
+ end
620
+
621
+ # Re-acquire re-entrancy guard for DI post-processing
622
+ # (building context, notification callback).
623
+ DI.enter_probe
624
+
625
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
626
+ duration = end_time - start_time
627
+
628
+ # Restart DI timer.
629
+ # The DI execution duration covers time spent in DI code before
630
+ # the customer method is invoked and time spent in DI code
631
+ # after the customer method finishes.
632
+ di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
633
+
634
+ # The method itself is not part of the stack trace because
635
+ # we are getting the stack trace from outside of the method.
636
+ # Add the method in manually as the top frame.
637
+ method_frame = if loc
638
+ [Location.new(loc.first, loc.last, method_name)]
639
+ else
640
+ # For virtual and lazily-defined methods, we do not have
641
+ # the original source location here, and they won't be
642
+ # included in the stack trace currently.
643
+ # TODO when begin/end trace points are added for local
644
+ # variable capture in method probes, we should be able
645
+ # to obtain actual method execution location and use
646
+ # that location here.
647
+ []
648
+ end
649
+ # depth 2 skips run_method_probe and the wrapper define_method
650
+ # block, leaving the user's call site as the first returned frame.
651
+ # caller_locations is RBS-nilable but never nil at this depth.
652
+ caller_locs = method_frame + (caller_locations(2) || [])
653
+ # TODO capture arguments at exit
654
+
655
+ capture_expression_locals = if probe.capture_expressions_only?
656
+ serializer.combine_args(args, kwargs, target_self)
657
+ end
658
+ context = Context.new(locals: capture_expression_locals, target_self: target_self,
659
+ probe: probe, settings: settings, serializer: serializer,
660
+ serialized_entry_args: serialized_entry_args,
661
+ entry_capture_expressions: entry_capture_expressions,
662
+ entry_capture_evaluation_errors: entry_capture_evaluation_errors,
663
+ caller_locations: caller_locs,
664
+ return_value: rv, duration: duration, exception: exc,)
665
+
666
+ begin
667
+ responder.probe_executed_callback(context)
668
+
669
+ check_and_disable_if_exceeded(probe, responder, di_start_time, di_duration)
670
+ rescue Exception => di_exc # standard:disable Lint/RescueException
671
+ Datadog::DI.reraise_if_fatal(di_exc)
672
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
673
+
674
+ logger.debug { "di: unhandled exception in method probe: #{di_exc.class}: #{di_exc.message}" }
675
+ telemetry&.report(di_exc, description: "Unhandled exception in method probe")
676
+ end
677
+
678
+ if exc
679
+ raise exc
680
+ else
681
+ rv
682
+ end
683
+ else
684
+ # Condition not satisfied or rate-limited: skip DI processing
685
+ # and call super. (The disabled-probe case is handled by the
686
+ # early return at the top of this method, so it never reaches
687
+ # this branch.)
688
+ #
689
+ # The guard must be released here (not relied on the ensure)
690
+ # because the super block invokes the customer's method, which
691
+ # may call other probed methods. Those nested probes should fire
692
+ # normally — they would not if the guard were still set,
693
+ # because the wrapper's early-return short-circuits when
694
+ # DI.in_probe? is true.
695
+ #
696
+ # No post-processing in this branch, so we don't re-acquire
697
+ # the guard after super. The ensure's leave_probe below is
698
+ # a no-op here (guard already cleared) and serves the
699
+ # firing branch above, where post-processing re-enters.
700
+ DI.leave_probe
701
+ # yield bypasses Proc#call dispatch — see the firing branch
702
+ # above for the same rationale.
703
+ yield
704
+ end
705
+ ensure
706
+ DI.leave_probe
707
+ end
708
+ end
709
+ # `run_method_probe` is documentation-private (`# @api private`) but must
710
+ # be lexically public so that the prepended wrapper can call it without
711
+ # `.send`. The wrapper hot path is reached when a probed customer method
712
+ # is invoked, and a customer probe on `Object#send` / `Kernel#send`
713
+ # would intercept any `.send` call before the wrapper had a chance to
714
+ # set the re-entrancy guard, causing infinite recursion. Calling the
715
+ # method directly avoids `Object#send` dispatch entirely.
716
+ public :run_method_probe
717
+
718
+ # Splits a Ruby < 3 splat-captured argument list into positional
719
+ # arguments and the trailing keyword-argument hash, for argument
720
+ # serialization only. Returns `[positional_args, kwargs]`. Forwarding
721
+ # does not use this — the wrapper's do_super replays the original
722
+ # splat so the trailing hash keeps its keyword identity.
723
+ #
724
+ # A trailing hash is treated as keyword arguments regardless of how it
725
+ # was passed at the call site, matching the previous `**kwargs`
726
+ # capture (which, on Ruby 2.x, absorbed a trailing hash into kwargs).
727
+ # The ruby2_keywords flag is intentionally not consulted here: callers
728
+ # that pass a hash positionally (e.g. `m(opts)`) still expect it shown
729
+ # as a keyword argument, consistent with Ruby 2.x serialization.
730
+ #
731
+ # The trailing-element test goes through DI.hash? (a C type check)
732
+ # rather than `last.is_a?(Hash)`: kwargs_from_splat runs before the
733
+ # re-entrancy guard is set, so a customer method probe on Kernel#is_a?
734
+ # would otherwise re-enter the wrapper and recurse. DI.hash? is a
735
+ # singleton method and cannot be targeted by a method probe.
736
+ #
737
+ # Defined only on Ruby < 3; the Ruby 3+ wrapper captures keyword
738
+ # arguments directly and never calls this.
739
+ if RubyVersion.is?("< 3")
740
+ def kwargs_from_splat(args)
741
+ last = args.last
742
+ if DI.hash?(last)
743
+ [args[0...-1] || [], last]
744
+ else
745
+ [args, {}]
746
+ end
747
+ end
748
+ # Lexically public for the same reason as #run_method_probe: the
749
+ # prepended wrapper must call it without `.send`, which a customer
750
+ # probe on Object#send could intercept.
751
+ public :kwargs_from_splat
752
+ end
753
+
478
754
  def line_trace_point_callback(probe, iseq, responder, tp)
479
755
  di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
480
756
 
@@ -513,7 +789,8 @@ module Datadog
513
789
  begin
514
790
  context = build_trace_point_context(probe, tp)
515
791
  return unless condition.satisfied?(context)
516
- rescue => exc
792
+ rescue Exception => exc # standard:disable Lint/RescueException
793
+ Datadog::DI.reraise_if_fatal(exc)
517
794
  # Evaluation error exception can be raised for "expected"
518
795
  # errors, we probably need another setting to control whether
519
796
  # these exceptions are propagated.
@@ -527,10 +804,11 @@ module Datadog
527
804
  # the probe notifier builder requires a context.
528
805
  begin
529
806
  responder.probe_condition_evaluation_failed_callback(context, condition, exc)
530
- rescue => nested_exc
807
+ rescue Exception => nested_exc # standard:disable Lint/RescueException
808
+ Datadog::DI.reraise_if_fatal(nested_exc)
531
809
  raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
532
810
 
533
- logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc}" }
811
+ logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc.message}" }
534
812
  telemetry&.report(nested_exc, description: "Error in probe condition evaluation failed callback")
535
813
  end
536
814
 
@@ -540,7 +818,7 @@ module Datadog
540
818
 
541
819
  raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
542
820
 
543
- logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc}" }
821
+ logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc.message}" }
544
822
  telemetry&.report(exc, description: "Error evaluating condition without context")
545
823
  # If execution gets here, there is probably a bug in the tracer.
546
824
  end
@@ -551,6 +829,11 @@ module Datadog
551
829
  # and check that it is in fact set.
552
830
  return if probe.rate_limiter && !probe.rate_limiter.allow?
553
831
 
832
+ unless probe_global_rate_limiter(probe).allow?
833
+ logger.trace { "di: #{probe.type} probe #{probe.id}: skipping due to global rate limit" }
834
+ return
835
+ end
836
+
554
837
  # The context creation is relatively expensive and we don't
555
838
  # want to run it if the callback won't be executed due to the
556
839
  # rate limit.
@@ -560,9 +843,10 @@ module Datadog
560
843
  responder.probe_executed_callback(context)
561
844
 
562
845
  check_and_disable_if_exceeded(probe, responder, di_start_time)
563
- rescue => exc
846
+ rescue Exception => exc # standard:disable Lint/RescueException
847
+ Datadog::DI.reraise_if_fatal(exc)
564
848
  raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
565
- logger.debug { "di: unhandled exception in line trace point: #{exc.class}: #{exc}" }
849
+ logger.debug { "di: unhandled exception in line trace point: #{exc.class}: #{exc.message}" }
566
850
  telemetry&.report(exc, description: "Unhandled exception in line trace point")
567
851
  # TODO test this path
568
852
  end
@@ -600,31 +884,91 @@ module Datadog
600
884
  end
601
885
  end
602
886
 
603
- def raise_if_probe_in_loaded_features(probe)
887
+ def raise_if_probe_in_loaded_features(probe, line_no, code_tracker)
604
888
  return unless probe.file
605
889
 
606
- # If the probe file is in the list of loaded files
607
- # (as per $LOADED_FEATURES, using either exact or suffix match),
608
- # raise an error indicating that
609
- # code tracker is missing the loaded file because the file
610
- # won't be loaded again (DI only works in production environments
611
- # that do not normally reload code).
612
- if $LOADED_FEATURES.include?(probe.file)
613
- raise Error::DITargetNotInRegistry, "File loaded but is not in code tracker registry: #{probe.file}"
614
- end
615
- # Ths is an expensive check
616
- $LOADED_FEATURES.each do |path|
617
- if Utils.path_matches_suffix?(path, probe.file)
618
- raise Error::DITargetNotInRegistry, "File matching probe path (#{probe.file}) was loaded and is not in code tracker registry: #{path}"
890
+ # Find the loaded path matching the probe file. Case-sensitive
891
+ # matching is attempted first, with case-insensitive matching as a
892
+ # fallback (see the design comment in utils.rb, steps 5-8). Leading
893
+ # directory components are stripped so probes whose sourceFile carries
894
+ # a source-repo prefix that does not exist on disk still resolve to
895
+ # the loaded file — matching the behavior of
896
+ # CodeTracker#iseqs_for_path_suffix.
897
+ loaded_path = if $LOADED_FEATURES.include?(probe.file)
898
+ probe.file
899
+ else
900
+ # Expensive suffix check.
901
+ suffix = Utils.normalize_windows_separators(probe.file)
902
+ found = nil #: ::String?
903
+ [false, true].each do |case_insensitive|
904
+ working_suffix = suffix.dup
905
+ loop do
906
+ found = $LOADED_FEATURES.find do |path|
907
+ Utils.path_matches_suffix?(path, working_suffix, case_insensitive: case_insensitive)
908
+ end
909
+ break if found
910
+ break unless working_suffix.include?("/")
911
+ working_suffix.sub!(%r{.*/+}, "")
912
+ end
913
+ break if found
619
914
  end
915
+ found
916
+ end
917
+
918
+ return unless loaded_path
919
+
920
+ # Distinguish between "no iseqs at all" and "has per-method iseqs
921
+ # but none cover this line".
922
+ has_per_method = code_tracker&.send(:instance_variable_defined?, :@per_method_registry) &&
923
+ code_tracker.send(:per_method_registry).key?(loaded_path)
924
+
925
+ if code_tracker.nil?
926
+ raise Error::DITargetNotInRegistry,
927
+ "File #{loaded_path} is loaded but code tracking is not active; " \
928
+ "line probes cannot be targeted."
929
+ elsif has_per_method
930
+ raise Error::DITargetNotInRegistry,
931
+ "File #{loaded_path} is loaded and has per-method iseqs, " \
932
+ "but none cover line #{line_no}. " \
933
+ "The line may be in file-level setup code outside any method."
934
+ else
935
+ raise Error::DITargetNotInRegistry,
936
+ "File #{loaded_path} is loaded but has no surviving iseqs " \
937
+ "(whole-file iseq was garbage collected and no per-method iseqs remain). " \
938
+ "Line probes cannot target this file."
620
939
  end
621
940
  end
622
941
 
623
942
  # TODO test that this resolves qualified names e.g. A::B
624
943
  def symbolize_class_name(cls_name)
625
- Object.const_get(cls_name)
944
+ Object.const_get(cls_name) # steep:ignore ArgumentTypeMismatch
626
945
  rescue NameError => exc
627
- raise Error::DITargetNotDefined, "Class not defined: #{cls_name}: #{exc.class}: #{exc}"
946
+ raise Error::DITargetNotDefined, "Class not defined: #{cls_name}: #{exc.class}: #{exc.message}"
947
+ end
948
+
949
+ # Matches a class name in the Datadog namespace, tolerating the alias
950
+ # forms that Object.const_get resolves to the same top-level constants.
951
+ # Two such forms exist: an optional leading "::" (Ruby's root-namespace
952
+ # prefix), and any number of leading "Object::" segments. Top-level
953
+ # constants are constants of Object, so "Object::Datadog::DI::Instrumenter"
954
+ # resolves to Datadog::DI::Instrumenter; without stripping "Object::" a
955
+ # probe could name a tracer-internal class through an Object:: alias and
956
+ # bypass the rejection, then get prepended onto tracer internals. These
957
+ # are the only alias paths to the top-level Datadog: "Foo::Datadog" does
958
+ # not resolve through const_get for an arbitrary Foo. Anchored at \A so
959
+ # the match decides in O(prefix length) without scanning.
960
+ DATADOG_NAMESPACE_TYPE_NAME = /\A(?:::)?(?:Object::)*Datadog(?:::|\z)/
961
+ private_constant :DATADOG_NAMESPACE_TYPE_NAME
962
+
963
+ # Returns true when +cls_name+ names the +Datadog+ module itself or
964
+ # any class/module under it (e.g. +Datadog::Tracing::SpanOperation+).
965
+ # The check is purely textual on the probe's declared type name; it
966
+ # does not require the class to be loaded. A leading +::+ and any
967
+ # number of leading +Object::+ segments are treated the same as the
968
+ # bare form, since Object.const_get resolves those aliases to the same
969
+ # top-level constants.
970
+ def datadog_namespace_type_name?(cls_name)
971
+ DATADOG_NAMESPACE_TYPE_NAME.match?(cls_name)
628
972
  end
629
973
  end
630
974
  end