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,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'scope'
4
- require_relative 'symbol'
5
- require_relative 'file_hash'
6
- require_relative '../core/utils/enumerable_compat'
3
+ require_relative "scope"
4
+ require_relative "symbol"
5
+ require_relative "file_hash"
6
+ require_relative "../core/utils/enumerable_compat"
7
+ require_relative "../di/fatal_exceptions"
7
8
 
8
9
  module Datadog
9
10
  module SymbolDatabase
@@ -67,7 +68,7 @@ module Datadog
67
68
  # PostgreSQL signed INT_MAX (2^31 - 1). Means "entire file" or "unknown end."
68
69
  UNKNOWN_MAX_LINE = 2147483647
69
70
 
70
- EXCLUDED_COMMON_MODULES = ['Kernel', 'PP::', 'JSON::', 'Enumerable', 'Comparable'].freeze
71
+ EXCLUDED_COMMON_MODULES = ["Kernel", "PP::", "JSON::", "Enumerable", "Comparable"].freeze
71
72
 
72
73
  # RubyVM::InstructionSequence#trace_points event types included when
73
74
  # computing targetable lines on METHOD scopes.
@@ -89,6 +90,26 @@ module Datadog
89
90
  # so we bind the original Module#name to get the real module name safely.
90
91
  MODULE_NAME = Module.instance_method(:name)
91
92
 
93
+ # Cached UnboundMethods for the remaining class/module/object introspection
94
+ # used during extraction. Like MODULE_NAME, these bind the original
95
+ # implementations and are dispatched explicitly so that application code
96
+ # which overrides any of them (per-class, on a subclass, or in a singleton
97
+ # class) can neither intercept extraction nor be executed as a side effect
98
+ # of it. KERNEL_CLASS recovers an object's real class without calling a
99
+ # possibly-overridden #class.
100
+ CLASS_SUPERCLASS = Class.instance_method(:superclass)
101
+ MODULE_INCLUDED_MODULES = Module.instance_method(:included_modules)
102
+ MODULE_ANCESTORS = Module.instance_method(:ancestors)
103
+ MODULE_CLASS_VARIABLES = Module.instance_method(:class_variables)
104
+ MODULE_CONSTANTS = Module.instance_method(:constants)
105
+ MODULE_AUTOLOAD_P = Module.instance_method(:autoload?)
106
+ MODULE_CONST_GET = Module.instance_method(:const_get)
107
+ MODULE_CONST_DEFINED = Module.instance_method(:const_defined?)
108
+ KERNEL_CLASS = ::Kernel.instance_method(:class)
109
+ private_constant :CLASS_SUPERCLASS, :MODULE_INCLUDED_MODULES, :MODULE_ANCESTORS,
110
+ :MODULE_CLASS_VARIABLES, :MODULE_CONSTANTS, :MODULE_AUTOLOAD_P, :MODULE_CONST_GET,
111
+ :MODULE_CONST_DEFINED, :KERNEL_CLASS
112
+
92
113
  # @param logger [Logger] Logger instance (SymbolDatabase::Logger facade or compatible)
93
114
  # @param settings [Configuration::Settings] Tracer settings
94
115
  def initialize(logger:, settings:)
@@ -109,7 +130,7 @@ module Datadog
109
130
  # @param mod [Module, Class] The module or class to extract from
110
131
  # @return [Scope, nil] FILE scope wrapping extracted scope, or nil if filtered out
111
132
  def extract(mod)
112
- return nil unless mod.is_a?(Module)
133
+ return nil unless Module === mod
113
134
  mod_name = safe_mod_name(mod)
114
135
  return nil unless mod_name
115
136
 
@@ -118,15 +139,16 @@ module Datadog
118
139
  source_file = find_source_file(mod)
119
140
  return nil unless source_file
120
141
 
121
- inner_scope = if mod.is_a?(Class)
142
+ inner_scope = if Class === mod
122
143
  extract_class_scope(mod)
123
144
  else
124
145
  extract_module_scope(mod)
125
146
  end
126
147
 
127
148
  wrap_in_file_scope(source_file, [inner_scope])
128
- rescue => e
129
- @logger.debug { "symdb: failed to extract #{mod_name || '<unknown>'}: #{e.class}: #{e.message}" }
149
+ rescue Exception => e # standard:disable Lint/RescueException
150
+ Datadog::DI.reraise_if_fatal(e)
151
+ @logger.debug { "symdb: failed to extract #{mod_name || "<unknown>"}: #{e.class}: #{e.message}" }
130
152
  nil
131
153
  end
132
154
 
