datadog 2.36.0 → 2.40.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 (854) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +119 -1
  3. data/bin/ddprofrb +4 -4
  4. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +5 -12
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +105 -18
  6. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +17 -3
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +228 -162
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +357 -217
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -0
  11. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  13. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  14. data/ext/datadog_profiling_native_extension/extconf.rb +24 -11
  15. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +261 -62
  16. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -9
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.c +7 -0
  18. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +2 -0
  19. data/ext/datadog_profiling_native_extension/time_helpers.h +12 -7
  20. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  21. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  22. data/ext/libdatadog_api/di.c +76 -0
  23. data/ext/libdatadog_api/extconf.rb +29 -23
  24. data/ext/libdatadog_api/feature_flags.c +26 -0
  25. data/ext/libdatadog_api/init.c +4 -0
  26. data/ext/libdatadog_api/trace_exporter.c +974 -0
  27. data/ext/libdatadog_api/trace_exporter.h +5 -0
  28. data/ext/libdatadog_extconf_helpers.rb +9 -9
  29. data/lib/datadog/ai_guard/api_client.rb +8 -6
  30. data/lib/datadog/ai_guard/component.rb +10 -10
  31. data/lib/datadog/ai_guard/evaluation.rb +1 -0
  32. data/lib/datadog/ai_guard/ext.rb +2 -0
  33. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +16 -16
  34. data/lib/datadog/appsec/actions_handler.rb +6 -6
  35. data/lib/datadog/appsec/anonymizer.rb +1 -1
  36. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  37. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  38. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  39. data/lib/datadog/appsec/api_security/route_extractor.rb +18 -15
  40. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  41. data/lib/datadog/appsec/api_security.rb +1 -1
  42. data/lib/datadog/appsec/assets.rb +7 -7
  43. data/lib/datadog/appsec/autoload.rb +3 -3
  44. data/lib/datadog/appsec/component.rb +15 -15
  45. data/lib/datadog/appsec/compressed_json.rb +6 -6
  46. data/lib/datadog/appsec/configuration.rb +73 -58
  47. data/lib/datadog/appsec/context.rb +9 -7
  48. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  49. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  50. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  51. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  52. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  54. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  55. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  56. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  57. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  58. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  59. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  60. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  61. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  62. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  63. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  64. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +76 -21
  65. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  66. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +72 -18
  68. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  69. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +3 -3
  70. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  71. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  72. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  73. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  74. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  75. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +18 -17
  76. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  77. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +25 -21
  78. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +9 -22
  79. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  80. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  81. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  82. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +45 -24
  83. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +14 -8
  85. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +10 -10
  86. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  87. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  88. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  89. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  90. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  91. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  92. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  93. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  94. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +74 -21
  95. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  97. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +16 -12
  98. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  99. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  100. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  101. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  102. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  103. data/lib/datadog/appsec/event.rb +14 -14
  104. data/lib/datadog/appsec/ext.rb +11 -10
  105. data/lib/datadog/appsec/extensions.rb +2 -2
  106. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  107. data/lib/datadog/appsec/metrics/collector.rb +18 -1
  108. data/lib/datadog/appsec/metrics/exporter.rb +17 -11
  109. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  110. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  111. data/lib/datadog/appsec/metrics.rb +4 -4
  112. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  113. data/lib/datadog/appsec/monitor.rb +1 -1
  114. data/lib/datadog/appsec/processor/rule_loader.rb +26 -26
  115. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  116. data/lib/datadog/appsec/remote.rb +15 -9
  117. data/lib/datadog/appsec/response.rb +21 -21
  118. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
  119. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
  120. data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
  121. data/lib/datadog/appsec/route_normalizer.rb +80 -0
  122. data/lib/datadog/appsec/security_engine/engine.rb +37 -37
  123. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  124. data/lib/datadog/appsec/security_event.rb +2 -2
  125. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  126. data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
  127. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  128. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  129. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  130. data/lib/datadog/appsec.rb +16 -16
  131. data/lib/datadog/auto_instrument.rb +2 -2
  132. data/lib/datadog/core/buffer/cruby.rb +1 -1
  133. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  134. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  135. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  136. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  137. data/lib/datadog/core/configuration/base.rb +2 -2
  138. data/lib/datadog/core/configuration/components.rb +115 -31
  139. data/lib/datadog/core/configuration/components_state.rb +6 -1
  140. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  141. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  142. data/lib/datadog/core/configuration/ext.rb +11 -11
  143. data/lib/datadog/core/configuration/option.rb +16 -16
  144. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  145. data/lib/datadog/core/configuration/options.rb +1 -1
  146. data/lib/datadog/core/configuration/settings.rb +93 -104
  147. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  148. data/lib/datadog/core/configuration/supported_configurations.rb +8 -1
  149. data/lib/datadog/core/configuration.rb +8 -8
  150. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  151. data/lib/datadog/core/crashtracking/component.rb +9 -9
  152. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  153. data/lib/datadog/core/deprecations.rb +1 -1
  154. data/lib/datadog/core/diagnostics/environment_logger.rb +6 -6
  155. data/lib/datadog/core/diagnostics/health.rb +2 -2
  156. data/lib/datadog/core/encoding.rb +4 -4
  157. data/lib/datadog/core/environment/agent_info.rb +2 -2
  158. data/lib/datadog/core/environment/cgroup.rb +4 -4
  159. data/lib/datadog/core/environment/container.rb +9 -9
  160. data/lib/datadog/core/environment/execution.rb +3 -3
  161. data/lib/datadog/core/environment/ext.rb +18 -18
  162. data/lib/datadog/core/environment/gc.rb +1 -1
  163. data/lib/datadog/core/environment/git.rb +2 -2
  164. data/lib/datadog/core/environment/identity.rb +10 -10
  165. data/lib/datadog/core/environment/platform.rb +8 -8
  166. data/lib/datadog/core/environment/process.rb +3 -3
  167. data/lib/datadog/core/environment/socket.rb +2 -2
  168. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  169. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  170. data/lib/datadog/core/environment/yjit.rb +2 -2
  171. data/lib/datadog/core/error.rb +5 -5
  172. data/lib/datadog/core/evp.rb +11 -0
  173. data/lib/datadog/core/extensions.rb +1 -1
  174. data/lib/datadog/core/feature_flags.rb +2 -2
  175. data/lib/datadog/core/git/ext.rb +4 -4
  176. data/lib/datadog/core/knuth_sampler.rb +3 -1
  177. data/lib/datadog/core/logger.rb +3 -3
  178. data/lib/datadog/core/logging/ext.rb +1 -1
  179. data/lib/datadog/core/metrics/client.rb +21 -21
  180. data/lib/datadog/core/metrics/ext.rb +5 -5
  181. data/lib/datadog/core/metrics/logging.rb +2 -2
  182. data/lib/datadog/core/metrics/options.rb +3 -3
  183. data/lib/datadog/core/pin.rb +1 -1
  184. data/lib/datadog/core/process_discovery.rb +8 -8
  185. data/lib/datadog/core/rate_limiter.rb +1 -1
  186. data/lib/datadog/core/remote/client/capabilities.rb +62 -19
  187. data/lib/datadog/core/remote/client.rb +16 -16
  188. data/lib/datadog/core/remote/component.rb +20 -12
  189. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  190. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  191. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  192. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  193. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  194. data/lib/datadog/core/remote/configuration.rb +4 -4
  195. data/lib/datadog/core/remote/ext.rb +3 -3
  196. data/lib/datadog/core/remote/negotiation.rb +1 -1
  197. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  198. data/lib/datadog/core/remote/transport/config.rb +4 -4
  199. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  200. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  201. data/lib/datadog/core/remote/transport/http.rb +10 -10
  202. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  203. data/lib/datadog/core/remote/worker.rb +5 -5
  204. data/lib/datadog/core/runtime/ext.rb +22 -22
  205. data/lib/datadog/core/runtime/metrics.rb +9 -9
  206. data/lib/datadog/core/tag_builder.rb +18 -18
  207. data/lib/datadog/core/tag_normalizer.rb +7 -7
  208. data/lib/datadog/core/telemetry/component.rb +13 -13
  209. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  210. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +5 -5
  211. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  212. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  213. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +2 -2
  214. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  215. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  216. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  217. data/lib/datadog/core/telemetry/event/app_started.rb +41 -34
  218. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  219. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  220. data/lib/datadog/core/telemetry/event/generate_metrics.rb +2 -2
  221. data/lib/datadog/core/telemetry/event/log.rb +4 -4
  222. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  223. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  224. data/lib/datadog/core/telemetry/event.rb +16 -16
  225. data/lib/datadog/core/telemetry/ext.rb +11 -11
  226. data/lib/datadog/core/telemetry/logger.rb +1 -1
  227. data/lib/datadog/core/telemetry/logging.rb +5 -5
  228. data/lib/datadog/core/telemetry/metric.rb +7 -7
  229. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  230. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  231. data/lib/datadog/core/telemetry/request.rb +4 -4
  232. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  233. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  234. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  235. data/lib/datadog/core/telemetry/worker.rb +6 -6
  236. data/lib/datadog/core/transport/ext.rb +14 -14
  237. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  238. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  239. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  240. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  241. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  242. data/lib/datadog/core/transport/http/builder.rb +6 -6
  243. data/lib/datadog/core/transport/http/client.rb +2 -2
  244. data/lib/datadog/core/transport/http/response.rb +1 -1
  245. data/lib/datadog/core/transport/http.rb +8 -8
  246. data/lib/datadog/core/transport/transport.rb +1 -1
  247. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +83 -15
  248. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  249. data/lib/datadog/core/utils/duration.rb +1 -1
  250. data/lib/datadog/core/utils/forking.rb +2 -2
  251. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  252. data/lib/datadog/core/utils/network.rb +11 -11
  253. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  254. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  255. data/lib/datadog/core/utils/sequence.rb +3 -6
  256. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  257. data/lib/datadog/core/utils/time.rb +18 -52
  258. data/lib/datadog/core/utils/url.rb +1 -1
  259. data/lib/datadog/core/utils.rb +4 -4
  260. data/lib/datadog/core/workers/async.rb +1 -1
  261. data/lib/datadog/core/workers/polling.rb +2 -2
  262. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  263. data/lib/datadog/core.rb +4 -4
  264. data/lib/datadog/data_streams/configuration.rb +3 -3
  265. data/lib/datadog/data_streams/ext.rb +1 -1
  266. data/lib/datadog/data_streams/extensions.rb +2 -2
  267. data/lib/datadog/data_streams/pathway_context.rb +5 -5
  268. data/lib/datadog/data_streams/processor.rb +52 -52
  269. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  270. data/lib/datadog/data_streams/transport/http.rb +5 -5
  271. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  272. data/lib/datadog/data_streams.rb +5 -5
  273. data/lib/datadog/di/base.rb +6 -4
  274. data/lib/datadog/di/boot.rb +25 -22
  275. data/lib/datadog/di/capture_expression.rb +21 -0
  276. data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
  277. data/lib/datadog/di/capture_limits.rb +41 -0
  278. data/lib/datadog/di/code_tracker.rb +10 -7
  279. data/lib/datadog/di/component.rb +122 -40
  280. data/lib/datadog/di/configuration.rb +7 -1
  281. data/lib/datadog/di/context.rb +9 -3
  282. data/lib/datadog/di/contrib/railtie.rb +1 -1
  283. data/lib/datadog/di/contrib.rb +5 -5
  284. data/lib/datadog/di/el/compiler.rb +91 -38
  285. data/lib/datadog/di/el/evaluator.rb +82 -2
  286. data/lib/datadog/di/el/expression.rb +10 -2
  287. data/lib/datadog/di/el.rb +3 -3
  288. data/lib/datadog/di/error.rb +10 -0
  289. data/lib/datadog/di/fatal_exceptions.rb +26 -0
  290. data/lib/datadog/di/instrumenter.rb +426 -169
  291. data/lib/datadog/di/logger.rb +1 -1
  292. data/lib/datadog/di/preload.rb +1 -1
  293. data/lib/datadog/di/probe.rb +61 -2
  294. data/lib/datadog/di/probe_builder.rb +96 -14
  295. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  296. data/lib/datadog/di/probe_file_loader.rb +12 -7
  297. data/lib/datadog/di/probe_manager.rb +67 -9
  298. data/lib/datadog/di/probe_notification_builder.rb +66 -22
  299. data/lib/datadog/di/probe_notifier_worker.rb +57 -37
  300. data/lib/datadog/di/probe_repository.rb +1 -1
  301. data/lib/datadog/di/redactor.rb +16 -1
  302. data/lib/datadog/di/remote.rb +178 -17
  303. data/lib/datadog/di/serializer.rb +47 -28
  304. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  305. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  306. data/lib/datadog/di/transport/http/input.rb +2 -2
  307. data/lib/datadog/di/transport/http.rb +10 -10
  308. data/lib/datadog/di/transport/input.rb +16 -12
  309. data/lib/datadog/di/utils.rb +4 -4
  310. data/lib/datadog/di.rb +66 -3
  311. data/lib/datadog/error_tracking/collector.rb +2 -2
  312. data/lib/datadog/error_tracking/component.rb +12 -12
  313. data/lib/datadog/error_tracking/configuration.rb +2 -2
  314. data/lib/datadog/error_tracking/ext.rb +7 -7
  315. data/lib/datadog/error_tracking/extensions.rb +2 -2
  316. data/lib/datadog/error_tracking/filters.rb +4 -4
  317. data/lib/datadog/error_tracking.rb +6 -6
  318. data/lib/datadog/kit/appsec/events/v2.rb +90 -32
  319. data/lib/datadog/kit/appsec/events.rb +25 -25
  320. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  321. data/lib/datadog/kit/identity.rb +18 -18
  322. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  323. data/lib/datadog/kit.rb +1 -1
  324. data/lib/datadog/open_feature/component.rb +53 -21
  325. data/lib/datadog/open_feature/configuration.rb +22 -1
  326. data/lib/datadog/open_feature/evaluation_engine.rb +7 -7
  327. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  328. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  329. data/lib/datadog/open_feature/exposures/event.rb +2 -2
  330. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  331. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  332. data/lib/datadog/open_feature/ext.rb +13 -6
  333. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
  334. data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
  335. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +102 -0
  336. data/lib/datadog/open_feature/hooks/{flag_eval_hook.rb → flag_eval_metrics_hook.rb} +4 -2
  337. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  338. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  339. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  340. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  341. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  342. data/lib/datadog/open_feature/native_evaluator.rb +23 -1
  343. data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
  344. data/lib/datadog/open_feature/provider.rb +97 -30
  345. data/lib/datadog/open_feature/remote.rb +2 -2
  346. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  347. data/lib/datadog/open_feature/transport.rb +65 -11
  348. data/lib/datadog/open_feature.rb +2 -2
  349. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  350. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  351. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  352. data/lib/datadog/opentelemetry/ext.rb +1 -1
  353. data/lib/datadog/opentelemetry/logs.rb +5 -5
  354. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  355. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  356. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  357. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +10 -17
  358. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +8 -15
  359. data/lib/datadog/opentelemetry/sdk/propagator.rb +7 -7
  360. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  361. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  362. data/lib/datadog/opentelemetry/sdk.rb +19 -0
  363. data/lib/datadog/opentelemetry/signal_configuration.rb +11 -11
  364. data/lib/datadog/opentelemetry/trace.rb +1 -1
  365. data/lib/datadog/opentelemetry.rb +8 -8
  366. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -1
  367. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -3
  368. data/lib/datadog/profiling/collectors/thread_context.rb +15 -14
  369. data/lib/datadog/profiling/component.rb +18 -0
  370. data/lib/datadog/profiling/exporter.rb +1 -1
  371. data/lib/datadog/profiling/http_transport.rb +1 -1
  372. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  373. data/lib/datadog/profiling/tag_builder.rb +19 -19
  374. data/lib/datadog/profiling.rb +31 -27
  375. data/lib/datadog/single_step_instrument.rb +1 -1
  376. data/lib/datadog/symbol_database/component.rb +177 -60
  377. data/lib/datadog/symbol_database/configuration.rb +15 -7
  378. data/lib/datadog/symbol_database/extensions.rb +19 -0
  379. data/lib/datadog/symbol_database/extractor.rb +167 -130
  380. data/lib/datadog/symbol_database/file_hash.rb +5 -3
  381. data/lib/datadog/symbol_database/logger.rb +1 -1
  382. data/lib/datadog/symbol_database/remote.rb +28 -8
  383. data/lib/datadog/symbol_database/scope.rb +2 -2
  384. data/lib/datadog/symbol_database/scope_batcher.rb +8 -4
  385. data/lib/datadog/symbol_database/service_version.rb +4 -4
  386. data/lib/datadog/symbol_database/symbol.rb +1 -1
  387. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  388. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  389. data/lib/datadog/symbol_database/transport.rb +4 -4
  390. data/lib/datadog/symbol_database/uploader.rb +28 -21
  391. data/lib/datadog/symbol_database.rb +22 -0
  392. data/lib/datadog/tracing/analytics.rb +1 -1
  393. data/lib/datadog/tracing/buffer.rb +5 -5
  394. data/lib/datadog/tracing/client_ip.rb +4 -4
  395. data/lib/datadog/tracing/component.rb +28 -7
  396. data/lib/datadog/tracing/configuration/dynamic.rb +8 -8
  397. data/lib/datadog/tracing/configuration/ext.rb +43 -42
  398. data/lib/datadog/tracing/configuration/http.rb +2 -2
  399. data/lib/datadog/tracing/configuration/settings.rb +32 -16
  400. data/lib/datadog/tracing/context.rb +1 -1
  401. data/lib/datadog/tracing/context_provider.rb +2 -2
  402. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  403. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  404. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  405. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  406. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  407. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  408. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  409. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  410. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  411. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  412. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  413. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  414. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  415. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  416. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  417. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  418. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  419. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  420. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +8 -8
  421. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  422. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  423. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  424. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  425. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  426. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  427. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  428. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  429. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  430. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  431. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  432. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  433. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  434. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  435. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  436. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  437. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  438. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  439. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
  440. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  441. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  442. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  443. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  444. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  445. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  446. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  447. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  448. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  449. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  450. data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -5
  451. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  452. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  453. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  454. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +7 -8
  455. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  456. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  457. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  458. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  459. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  460. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +6 -6
  461. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  462. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  463. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  464. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +9 -9
  465. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  466. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  467. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  468. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  469. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  470. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  471. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -11
  472. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  473. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  474. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  475. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  476. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  477. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  478. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  479. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  480. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  481. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  482. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  483. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  484. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  485. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  486. data/lib/datadog/tracing/contrib/aws/ext.rb +25 -25
  487. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  488. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  489. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  490. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  491. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  492. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  493. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  494. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  495. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  496. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  497. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  498. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  499. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  500. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  501. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  502. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  503. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  504. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  505. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  506. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  507. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  508. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  509. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  510. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  511. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  512. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  513. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  514. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  515. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  516. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  517. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  518. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  519. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  520. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  521. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  522. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  523. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  524. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  525. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  526. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  527. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +8 -8
  528. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  529. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  530. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  531. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  532. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  533. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  534. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  535. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -8
  536. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/ext.rb +15 -15
  538. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  539. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  540. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  541. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  542. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  543. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  544. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  545. data/lib/datadog/tracing/contrib/grape/endpoint.rb +20 -20
  546. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  547. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  548. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  549. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  550. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  551. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  552. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  553. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  554. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  555. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  556. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  557. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  558. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -7
  559. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -7
  560. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  561. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  562. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +8 -8
  563. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  564. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  565. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  566. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  567. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  568. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  569. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  570. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  571. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  572. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  573. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  574. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  575. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  576. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  577. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  578. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  579. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  580. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  581. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -6
  582. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  583. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  584. data/lib/datadog/tracing/contrib/http.rb +6 -6
  585. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  586. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  587. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -5
  588. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  589. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  590. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  591. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  592. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -6
  593. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  594. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  595. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  596. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  597. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  598. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  599. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  600. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  601. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  602. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  603. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  604. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  605. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  606. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  607. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  608. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  609. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  610. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  611. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  612. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  613. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  614. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +8 -8
  615. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  616. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  617. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  618. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  619. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  620. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  621. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  622. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  623. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  624. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  625. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  626. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  627. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  628. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  629. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  630. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  631. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  632. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  633. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  634. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  635. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  636. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  637. data/lib/datadog/tracing/contrib/opensearch/ext.rb +22 -22
  638. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  639. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  640. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +3 -3
  641. data/lib/datadog/tracing/contrib/patcher.rb +2 -2
  642. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  643. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  644. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +18 -18
  645. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  646. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  647. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  648. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  649. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  650. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  651. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  652. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  653. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  654. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  655. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  656. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  657. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  658. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  659. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  660. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  661. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  662. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  663. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  664. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  665. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  666. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  667. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  668. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  669. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  670. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  671. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  672. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  673. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  674. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  675. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  676. data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -3
  677. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  678. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  679. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +15 -15
  680. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  681. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  682. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  683. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  684. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  685. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  686. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  687. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  688. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  689. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  690. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  691. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  692. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  693. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  694. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  695. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  696. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  697. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  698. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  699. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  700. data/lib/datadog/tracing/contrib/redis/quantize.rb +4 -4
  701. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  702. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +5 -5
  703. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  704. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  705. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  706. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  707. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  708. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  709. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  710. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  711. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  712. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -5
  713. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  714. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  715. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  716. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  717. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  718. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  719. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  720. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  721. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  722. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  723. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  724. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  725. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  726. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  727. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  728. data/lib/datadog/tracing/contrib/sequel/utils.rb +115 -10
  729. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  730. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  731. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  732. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  733. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  734. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  735. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  736. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +9 -9
  737. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  738. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  739. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  740. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +14 -14
  741. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  742. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  743. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  744. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  745. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  746. data/lib/datadog/tracing/contrib/sinatra/framework.rb +2 -2
  747. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  748. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  749. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  750. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  751. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  752. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  753. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  754. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  755. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -3
  756. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  757. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  758. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  759. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  760. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  761. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  762. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  763. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  764. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  765. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  766. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  767. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  768. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  769. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  770. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  771. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  772. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  773. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  774. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  775. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  776. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  777. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
  778. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  779. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +8 -8
  780. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  781. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  782. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  783. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  784. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  785. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  786. data/lib/datadog/tracing/contrib.rb +54 -54
  787. data/lib/datadog/tracing/correlation.rb +10 -10
  788. data/lib/datadog/tracing/diagnostics/environment_logger.rb +9 -9
  789. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  790. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  791. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  792. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  793. data/lib/datadog/tracing/distributed/baggage.rb +28 -27
  794. data/lib/datadog/tracing/distributed/datadog.rb +21 -21
  795. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +3 -3
  796. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  797. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  798. data/lib/datadog/tracing/distributed/propagation.rb +12 -12
  799. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  800. data/lib/datadog/tracing/distributed/trace_context.rb +33 -33
  801. data/lib/datadog/tracing/event.rb +1 -1
  802. data/lib/datadog/tracing/ext.rb +9 -0
  803. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  804. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  805. data/lib/datadog/tracing/metadata/ext.rb +69 -69
  806. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  807. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  808. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  809. data/lib/datadog/tracing/metadata.rb +4 -4
  810. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  811. data/lib/datadog/tracing/pipeline.rb +2 -2
  812. data/lib/datadog/tracing/remote.rb +45 -7
  813. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  814. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  815. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  816. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  817. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  818. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  819. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  820. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  821. data/lib/datadog/tracing/sampling/rule_sampler.rb +12 -12
  822. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  823. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  824. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  825. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  826. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  827. data/lib/datadog/tracing/span.rb +8 -8
  828. data/lib/datadog/tracing/span_event.rb +5 -5
  829. data/lib/datadog/tracing/span_operation.rb +21 -21
  830. data/lib/datadog/tracing/sync_writer.rb +12 -7
  831. data/lib/datadog/tracing/trace_operation.rb +11 -11
  832. data/lib/datadog/tracing/trace_segment.rb +10 -10
  833. data/lib/datadog/tracing/tracer.rb +23 -15
  834. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  835. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  836. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  837. data/lib/datadog/tracing/transport/http.rb +10 -10
  838. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  839. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  840. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  841. data/lib/datadog/tracing/transport/io.rb +3 -3
  842. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  843. data/lib/datadog/tracing/transport/native.rb +363 -0
  844. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  845. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  846. data/lib/datadog/tracing/transport/trace_formatter.rb +10 -10
  847. data/lib/datadog/tracing/transport/traces.rb +8 -8
  848. data/lib/datadog/tracing/utils.rb +2 -2
  849. data/lib/datadog/tracing/workers.rb +2 -2
  850. data/lib/datadog/tracing/writer.rb +21 -8
  851. data/lib/datadog/tracing.rb +3 -3
  852. data/lib/datadog/version.rb +4 -4
  853. data/lib/datadog.rb +13 -12
  854. metadata +33 -8
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core/utils/time'
3
+ require_relative "../core/utils/time"
4
+ require_relative "../ruby_version"
5
+ require_relative "fatal_exceptions"
6
+ require_relative "capture_expression_evaluator"
4
7
 
5
8
  # rubocop:disable Lint/AssignmentInCondition
6
9
  # rubocop:disable Style/AndOr
@@ -82,6 +85,18 @@ module Datadog
82
85
  attr_reader :telemetry
83
86
  attr_reader :code_tracker
84
87
 
88
+ # The code tracker is a global singleton created lazily by
89
+ # DI.activate_tracking. When DI is enabled after boot via remote
90
+ # configuration this instrumenter was already built with a nil tracker;
91
+ # Component#start! assigns the now-current tracker here.
92
+ attr_writer :code_tracker
93
+
94
+ def capture_expression_evaluator
95
+ @capture_expression_evaluator ||= CaptureExpressionEvaluator.new(
96
+ settings: settings, serializer: serializer, logger: logger, telemetry: telemetry,
97
+ )
98
+ end
99
+
85
100
  # This is a substitute for Thread::Backtrace::Location
86
101
  # which does not have a public constructor.
87
102
  # Used for the fabricated stack frame for the method itself
@@ -95,6 +110,18 @@ module Datadog
95
110
  # are not reachable via prepend on the class itself. Line probes are
96
111
  # unaffected since they install via TracePoint, not method dispatch.
97
112
  def hook_method(probe, responder)
113
+ # Reject method probes targeting any class or module in the Datadog
114
+ # namespace. The tracer uses these classes internally while building
115
+ # and dispatching probe snapshots; allowing a method probe on them
116
+ # would let DI's own code paths re-enter the probe wrapper. Line
117
+ # probes are unaffected (TracePoint is self-disabling during its
118
+ # callback) and are not rejected here.
119
+ type_name = probe.type_name
120
+ if type_name && datadog_namespace_type_name?(type_name)
121
+ raise Error::ProbeTargetForbidden,
122
+ "Method probes on the Datadog namespace are not permitted: #{type_name}##{probe.method_name}"
123
+ end
124
+
98
125
  lock.synchronize do