@@ -174,7 +196,7 @@ module Datadog
174
196
  # returns [key, value] on a non-empty hash and nil when empty, so the
175
197
  # `while (pair = ...)` form is the drain. Indexing pair[0]/pair[1] rather
176
198
  # than destructuring avoids introducing names into method scope that would
177
- # then shadow the else-branch's block parameters on Ruby 2.5/2.6.
199
+ # then shadow the else-branch's block parameters.
178
200
  while (pair = index.shift)
179
201
  scope = build_file_scope(pair[0], pair[1])
180
202
  yield scope if scope
@@ -190,7 +212,8 @@ module Datadog
190
212
  end
191
213
  result
192
214
  end
193
- rescue => e
215
+ rescue Exception => e # standard:disable Lint/RescueException
216
+ Datadog::DI.reraise_if_fatal(e)
194
217
  @logger.debug { "symdb: error in extract_all: #{e.class}: #{e.message}" }
195
218
  block_given? ? nil : []
196
219
  end
@@ -204,7 +227,8 @@ module Datadog
204
227
  # @return [String, nil] Module name or nil
205
228
  def safe_mod_name(mod)
206
229
  MODULE_NAME.bind(mod).call
207
- rescue => e
230
+ rescue Exception => e # standard:disable Lint/RescueException
231
+ Datadog::DI.reraise_if_fatal(e)
208
232
  @logger.debug { "symdb: safe_mod_name failed: #{e.class}: #{e.message}" }
209
233
  nil
210
234
  end
@@ -228,33 +252,23 @@ module Datadog
228
252
  # subclass with its own binding resolves through the binding, an
229
253
  # inherited autoload triggers nothing.
230
254
  #
231
- # Ruby 2.7+ adds an inherit parameter to Module#autoload? —
232
- # `current.autoload?(sym, false)` cleanly asks "is there an autoload
233
- # registered directly on this namespace?". On Ruby 2.5 and 2.6 that
234
- # parameter doesn't exist (per Ruby 2.7.0 NEWS), so the fallback
235
- # branch uses `current.autoload?(sym)` which also reports inherited
236
- # autoloads. The consequence on 2.5/2.6: a subclass binding whose
237
- # name collides with an ancestor's pending autoload is conservatively
238
- # treated as stale and dropped from extraction. The minimum supported
239
- # Ruby is 2.5 per lib/datadog/version.rb, so this fallback ships.
255
+ # Uses `current.autoload?(sym, false)` (the inherit=false form, added
256
+ # in Ruby 2.7) so the question is strictly "is there an autoload
257
+ # registered directly on this namespace?" and ancestors' pending
258
+ # autoloads at the same name do not affect the result.
240
259
  # @param mod_name [String]
241
260
  # @param mod [Module]
242
261
  # @return [Boolean]
243
262
  def resolves_to_same_module?(mod_name, mod)
244
263
  current = Object
245
- mod_name.split('::').each do |seg|
264
+ mod_name.split("::").each do |seg|
246
265
  sym = seg.to_sym
247
- pending_autoload = if RubyVersion.is?('>= 2.7')
248
- current.autoload?(sym, false)
249
- else
250
- current.autoload?(sym)
251
- end
252
- return false if pending_autoload
253
- return false unless current.const_defined?(sym, false)
254
- current = current.const_get(sym, false)
266
+ return false if MODULE_AUTOLOAD_P.bind(current).call(sym, false)
267
+ return false unless MODULE_CONST_DEFINED.bind(current).call(sym, false)
268
+ current = MODULE_CONST_GET.bind(current).call(sym, false)
255
269
  end
256
270
  current.equal?(mod)
257
- rescue NameError, ArgumentError
271
+ rescue NameError, ArgumentError, TypeError
258
272
  # Expected "no" outcome for stale/detached classes — the whole point
259
273
  # of this predicate. Per the rescue convention in this file's header
260
274
  # comment: inner per-item rescues are expected failures, no logging.
@@ -273,7 +287,7 @@ module Datadog
273
287
  # Matches Python: packages.is_user_code() excludes ddtrace.*
274
288
  # Note: bare 'Datadog' must be checked separately — start_with?('Datadog::')
275
289
  # doesn't match the root module itself.
276
- return false if mod_name == 'Datadog' || mod_name.start_with?('Datadog::')
290
+ return false if mod_name == "Datadog" || mod_name.start_with?("Datadog::")
277
291
 
278
292
  # Exclude Ruby root classes. These are never user code, but
279
293
  # find_source_file can return a user-code path for them via
@@ -295,24 +309,24 @@ module Datadog
295
309
  def user_code_path?(path)
296
310
  # Only absolute paths are real source files. Pseudo-paths like '<main>',