99
126
  if probe.instrumentation_module
100
127
  # Already instrumented, warn?
@@ -103,10 +130,9 @@ module Datadog
103
130
  end
104
131
 
105
132
  cls = symbolize_class_name(probe.type_name)
106
- serializer = self.serializer
107
- method_name = probe.method_name
108
- loc = begin
109
- cls.instance_method(method_name).source_location # steep:ignore ArgumentTypeMismatch
133
+ method_name = probe.method_name!
134
+ target_method = begin
135
+ cls.instance_method(method_name)
110
136
  rescue NameError
111
137
  # The target method is not defined.
112
138
  # This could be because it will be explicitly defined later
@@ -114,175 +140,97 @@ module Datadog
114
140
  # or the method is virtual (provided by a method_missing handler).
115
141
  # In these cases we do not have a source location for the
116
142
  # target method here.
143
+ nil
117
144
  end
118
- rate_limiter = probe.rate_limiter
119
- settings = self.settings
120
- instrumenter = self
121
-
122
- mod = Module.new do
123
- define_method(method_name) do |*args, **kwargs, &target_block| # steep:ignore NoMethod
124
- # Steep: Unsure why it cannot detect kwargs in this block. Workaround:
125
- # @type var kwargs: ::Hash[::Symbol, untyped]
126
- di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
127
-
128
- if continue = probe.enabled?
129
- if condition = probe.condition
130
- begin
131
- # This context will be recreated later, unlike for line probes.
132
- #
133
- # We do not need the stack for condition evaluation, therefore
134
- # stack is not passed to Context here.
135
- context = Context.new(
136
- locals: serializer.combine_args(args, kwargs, self),
137
- target_self: self,
138
- probe: probe, settings: settings, serializer: serializer,
139
- )
140
- continue = condition.satisfied?(context)
141
- rescue => exc
142
- # Evaluation error exception can be raised for "expected"
143
- # errors, we probably need another setting to control whether
144
- # these exceptions are propagated.
145
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions &&
146
- !exc.is_a?(DI::Error::ExpressionEvaluationError)
147
-
148
- if context
149
- # We want to report evaluation errors for conditions
150
- # as probe snapshots. However, if we failed to create
151
- # the context, we won't be able to report anything as
152
- # the probe notifier builder requires a context.
153
- begin
154
- responder.probe_condition_evaluation_failed_callback(context, exc)
155
- rescue => nested_exc
156
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
157
-
158
- instrumenter.logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc.message}" }
159
- instrumenter.telemetry&.report(nested_exc, description: "Error in probe condition evaluation failed callback")
160
- end
161
- else
162
- _ = 42 # stop standard from wrecking this code
163
-
164
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
165
-
166
- instrumenter.logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc.message}" }
167
- instrumenter.telemetry&.report(exc, description: "Error evaluating condition without context")
168
- # If execution gets here, there is probably a bug in the tracer.
169
- end
170
-
171
- continue = false
172
- end
173
- end
174
- end
175
145
 
176
- if continue and rate_limiter.nil? || rate_limiter.allow?
177
- # Arguments may be mutated by the method, therefore
178
- # they need to be serialized prior to method invocation.
179
- serialized_entry_args = if probe.capture_snapshot?
180
- serializer.serialize_args(args, kwargs, self,
181
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
182
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
183
- end
184
- # We intentionally do not use Core::Utils::Time.get_time
185
- # here because the time provider may be overridden by the
186
- # customer, and DI is not allowed to invoke customer code.
187
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
146
+ # Reject method probes whose target method resolves to Kernel#lambda,
147
+ # including inherited targets. Every class inherits Kernel#lambda, so a
148
+ # probe naming any type that does not override lambda (Object#lambda,
149
+ # String#lambda, a plain user class, ...) prepends the wrapper ahead of
150
+ # Kernel#lambda and reaches the wrapper's super(&block) path. On
151
+ # Ruby 3.3+ that path raises ArgumentError for every lambda { ... }
152
+ # call site passing a captured block, breaking lambda creation
153
+ # process-wide. Resolving the method owner catches the inherited case
154
+ # that a textual "Kernel" name match misses; a type that defines its
155
+ # own lambda has a different owner and is left alone. Probing lambda
156
+ # creation has no legitimate customer use case. See #5560.
157
+ if method_name == "lambda" && target_method&.owner == ::Kernel
158
+ raise Error::ProbeTargetForbidden,
159
+ "Method probes on Kernel#lambda are not permitted: #{probe.type_name}##{method_name}"
160
+ end
188
161
 
189
- di_duration = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) - di_start_time
162
+ loc = target_method&.source_location
163
+ instrumenter = self
190
164
 