297
311
  # '<internal:...>', '(eval)' are not user code.
298
- return false unless path.start_with?('/')
312
+ return false unless path.start_with?("/")
299
313
  # Only .rb files are Ruby source. Excludes the Ruby binary
300
314
  # (/usr/local/bin/ruby), C extensions (.so/.bundle), and other
301
315
  # non-source files that appear in method source_location.
302
- return false unless path.end_with?('.rb')
316
+ return false unless path.end_with?(".rb")
303
317
  # Exclude gem paths
304
- return false if path.include?('/gems/')
318
+ return false if path.include?("/gems/")
305
319
  # Exclude Ruby stdlib
306
- return false if path.include?('/ruby/')
307
- return false if path.start_with?('<internal:')
308
- return false if path.include?('(eval)')
320
+ return false if path.include?("/ruby/")
321
+ return false if path.start_with?("<internal:")
322
+ return false if path.include?("(eval)")
309
323
  # Exclude test code (not application code)
310
- return false if path.include?('/spec/')
311
- return false if path.include?('/test/')
324
+ return false if path.include?("/spec/")
325
+ return false if path.include?("/test/")
312
326
  # Exclude Datadog's own library code (e.g., monkey-patched methods from tracing contrib).
313
327
  # Without this, stdlib classes like Net::HTTP appear as user code when dd-trace-rb
314
328
  # instruments them, because the patched method source points to lib/datadog/tracing/contrib/.
315
- return false if path.include?('/lib/datadog/')
329
+ return false if path.include?("/lib/datadog/")
316
330
 
317
331
  true
318
332
  end
@@ -324,15 +338,10 @@ module Datadog
324
338
  # AR models get filtered out as gem code.
325
339
  #
326
340
  # For namespace-only modules (no instance or singleton methods), falls back to
327
- # Module#const_source_location (Ruby 2.7+) to locate the module via its constants.
341
+ # Module#const_source_location to locate the module via its constants.
328
342
  # This handles patterns like `module ApplicationCable; class Channel...; end; end`
329
343
  # where the namespace module itself has no methods but defines user-code classes.
330
344
  #
331
- # On Ruby 2.6 (where const_source_location is unavailable), namespace-only modules
332
- # and classes whose only methods are generated (e.g., AR models with only associations)
333
- # may not be found — the extraction silently omits them. This is a graceful degradation:
334
- # fewer symbols uploaded, no errors.
335
- #
336
345
  # @param mod [Module] The module
337
346
  # @return [String, nil] Source file path or nil
338
347
  def find_source_file(mod)
@@ -362,18 +371,19 @@ module Datadog
362
371
  fallback ||= path # steep:ignore
363
372
  end
364
373
 
365
- # Try const_source_location (Ruby 2.7+) to find where this class/module is declared.
374
+ # Use const_source_location to find where this class/module is declared.
366
375
  # This handles two cases:
367
376
  # 1. Classes with no user-defined methods (e.g. AR models with only associations) whose
368
377
  # generated methods point to gem code — we find the `class Foo` declaration instead.
369
378
  # 2. Namespace-only modules (`module Foo; class Bar; end; end`) with no methods at all.
370
- if Module.method_defined?(:const_source_location) && mod.name
379
+ mod_name = safe_mod_name(mod)
380
+ if mod_name
371
381
  # Look up the class/module by its last name component in its enclosing namespace.
372
- parts = mod.name.split('::')
382
+ parts = mod_name.split("::")
373
383
  const_name = parts.last
374
384
  namespace = if parts.length > 1
375
385
  begin
376
- Object.const_get(parts[0..-2].join('::')) # steep:ignore
386
+ MODULE_CONST_GET.bind(Object).call(parts[0..-2].join("::")) # steep:ignore
377
387
  rescue NameError
378
388
  nil
379
389
  end
@@ -384,7 +394,8 @@ module Datadog
384
394
  if namespace
385
395
  location = begin
386
396
  namespace.const_source_location(const_name)
387
- rescue => e
397
+ rescue Exception => e # standard:disable Lint/RescueException
398
+ Datadog::DI.reraise_if_fatal(e)
388
399
  @logger.debug { "symdb: const_source_location(#{const_name}) failed: #{e.class}: #{e.message}" }
389
400
  nil
390
401
  end
@@ -397,10 +408,11 @@ module Datadog
397
408
  end
398
409
 
399
410
  # Also scan constants defined by mod itself (namespace-only modules).
400
- mod.constants(false).each do |child_const_name|
411
+ MODULE_CONSTANTS.bind(mod).call(false).each do |child_const_name|
401
412
  location = begin