191
- rv = nil
192
- begin
193
- # Under Ruby 2.6 we cannot just call super(*args, **kwargs)
194
- # for methods defined via method_missing.
195
- rv = if args.any?
196
- if kwargs.any?
197
- super(*args, **kwargs, &target_block)
198
- else
199
- super(*args, &target_block)
200
- end
201
- elsif kwargs.any?
202
- super(**kwargs, &target_block)
203
- else
204
- super(&target_block)
205
- end
206
- rescue NoMemoryError, Interrupt, SystemExit
207
- raise
208
- rescue Exception => exc # standard:disable Lint/RescueException
209
- # We will raise the exception captured here later, after
210
- # the instrumentation callback runs.
165
+ mod = Module.new do
166
+ # Argument delegation follows docs/Delegation.md: on Ruby 3+
167
+ # positional and keyword arguments are captured and forwarded
168
+ # separately; on Ruby < 3 everything is captured into a single
169
+ # splat that ruby2_keywords flags, which is the only way to forward
170
+ # a trailing hash while preserving its positional-vs-keyword
171
+ # identity. The pre-3 branch is what lets an empty trailing hash
172
+ # (e.g. foo('x', {})) reach the original method intact.
173
+ #
174
+ # Re-entrancy guard: if we are already inside a DI method-probe
175
+ # callback, skip DI processing and call the original method
176
+ # directly. This prevents SystemStackError when a method probe is
177
+ # set on a stdlib method that DI itself calls during method-probe
178
+ # snapshot building (e.g., String#length, Hash#each). Line probes
179
+ # do not enter the guard — they rely on Ruby's TracePoint, which
180
+ # self-disables during its own callback. Nested invocations during
181
+ # DI processing also bypass the rate limiter: they are not
182
+ # user-observable probe firings, just internal calls that happen to
183
+ # land on a probed method. Guard storage is fiber-local;
184
+ # DI.in_probe?/enter_probe/leave_probe are implemented in C and
185
+ # access it directly, bypassing Thread#[]/Thread#[]= method dispatch
186
+ # so user probes on those cannot recurse.
187
+ #
188
+ # The original method is invoked via super. That super call lives
189
+ # in a block passed to #run_method_probe and captures its binding
190
+ # from inside this define_method block — the only place super
191
+ # resolves to the prepended-on class's method. #run_method_probe
192
+ # invokes it with yield, which does not dispatch Proc#call, so a
193
+ # user probe on Proc#call cannot intercept the trampoline, and no
194
+ # Proc is allocated for the block.
195
+ if RubyVersion.is?(">= 3")
196
+ define_method(method_name) do |*args, **kwargs, &target_block| # steep:ignore NoMethod
197
+ # steep:ignore FallbackAny below: Steep cannot narrow the
198
+ # **kwargs parameter inside this define_method block, so it
199
+ # falls back to untyped at the super and run_method_probe sites.
200
+ if DI.in_probe?
201
+ return super(*args, **kwargs, &target_block) # steep:ignore FallbackAny
211
202
  end
212
203
 
213
- end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
214
- duration = end_time - start_time
215
-
216
- # Restart DI timer.
217
- # The DI execution duration covers time spent in DI code before
218
- # the customer method is invoked and time spent in DI code
219
- # after the customer method finishes.
220
- di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
221
-
222
- # The method itself is not part of the stack trace because
223
- # we are getting the stack trace from outside of the method.
224
- # Add the method in manually as the top frame.
225
- method_frame = if loc
226
- [Location.new(loc.first, loc.last, method_name)]
227
- else
228
- # For virtual and lazily-defined methods, we do not have
229
- # the original source location here, and they won't be
230
- # included in the stack trace currently.
231
- # TODO when begin/end trace points are added for local
232
- # variable capture in method probes, we should be able
233
- # to obtain actual method execution location and use
234
- # that location here.
235
- []
204
+ instrumenter.run_method_probe(
205
+ args, kwargs, target_block, # steep:ignore FallbackAny
206
+ self,
207
+ probe, responder,
208
+ loc, method_name,
209
+ ) do
210
+ super(*args, **kwargs, &target_block) # steep:ignore FallbackAny
236
211
  end
237
- caller_locs = method_frame + caller_locations
238
- # TODO capture arguments at exit
239
-
240
- context = Context.new(locals: nil, target_self: self,
241
- probe: probe, settings: settings, serializer: serializer,
242
- serialized_entry_args: serialized_entry_args,
243
- caller_locations: caller_locs,
244
- return_value: rv, duration: duration, exception: exc,)
245
-
246
- begin
247
- responder.probe_executed_callback(context)
248
-
249
- instrumenter.send(:check_and_disable_if_exceeded, probe, responder, di_start_time, di_duration)
250
- rescue => di_exc
251
- raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
252
-
253
- instrumenter.logger.debug { "di: unhandled exception in method probe: #{di_exc.class}: #{di_exc.message}" }
254
- instrumenter.telemetry&.report(di_exc, description: "Unhandled exception in method probe")
212
+ end
213
+ else
214
+ define_method(method_name) do |*args, &target_block| # steep:ignore NoMethod
215
+ if DI.in_probe?
216
+ return super(*args, &target_block)
255
217
  end
256
218
 
257
- if exc
258
- raise exc
259
- else
260
- rv
261
- end
262
- else
263
- # stop standard from trying to mess up my code
264
- _ = 42
265
-
266
- # The necessity to invoke super in each of these specific
267
- # ways is very difficult to test.
268
- # Existing tests, even though I wrote many, still don't
269
- # cause a failure if I replace all of the below with a
270
- # simple super(*args, **kwargs, &target_block).
271
- # But, let's be safe and go through the motions in case
272
- # there is actually a legitimate need for the breakdown.
273
- # TODO figure out how to test this properly.
274
- if args.any?
275
- if kwargs.any?
276
- super(*args, **kwargs, &target_block)
277
- else
278
- super(*args, &target_block)
279
- end
280
- elsif kwargs.any?
281
- super(**kwargs, &target_block)
282
- else
283
- super(&target_block)
219
+ # The super block replays the original *args (closed over here)
220
+ # so the ruby2_keywords-flagged trailing hash keeps its
221
+ # identity. run_method_probe receives the serialization-split
222
+ # arguments separately; forwarding does not use them.
223
+ pos_args, kwargs = instrumenter.kwargs_from_splat(args)
224
+ instrumenter.run_method_probe(
225
+ pos_args, kwargs, target_block,
226
+ self,
227
+ probe, responder,
228
+ loc, method_name,
229
+ ) do
230
+ super(*args, &target_block)
284
231
  end
285
232
  end
233
+ ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true) # steep:ignore NoMethod
286
234
  end
287
235
  end
288
236
 
@@ -490,6 +438,283 @@ module Datadog
490
438
 
491
439
  attr_reader :lock
492
440
 