402
413
  mod.const_source_location(child_const_name)
403
- rescue => e
414
+ rescue Exception => e # standard:disable Lint/RescueException
415
+ Datadog::DI.reraise_if_fatal(e)
404
416
  @logger.debug { "symdb: const_source_location(#{child_const_name}) failed: #{e.class}: #{e.message}" }
405
417
  nil
406
418
  end
@@ -416,8 +428,9 @@ module Datadog
416
428
  end
417
429
 
418
430
  fallback
419
- rescue => e
420
- @logger.debug { "symdb: error finding source file for #{safe_mod_name(mod) || '<unknown>'}: #{e.class}: #{e.message}" }
431
+ rescue Exception => e # standard:disable Lint/RescueException
432
+ Datadog::DI.reraise_if_fatal(e)
433
+ @logger.debug { "symdb: error finding source file for #{safe_mod_name(mod) || "<unknown>"}: #{e.class}: #{e.message}" }
421
434
  nil
422
435
  end
423
436
 
@@ -434,7 +447,7 @@ module Datadog
434
447
  lang[:file_hash] = file_hash if file_hash
435
448
 
436
449
  Scope.new(
437
- scope_type: 'FILE',
450
+ scope_type: "FILE",
438
451
  name: file_path,
439
452
  source_file: file_path,
440
453
  start_line: UNKNOWN_MIN_LINE,
@@ -452,8 +465,8 @@ module Datadog
452
465
  source_file = find_source_file(mod)
453
466
 
454
467
  Scope.new(
455
- scope_type: 'MODULE',
456
- name: mod.name,
468
+ scope_type: "MODULE",
469
+ name: safe_mod_name(mod),
457
470
  source_file: source_file,
458
471
  start_line: UNKNOWN_MIN_LINE,
459
472
  end_line: UNKNOWN_MAX_LINE,
@@ -470,8 +483,8 @@ module Datadog
470
483
  source_file = find_source_file(klass)
471
484
 
472
485
  Scope.new(
473
- scope_type: 'CLASS',
474
- name: klass.name,
486
+ scope_type: "CLASS",
487
+ name: safe_mod_name(klass),
475
488
  source_file: source_file,
476
489
  start_line: start_line,
477
490
  end_line: end_line,
@@ -502,8 +515,9 @@ module Datadog
502
515
  return [UNKNOWN_MIN_LINE, UNKNOWN_MAX_LINE] if starts.empty?
503
516
 
504
517
  [starts.min, ends.max]
505
- rescue => e
506
- @logger.debug { "symdb: error calculating line range for #{klass.name}: #{e.class}: #{e.message}" }
518
+ rescue Exception => e # standard:disable Lint/RescueException
519
+ Datadog::DI.reraise_if_fatal(e)
520
+ @logger.debug { "symdb: error calculating line range for #{safe_mod_name(klass)}: #{e.class}: #{e.message}" }
507
521
  [UNKNOWN_MIN_LINE, UNKNOWN_MAX_LINE]
508
522
  end
509
523
 
@@ -517,8 +531,9 @@ module Datadog
517
531
  # Emitted as an array named super_classes — consistent with Java, .NET, and Python.
518
532
  # Array allows for multiple entries if future Ruby versions or mixins expand the chain.
519
533
  # Anonymous superclasses (class Foo < Class.new { ... }) have nil name; compact to skip.
520
- if klass.superclass && klass.superclass != Object && klass.superclass != BasicObject
521
- super_name = klass.superclass.name # steep:ignore
534
+ superclass = CLASS_SUPERCLASS.bind(klass).call
535
+ if superclass && !superclass.equal?(Object) && !superclass.equal?(BasicObject)
536
+ super_name = safe_mod_name(superclass)
522
537
  specifics[:super_classes] = [super_name] if super_name
523
538
  end
524
539
 
@@ -526,7 +541,7 @@ module Datadog
526
541
  # included_modules returns the entire ancestor chain's mixins, not only directly
527
542
  # included ones. This is intentional: the field reports "modules this class
528
543
  # responds to," which is what the consumer (UI navigation, probe context) needs.
529
- included = klass.included_modules.map(&:name).reject do |name|
544
+ included = MODULE_INCLUDED_MODULES.bind(klass).call.map { |m| safe_mod_name(m) }.reject do |name|
530
545
  name.nil? || EXCLUDED_COMMON_MODULES.any? { |prefix| name.start_with?(prefix) }
531
546
  end
532
547
  specifics[:included_modules] = included unless included.empty?
@@ -537,16 +552,17 @@ module Datadog
537
552
  # Single-pass collection avoids the intermediate arrays from take_while.map.compact.
538
553
  # Test coverage: spec/datadog/symbol_database/extractor_spec.rb tests prepend behavior.
539
554
  prepended = []
540
- klass.ancestors.each do |a|
541
- break if a == klass
542
- name = a.name
555
+ MODULE_ANCESTORS.bind(klass).call.each do |a|
556
+ break if a.equal?(klass)
557
+ name = safe_mod_name(a)
543
558
  prepended << name if name
544
559
  end
545
560
  specifics[:prepended_modules] = prepended unless prepended.empty?
546
561
 
547
562
  specifics
548
- rescue => e
549
- @logger.debug { "symdb: error building language specifics for #{klass.name}: #{e.class}: #{e.message}" }
563
+ rescue Exception => e # standard:disable Lint/RescueException
564
+ Datadog::DI.reraise_if_fatal(e)
565
+ @logger.debug { "symdb: error building language specifics for #{safe_mod_name(klass)}: #{e.class}: #{e.message}" }
550
566
  {}
551
567
  end
552
568
 
@@ -568,8 +584,9 @@ module Datadog
568
584
  end
569
585
 
570
586
  scopes
571
- rescue => e
572
- @logger.debug { "symdb: failed to extract methods from #{klass.name}: #{e.class}: #{e.message}" }
587
+ rescue Exception => e # standard:disable Lint/RescueException
588
+ Datadog::DI.reraise_if_fatal(e)
589
+ @logger.debug { "symdb: failed to extract methods from #{safe_mod_name(klass)}: #{e.class}: #{e.message}" }
573
590
  []
574
591
  end
575
592
 
@@ -590,7 +607,7 @@ module Datadog
590
607
  targetable_lines, end_line = extract_targetable_lines(method, line)
591
608
 
592
609
  Scope.new(
593
- scope_type: 'METHOD',
610
+ scope_type: "METHOD",
594
611
  name: method_name.to_s,
595
612
  source_file: source_file,
596
613
  start_line: line,
@@ -603,8 +620,9 @@ module Datadog
603
620
  },
604
621
  symbols: extract_method_parameters(method)
605
622
  )
606
- rescue => e
607
- @logger.debug { "symdb: failed to extract method #{klass.name}##{method_name}: #{e.class}: #{e.message}" }
623
+ rescue Exception => e # standard:disable Lint/RescueException
624
+ Datadog::DI.reraise_if_fatal(e)
625
+ @logger.debug { "symdb: failed to extract method #{safe_mod_name(klass)}##{method_name}: #{e.class}: #{e.message}" }
608
626
  nil
609
627
  end
610
628
 
@@ -614,11 +632,11 @@ module Datadog
614
632
  # @return [String] 'public', 'private', or 'protected'
615
633
  def method_visibility(klass, method_name)
616
634
  if klass.private_instance_methods(false).include?(method_name)
617
- 'private'
635
+ "private"
618
636
  elsif klass.protected_instance_methods(false).include?(method_name)
619
- 'protected'
637
+ "protected"
620
638
  else
621
- 'public'
639
+ "public"
622
640
  end
623
641
  end
624
642
 
@@ -644,7 +662,7 @@ module Datadog
644
662
  end_line = lines.max || start_line
645
663
  ranges = build_targetable_ranges(lines)
646
664
  result = ranges.empty? ? nil : ranges
647
- @logger.debug { "symdb: #{method.name} targetable lines: #{result ? "#{ranges.size} range(s), lines #{lines.first}..#{lines.last}" : 'none (no matching events)'}" }
665
+ @logger.debug { "symdb: #{method.name} targetable lines: #{result ? "#{ranges.size} range(s), lines #{lines.first}..#{lines.last}" : "none (no matching events)"}" }
648
666
  [result, end_line]
649
667
  end
650
668
 
@@ -681,9 +699,10 @@ module Datadog
681
699
  def extract_method_parameters(method)
682
700
  method_name = begin
683
701
  method.name.to_s
684
- rescue => e
702
+ rescue Exception => e # standard:disable Lint/RescueException
703
+ Datadog::DI.reraise_if_fatal(e)
685
704
  @logger.debug { "symdb: method.name failed: #{e.class}: #{e.message}" }
686
- 'unknown'
705
+ "unknown"
687
706
  end
688
707
  params = method.parameters
689
708
 
@@ -698,12 +717,13 @@ module Datadog
698
717
  next if param_name.nil?
699
718
 
700
719
  Symbol.new(
701
- symbol_type: 'ARG',
720
+ symbol_type: "ARG",
702
721
  name: param_name.to_s,
703
722
  line: UNKNOWN_MIN_LINE, # Parameters available in entire method
704
723
  )
705
724
  end
706
- rescue => e
725
+ rescue Exception => e # standard:disable Lint/RescueException
726
+ Datadog::DI.reraise_if_fatal(e)
707
727
  @logger.debug { "symdb: failed to extract parameters from #{method_name}: #{e.class}: #{e.message}" }
708
728
  []
709
729
  end
@@ -743,11 +763,7 @@ module Datadog
743
763
  ObjectSpace.each_object(Module) do |mod|
744
764
  # Singleton classes (per-object metaclasses) are never user-code classes.
745
765
  # They're not const-referenced, DI cannot instrument methods on a singular
746
- # object instance, and on Ruby 2.6 specifically, Module#name on unnamed
747
- # singleton classes with long ancestor chains (e.g. through monkey-patches
748
- # prepended into Kernel, common in dd-trace-rb test processes) is O(ancestors)
749
- # — measured ~20ms per call, which dominates extract_all on heavily-loaded
750
- # processes. Ruby 2.7+ optimized this path; the skip is a no-op there.
766
+ # object instance, so skipping them is both correct and cheap.
751
767
  next if MODULE_SINGLETON_CLASS_PRED.bind(mod).call
752
768
 
753
769
  seen += 1
@@ -772,8 +788,9 @@ module Datadog
772
788
  file_to_names.each do |file_path, method_names|
773
789
  (index[file_path] ||= []) << [mod_name, mod, method_names]
774
790
  end
775
- rescue => e
776
- @logger.debug { "symdb: error indexing #{mod_name || '<unknown>'}: #{e.class}: #{e.message}" }
791
+ rescue Exception => e # standard:disable Lint/RescueException
792
+ Datadog::DI.reraise_if_fatal(e)
793
+ @logger.debug { "symdb: error indexing #{mod_name || "<unknown>"}: #{e.class}: #{e.message}" }
777
794
  end
778
795
 
779
796
  index
@@ -797,13 +814,15 @@ module Datadog
797
814
  next unless user_code_path?(loc[0])
798
815
 
799
816
  result[loc[0]] << method_name
800
- rescue => e
817
+ rescue Exception => e # standard:disable Lint/RescueException
818
+ Datadog::DI.reraise_if_fatal(e)
801
819
  @logger.debug { "symdb: error indexing method #{method_name}: #{e.class}: #{e.message}" }
802
820
  end
803
821
  end
804
822
 
805
823
  result
806
- rescue => e
824
+ rescue Exception => e # standard:disable Lint/RescueException
825
+ Datadog::DI.reraise_if_fatal(e)
807
826
  @logger.debug { "symdb: error indexing methods: #{e.class}: #{e.message}" }
808
827
  {}
809
828
  end
@@ -821,12 +840,12 @@ module Datadog
821
840
  return nil if entries.empty?
822
841
 
823
842
  root = {
824
- name: file_path, type: 'FILE', children: {},
843
+ name: file_path, type: "FILE", children: {},
825
844
  methods: [], mod: nil, source_file: file_path, fqn: nil,
826
845
  }
827
846
 
828
847
  # Sort by FQN depth so parent namespaces are placed before children.
829
- sorted = entries.sort_by { |(mod_name, _, _)| mod_name.count(':') }
848
+ sorted = entries.sort_by { |(mod_name, _, _)| mod_name.count(":") }
830
849
 
831
850
  sorted.each do |mod_name, mod, method_names|
832
851
  # Resolve UnboundMethods for this (mod, file) just-in-time. These objects
@@ -844,7 +863,8 @@ module Datadog
844
863
  loc = method.source_location
845
864
  next nil unless loc && loc[0] == file_path
846
865
  {name: name, method: method, type: :instance}
847
- rescue => e
866
+ rescue Exception => e # standard:disable Lint/RescueException
867
+ Datadog::DI.reraise_if_fatal(e)
848
868
  @logger.debug { "symdb: error resolving #{mod_name}##{name}: #{e.class}: #{e.message}" }
849
869
  nil
850
870
  end
@@ -855,9 +875,10 @@ module Datadog
855
875
  # the module no longer lives in.
856
876
  next if method_names.any? && method_infos.empty?
857
877
 
858
- parts = mod_name.split('::')
878
+ parts = mod_name.split("::")
859
879
  place_in_tree(root, parts, mod, mod_name, method_infos, file_path)
860
- rescue => e
880
+ rescue Exception => e # standard:disable Lint/RescueException
881
+ Datadog::DI.reraise_if_fatal(e)
861
882
  @logger.debug { "symdb: error placing #{mod_name} in tree: #{e.class}: #{e.message}" }
862
883
  end
863
884
 
@@ -880,7 +901,7 @@ module Datadog
880
901
 
881
902
  # Create/find intermediate nodes for each namespace segment except the last
882
903
  name_parts[0..-2].each_with_index do |part, idx| # steep:ignore
883
- fqn = name_parts[0..idx].join('::') # steep:ignore
904
+ fqn = name_parts[0..idx].join("::") # steep:ignore
884
905
  current[:children][part] ||= {
885
906
  name: fqn, type: resolve_scope_type(fqn),
886
907
  children: {}, methods: [], mod: nil,
@@ -895,12 +916,12 @@ module Datadog
895
916
  if leaf
896
917
  # Node exists (was created as intermediate or from another entry).
897
918
  # Update type and mod — the actual module object is authoritative.
898
- leaf[:type] = mod.is_a?(Class) ? 'CLASS' : 'MODULE'
919
+ leaf[:type] = (Class === mod) ? "CLASS" : "MODULE"
899
920
  leaf[:mod] = mod
900
921
  else
901
922
  leaf = {
902
923
  name: mod_name,
903
- type: mod.is_a?(Class) ? 'CLASS' : 'MODULE',
924
+ type: (Class === mod) ? "CLASS" : "MODULE",
904
925
  children: {}, methods: [],
905
926
  mod: mod, source_file: file_path,
906
927
  fqn: mod_name
@@ -917,11 +938,23 @@ module Datadog
917
938
  # @param fqn [String] Fully-qualified name (e.g. "Authentication::Strategies")
918
939
  # @return [String] 'CLASS' or 'MODULE'
919
940
  def resolve_scope_type(fqn)
920
- const = Object.const_get(fqn)
921
- const.is_a?(Class) ? 'CLASS' : 'MODULE'
922
- rescue => e
941
+ current = Object
942
+ fqn.split("::").each do |seg|
943
+ sym = seg.to_sym
944
+ pending_autoload = if RubyVersion.is?(">= 2.7")
945
+ MODULE_AUTOLOAD_P.bind(current).call(sym, false)
946
+ else
947
+ MODULE_AUTOLOAD_P.bind(current).call(sym)
948
+ end
949
+ return "MODULE" if pending_autoload
950
+ return "MODULE" unless MODULE_CONST_DEFINED.bind(current).call(sym, false)
951
+ current = MODULE_CONST_GET.bind(current).call(sym, false)
952
+ end
953
+ (Class === current) ? "CLASS" : "MODULE"
954
+ rescue Exception => e # standard:disable Lint/RescueException
955
+ Datadog::DI.reraise_if_fatal(e)
923
956
  @logger.debug { "symdb: resolve_scope_type(#{fqn}) failed: #{e.class}: #{e.message}, defaulting to MODULE" }
924
- 'MODULE'
957
+ "MODULE"
925
958
  end
926
959
 
927
960
  # Convert a single file tree (built by build_file_scope) to a FILE Scope.
@@ -934,7 +967,7 @@ module Datadog
934
967
  lang[:file_hash] = file_hash if file_hash
935
968
 
936
969
  Scope.new(
937
- scope_type: 'FILE',
970
+ scope_type: "FILE",
938
971
  name: file_path,
939
972
  source_file: file_path,
940
973
  start_line: UNKNOWN_MIN_LINE,
@@ -968,7 +1001,7 @@ module Datadog
968
1001
  symbols = node[:mod] ? extract_scope_symbols(node[:mod]) : []
969
1002
 
970
1003
  # Build language specifics
971
- lang = if node[:type] == 'CLASS' && node[:mod]
1004
+ lang = if node[:type] == "CLASS" && node[:mod]
972
1005
  build_class_language_specifics(node[:mod])
973
1006
  else
974
1007
  {}
@@ -1001,21 +1034,22 @@ module Datadog
1001
1034
  targetable_lines, end_line = extract_targetable_lines(method, line)
1002
1035
 
1003
1036
  Scope.new(
1004
- scope_type: 'METHOD',
1037
+ scope_type: "METHOD",
1005
1038
  name: method_name.to_s,
1006
1039
  source_file: source_file,
1007
1040
  start_line: line,
1008
1041
  end_line: end_line,
1009
1042
  targetable_lines: targetable_lines,
1010
1043
  language_specifics: {
1011
- visibility: klass ? method_visibility(klass, method_name) : 'public', # steep:ignore
1012
- method_type: 'instance',
1044
+ visibility: klass ? method_visibility(klass, method_name) : "public", # steep:ignore
1045
+ method_type: "instance",
1013
1046
  arity: method.arity
1014
1047
  },
1015
1048
  symbols: extract_method_parameters(method)
1016
1049
  )
1017
- rescue => e
1018
- klass_name = klass ? (safe_mod_name(klass) || '<unknown>') : '<unknown>'
1050
+ rescue Exception => e # standard:disable Lint/RescueException
1051
+ Datadog::DI.reraise_if_fatal(e)
1052
+ klass_name = klass ? (safe_mod_name(klass) || "<unknown>") : "<unknown>"
1019
1053
  @logger.debug { "symdb: failed to build method scope #{klass_name}##{method_name}: #{e.class}: #{e.message}" }
1020
1054
  nil
1021
1055
  end
@@ -1028,10 +1062,10 @@ module Datadog
1028
1062
  symbols = []
1029
1063
 
1030
1064
  # Class variables (only for classes)
1031
- if mod.is_a?(Class)
1032
- mod.class_variables(false).each do |var_name|
1065
+ if Class === mod
1066
+ MODULE_CLASS_VARIABLES.bind(mod).call(false).each do |var_name|
1033
1067
  symbols << Symbol.new(
1034
- symbol_type: 'STATIC_FIELD',
1068
+ symbol_type: "STATIC_FIELD",
1035
1069
  name: var_name.to_s,
1036
1070
  line: UNKNOWN_MIN_LINE
1037
1071
  )
@@ -1040,31 +1074,34 @@ module Datadog
1040
1074
 
1041
1075
  # Constants (excluding nested modules/classes).
1042
1076
  # Skip autoloaded constants to avoid triggering loading as a side effect.
1043
- mod.constants(false).each do |const_name|
1044
- next if mod.autoload?(const_name)
1045
- const_value = mod.const_get(const_name)
1046
- next if const_value.is_a?(Module)
1077
+ MODULE_CONSTANTS.bind(mod).call(false).each do |const_name|
1078
+ next if MODULE_AUTOLOAD_P.bind(mod).call(const_name)
1079
+ const_value = MODULE_CONST_GET.bind(mod).call(const_name)
1080
+ next if Module === const_value
1047
1081
 
1048
1082
  symbols << Symbol.new(
1049
- symbol_type: 'STATIC_FIELD',
1083
+ symbol_type: "STATIC_FIELD",
1050
1084
  name: const_name.to_s,
1051
1085
  line: UNKNOWN_MIN_LINE,
1052
- type: const_value.class.name
1086
+ type: safe_mod_name(KERNEL_CLASS.bind(const_value).call)
1053
1087
  )
1054
- rescue NameError, LoadError, NoMethodError => e # standard:disable Lint/ShadowedException
1055
- # Expected: constant removed/undefined, autoload failure, or const value missing
1056
- # #class. Logged separately from unexpected errors so the latter stand out in triage.
1057
- # Lint/ShadowedException disabled: NameError/NoMethodError do descend from
1058
- # StandardError, but Ruby's rescue-clause-order semantics ensure the bare rescue
1059
- # below only catches exceptions not matched here.
1088
+ rescue NameError, LoadError, NoMethodError, TypeError => e # standard:disable Lint/ShadowedException
1089
+ # Expected: constant removed/undefined (NameError), autoload failure (LoadError),
1090
+ # or a value whose class cannot be read (NoMethodError/TypeError). Skipping one
1091
+ # constant here keeps the rest of the module's symbols. Logged separately from
1092
+ # unexpected errors so the latter stand out in triage. Lint/ShadowedException
1093
+ # disabled: these descend from StandardError, but Ruby's rescue-clause-order
1094
+ # semantics ensure the catch-all rescue below only catches exceptions not matched here.
1060
1095
  @logger.debug { "symdb: skipping module constant #{const_name}: #{e.class}: #{e.message}" }
1061
- rescue => e
1096
+ rescue Exception => e # standard:disable Lint/RescueException
1097
+ Datadog::DI.reraise_if_fatal(e)
1062
1098
  @logger.debug { "symdb: unexpected error reading module constant #{const_name}: #{e.class}: #{e.message}" }
1063
1099
  end
1064
1100
 
1065
1101
  symbols
1066
- rescue => e
1067
- mod_name = safe_mod_name(mod) || '<unknown>'
1102
+ rescue Exception => e # standard:disable Lint/RescueException
1103
+ Datadog::DI.reraise_if_fatal(e)
1104
+ mod_name = safe_mod_name(mod) || "<unknown>"
1068
1105
  @logger.debug { "symdb: failed to extract symbols from #{mod_name}: #{e.class}: #{e.message}" }
1069
1106
  []
1070
1107
  end