441
+ # Body of the method probe wrapper. Extracted from the define_method
442
+ # block in #hook_method so the begin/ensure structure can use normal
443
+ # indentation. The original method is invoked with yield, calling the
444
+ # block passed by #hook_method; that block captures super's binding
445
+ # from inside the define_method block, the only place super resolves
446
+ # to the prepended-on class's method.
447
+ #
448
+ # Performance: this method takes eight positional parameters, not
449
+ # keyword parameters, deliberately. Every probed method invocation
450
+ # passes through here on the firing/disabled/rate-limited paths.
451
+ # Keyword-argument calls in Ruby allocate a fresh Hash on every call
452
+ # to materialize the keyword bindings; with eight keyword arguments
453
+ # (~300-1000 ns of allocation per invocation), that hash dominated
454
+ # the wrapper's per-call overhead. Positional parameters skip the
455
+ # allocation entirely. The cost is a long unlabeled signature and
456
+ # an unlabeled call site in #hook_method — both small price for
457
+ # eliminating per-call allocation on the hot path. The argument
458
+ # order matches #hook_method's call site exactly; do not reorder
459
+ # without updating both sides.
460
+ #
461
+ # @param args [Array] positional arguments passed to the probed method
462
+ # @param kwargs [Hash{Symbol => Object}] keyword arguments passed to the probed method
463
+ # @param target_block [Proc, nil] block argument passed to the probed method
464
+ # @param target_self [Object] the receiver of the probed method invocation
465
+ # @param probe [Datadog::DI::Probe] the probe whose callback this invocation runs
466
+ # @param responder [#probe_executed_callback, #probe_condition_evaluation_failed_callback] callback target invoked with the built Context
467
+ # @param loc [Array(String, Integer), nil] source location of the probed method, or nil for virtual/lazily-defined methods
468
+ # @param method_name [String] name of the probed method, used as the synthetic top stack frame label
469
+ # @yield invokes the original method via super and returns its value
470
+ # @return [Object] the original method's return value, or re-raises its exception
471
+ def run_method_probe(args, kwargs, target_block, target_self,
472
+ probe, responder, loc, method_name)
473
+ # Disabled probe: skip DI processing entirely. enter_probe is not
474
+ # called on this path so the guard is never set — there is no DI
475
+ # work to guard, and any nested probed methods invoked by the
476
+ # original method should fire normally without short-circuit.
477
+ return yield unless probe.enabled?
478
+
479
+ DI.enter_probe
480
+ begin
481
+ di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
482
+
483
+ continue = true
484
+ if condition = probe.condition
485
+ begin
486
+ # This context will be recreated later, unlike for line probes.
487
+ #
488
+ # We do not need the stack for condition evaluation, therefore
489
+ # stack is not passed to Context here.
490
+ context = Context.new(
491
+ locals: serializer.combine_args(args, kwargs, target_self),
492
+ target_self: target_self,
493
+ probe: probe, settings: settings, serializer: serializer,
494
+ )
495
+ continue = condition.satisfied?(context)
496
+ rescue Exception => exc # standard:disable Lint/RescueException
497
+ Datadog::DI.reraise_if_fatal(exc)
498
+ # Evaluation error exception can be raised for "expected"
499
+ # errors, we probably need another setting to control whether
500
+ # these exceptions are propagated.
501
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions &&
502
+ !exc.is_a?(DI::Error::ExpressionEvaluationError)
503
+
504
+ if context
505
+ # We want to report evaluation errors for conditions
506
+ # as probe snapshots. However, if we failed to create
507
+ # the context, we won't be able to report anything as
508
+ # the probe notifier builder requires a context.
509
+ begin
510
+ responder.probe_condition_evaluation_failed_callback(context, exc)
511
+ rescue Exception => nested_exc # standard:disable Lint/RescueException
512
+ Datadog::DI.reraise_if_fatal(nested_exc)
513
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
514
+
515
+ logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc.message}" }
516
+ telemetry&.report(nested_exc, description: "Error in probe condition evaluation failed callback")
517
+ end
518
+ else
519
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
520
+
521
+ logger.debug { "di: error evaluating condition without context (tracer bug?): #{exc.class}: #{exc.message}" }
522
+ telemetry&.report(exc, description: "Error evaluating condition without context")
523
+ # If execution gets here, there is probably a bug in the tracer.
524
+ end
525
+
526
+ continue = false
527
+ end
528
+ end
529
+
530
+ rate_limiter = probe.rate_limiter
531
+ if continue and rate_limiter.nil? || rate_limiter.allow?
532
+ # Arguments may be mutated by the method, therefore
533
+ # they need to be serialized prior to method invocation.
534
+ serialized_entry_args = if probe.capture_snapshot?
535
+ serializer.serialize_args(args, kwargs, target_self,
536
+ **probe.snapshot_serializer_limits(settings))
537
+ end
538
+
539
+ entry_capture_expressions = nil
540
+ entry_capture_evaluation_errors = nil
541
+ if probe.capture_entry_expressions?
542
+ begin
543
+ entry_context = Context.new(
544
+ probe: probe, settings: settings, serializer: serializer,
545
+ target_self: target_self,
546
+ locals: serializer.combine_args(args, kwargs, target_self),
547
+ )
548
+ entry_capture_expressions, entry_capture_evaluation_errors =
549
+ capture_expression_evaluator.evaluate(probe, entry_context)
550
+ rescue Exception => exc # standard:disable Lint/RescueException
551
+ Datadog::DI.reraise_if_fatal(exc)
552
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
553
+
554
+ logger.debug { "di: error evaluating entry-time capture expressions: #{exc.class}: #{exc.message}" }
555
+ telemetry&.report(exc, description: "Error evaluating entry-time capture expressions")
556
+ end
557
+ end
558
+ # We intentionally do not use Core::Utils::Time.get_time
559
+ # here because the time provider may be overridden by the
560
+ # customer, and DI is not allowed to invoke customer code.
561
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
562
+
563
+ di_duration = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) - di_start_time
564
+
565
+ # Release re-entrancy guard for the original method so that
566
+ # probes on other methods (or recursive calls) fire normally
567
+ # during user code execution.
568
+ DI.leave_probe
569
+
570
+ rv = nil
571
+ begin
572
+ # yield invokes the super block without dispatching Proc#call,
573
+ # so a user probe on Proc#call cannot intercept the trampoline.
574
+ # The guard was just released above so nested probes on the
575
+ # customer method body fire normally — but Proc#call must
576
+ # remain bypassed regardless, because the disabled-probe early
577
+ # return at the top of this method also invokes the block.
578
+ rv = yield
579
+ rescue Exception => exc # standard:disable Lint/RescueException
580
+ Datadog::DI.reraise_if_fatal(exc)
581
+ # We will raise the (non-fatal) exception captured here later,
582
+ # after the instrumentation callback runs.
583
+ end
584
+
585
+ # Re-acquire re-entrancy guard for DI post-processing
586
+ # (building context, notification callback).
587
+ DI.enter_probe
588
+
589
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
590
+ duration = end_time - start_time
591
+
592
+ # Restart DI timer.
593
+ # The DI execution duration covers time spent in DI code before
594
+ # the customer method is invoked and time spent in DI code
595
+ # after the customer method finishes.
596
+ di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
597
+
598
+ # The method itself is not part of the stack trace because
599
+ # we are getting the stack trace from outside of the method.
600
+ # Add the method in manually as the top frame.
601
+ method_frame = if loc
602
+ [Location.new(loc.first, loc.last, method_name)]
603
+ else
604
+ # For virtual and lazily-defined methods, we do not have
605
+ # the original source location here, and they won't be
606
+ # included in the stack trace currently.
607
+ # TODO when begin/end trace points are added for local
608
+ # variable capture in method probes, we should be able
609
+ # to obtain actual method execution location and use
610
+ # that location here.
611
+ []
612
+ end
613
+ # depth 2 skips run_method_probe and the wrapper define_method
614
+ # block, leaving the user's call site as the first returned frame.
615
+ # caller_locations is RBS-nilable but never nil at this depth.
616
+ caller_locs = method_frame + (caller_locations(2) || [])
617
+ # TODO capture arguments at exit
618
+
619
+ capture_expression_locals = if probe.capture_expressions_only?
620
+ serializer.combine_args(args, kwargs, target_self)
621
+ end
622
+ context = Context.new(locals: capture_expression_locals, target_self: target_self,
623
+ probe: probe, settings: settings, serializer: serializer,
624
+ serialized_entry_args: serialized_entry_args,
625
+ entry_capture_expressions: entry_capture_expressions,
626
+ entry_capture_evaluation_errors: entry_capture_evaluation_errors,
627
+ caller_locations: caller_locs,
628
+ return_value: rv, duration: duration, exception: exc,)
629
+
630
+ begin
631
+ responder.probe_executed_callback(context)
632
+
633
+ check_and_disable_if_exceeded(probe, responder, di_start_time, di_duration)
634
+ rescue Exception => di_exc # standard:disable Lint/RescueException
635
+ Datadog::DI.reraise_if_fatal(di_exc)
636
+ raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
637
+
638
+ logger.debug { "di: unhandled exception in method probe: #{di_exc.class}: #{di_exc.message}" }
639
+ telemetry&.report(di_exc, description: "Unhandled exception in method probe")
640
+ end
641
+
642
+ if exc
643
+ raise exc
644
+ else
645
+ rv
646
+ end
647
+ else
648
+ # Condition not satisfied or rate-limited: skip DI processing
649
+ # and call super. (The disabled-probe case is handled by the
650
+ # early return at the top of this method, so it never reaches
651
+ # this branch.)
652
+ #
653
+ # The guard must be released here (not relied on the ensure)
654
+ # because the super block invokes the customer's method, which
655
+ # may call other probed methods. Those nested probes should fire
656
+ # normally — they would not if the guard were still set,
657
+ # because the wrapper's early-return short-circuits when
658
+ # DI.in_probe? is true.
659
+ #
660
+ # No post-processing in this branch, so we don't re-acquire
661
+ # the guard after super. The ensure's leave_probe below is
662
+ # a no-op here (guard already cleared) and serves the
663
+ # firing branch above, where post-processing re-enters.
664
+ DI.leave_probe
665
+ # yield bypasses Proc#call dispatch — see the firing branch
666
+ # above for the same rationale.
667
+ yield
668
+ end
669
+ ensure
670
+ DI.leave_probe
671
+ end
672
+ end
673
+ # `run_method_probe` is documentation-private (`# @api private`) but must
674
+ # be lexically public so that the prepended wrapper can call it without
675
+ # `.send`. The wrapper hot path is reached when a probed customer method
676
+ # is invoked, and a customer probe on `Object#send` / `Kernel#send`
677
+ # would intercept any `.send` call before the wrapper had a chance to
678
+ # set the re-entrancy guard, causing infinite recursion. Calling the
679
+ # method directly avoids `Object#send` dispatch entirely.
680
+ public :run_method_probe
681
+
682
+ # Splits a Ruby < 3 splat-captured argument list into positional
683
+ # arguments and the trailing keyword-argument hash, for argument
684
+ # serialization only. Returns `[positional_args, kwargs]`. Forwarding
685
+ # does not use this — the wrapper's do_super replays the original
686
+ # splat so the trailing hash keeps its keyword identity.
687
+ #
688
+ # A trailing hash is treated as keyword arguments regardless of how it
689
+ # was passed at the call site, matching the previous `**kwargs`
690
+ # capture (which, on Ruby 2.x, absorbed a trailing hash into kwargs).
691
+ # The ruby2_keywords flag is intentionally not consulted here: callers
692
+ # that pass a hash positionally (e.g. `m(opts)`) still expect it shown
693
+ # as a keyword argument, consistent with Ruby 2.x serialization.
694
+ #
695
+ # The trailing-element test goes through DI.hash? (a C type check)
696
+ # rather than `last.is_a?(Hash)`: kwargs_from_splat runs before the
697
+ # re-entrancy guard is set, so a customer method probe on Kernel#is_a?
698
+ # would otherwise re-enter the wrapper and recurse. DI.hash? is a
699
+ # singleton method and cannot be targeted by a method probe.
700
+ #
701
+ # Defined only on Ruby < 3; the Ruby 3+ wrapper captures keyword
702
+ # arguments directly and never calls this.
703
+ if RubyVersion.is?("< 3")
704
+ def kwargs_from_splat(args)
705
+ last = args.last
706
+ if DI.hash?(last)
707
+ [args[0...-1] || [], last]
708
+ else
709
+ [args, {}]
710
+ end
711
+ end
712
+ # Lexically public for the same reason as #run_method_probe: the
713
+ # prepended wrapper must call it without `.send`, which a customer
714
+ # probe on Object#send could intercept.
715
+ public :kwargs_from_splat
716
+ end
717
+
493
718
  def line_trace_point_callback(probe, iseq, responder, tp)
494
719
  di_start_time = Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID)
495
720
 
@@ -528,7 +753,8 @@ module Datadog
528
753
  begin
529
754
  context = build_trace_point_context(probe, tp)
530
755
  return unless condition.satisfied?(context)
531
- rescue => exc
756
+ rescue Exception => exc # standard:disable Lint/RescueException
757
+ Datadog::DI.reraise_if_fatal(exc)
532
758
  # Evaluation error exception can be raised for "expected"
533
759
  # errors, we probably need another setting to control whether
534
760
  # these exceptions are propagated.
@@ -542,7 +768,8 @@ module Datadog
542
768
  # the probe notifier builder requires a context.
543
769
  begin
544
770
  responder.probe_condition_evaluation_failed_callback(context, condition, exc)
545
- rescue => nested_exc
771
+ rescue Exception => nested_exc # standard:disable Lint/RescueException
772
+ Datadog::DI.reraise_if_fatal(nested_exc)
546
773
  raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
547
774
 
548
775
  logger.debug { "di: error in probe condition evaluation failed callback: #{nested_exc.class}: #{nested_exc.message}" }
@@ -575,7 +802,8 @@ module Datadog
575
802
  responder.probe_executed_callback(context)
576
803
 
577
804
  check_and_disable_if_exceeded(probe, responder, di_start_time)
578
- rescue => exc
805
+ rescue Exception => exc # standard:disable Lint/RescueException
806
+ Datadog::DI.reraise_if_fatal(exc)
579
807
  raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
580
808
  logger.debug { "di: unhandled exception in line trace point: #{exc.class}: #{exc.message}" }
581
809
  telemetry&.report(exc, description: "Unhandled exception in line trace point")
@@ -638,8 +866,8 @@ module Datadog
638
866
  Utils.path_matches_suffix?(path, working_suffix, case_insensitive: case_insensitive)
639
867
  end
640
868
  break if found
641
- break unless working_suffix.include?('/')
642
- working_suffix.sub!(%r{.*/+}, '')
869
+ break unless working_suffix.include?("/")
870
+ working_suffix.sub!(%r{.*/+}, "")
643
871
  end
644
872
  break if found
645
873
  end
@@ -653,7 +881,11 @@ module Datadog
653
881
  has_per_method = code_tracker&.send(:instance_variable_defined?, :@per_method_registry) &&
654
882
  code_tracker.send(:per_method_registry).key?(loaded_path)
655
883
 
656
- if has_per_method
884
+ if code_tracker.nil?
885
+ raise Error::DITargetNotInRegistry,
886
+ "File #{loaded_path} is loaded but code tracking is not active; " \
887
+ "line probes cannot be targeted."
888
+ elsif has_per_method
657
889
  raise Error::DITargetNotInRegistry,
658
890
  "File #{loaded_path} is loaded and has per-method iseqs, " \
659
891
  "but none cover line #{line_no}. " \
@@ -672,6 +904,31 @@ module Datadog
672
904
  rescue NameError => exc
673
905
  raise Error::DITargetNotDefined, "Class not defined: #{cls_name}: #{exc.class}: #{exc.message}"
674
906
  end
907
+
908
+ # Matches a class name in the Datadog namespace, tolerating the alias
909
+ # forms that Object.const_get resolves to the same top-level constants.
910
+ # Two such forms exist: an optional leading "::" (Ruby's root-namespace
911
+ # prefix), and any number of leading "Object::" segments. Top-level
912
+ # constants are constants of Object, so "Object::Datadog::DI::Instrumenter"
913
+ # resolves to Datadog::DI::Instrumenter; without stripping "Object::" a
914
+ # probe could name a tracer-internal class through an Object:: alias and
915
+ # bypass the rejection, then get prepended onto tracer internals. These
916
+ # are the only alias paths to the top-level Datadog: "Foo::Datadog" does
917
+ # not resolve through const_get for an arbitrary Foo. Anchored at \A so
918
+ # the match decides in O(prefix length) without scanning.
919
+ DATADOG_NAMESPACE_TYPE_NAME = /\A(?:::)?(?:Object::)*Datadog(?:::|\z)/
920
+ private_constant :DATADOG_NAMESPACE_TYPE_NAME
921
+
922
+ # Returns true when +cls_name+ names the +Datadog+ module itself or
923
+ # any class/module under it (e.g. +Datadog::Tracing::SpanOperation+).
924
+ # The check is purely textual on the probe's declared type name; it
925
+ # does not require the class to be loaded. A leading +::+ and any
926
+ # number of leading +Object::+ segments are treated the same as the
927
+ # bare form, since Object.const_get resolves those aliases to the same
928
+ # top-level constants.
929
+ def datadog_namespace_type_name?(cls_name)
930
+ DATADOG_NAMESPACE_TYPE_NAME.match?(cls_name)
931
+ end
675
932
  end
676
933
  end
677
934
  end