datadog 2.38.0 → 2.47.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 (922) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +279 -35
  3. data/README.md +3 -0
  4. data/bin/ddprofrb +4 -4
  5. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  6. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +256 -117
  7. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -5
  8. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
  9. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +19 -20
  10. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
  11. data/ext/datadog_profiling_native_extension/collectors_stack.c +267 -171
  12. data/ext/datadog_profiling_native_extension/collectors_stack.h +17 -3
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +307 -217
  14. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +10 -5
  15. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  17. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -10
  18. data/ext/datadog_profiling_native_extension/extconf.rb +68 -100
  19. data/ext/datadog_profiling_native_extension/heap_recorder.c +353 -257
  20. data/ext/datadog_profiling_native_extension/heap_recorder.h +50 -31
  21. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +853 -496
  23. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +42 -15
  24. data/ext/datadog_profiling_native_extension/profiling.c +30 -23
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.c +4 -80
  26. data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -7
  27. data/ext/datadog_profiling_native_extension/stack_recorder.c +116 -89
  28. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -5
  29. data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
  30. data/ext/datadog_profiling_native_extension/time_helpers.h +15 -15
  31. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  32. data/ext/libdatadog_api/datadog_ruby_common.h +7 -10
  33. data/ext/libdatadog_api/di.c +43 -3
  34. data/ext/libdatadog_api/extconf.rb +29 -24
  35. data/ext/libdatadog_api/feature_flags.c +34 -0
  36. data/ext/libdatadog_api/init.c +9 -1
  37. data/ext/libdatadog_api/otel_thread_context.c +274 -0
  38. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  39. data/ext/libdatadog_api/process_discovery.c +15 -1
  40. data/ext/libdatadog_api/trace_exporter.c +2078 -0
  41. data/ext/libdatadog_api/trace_exporter.h +5 -0
  42. data/ext/libdatadog_extconf_helpers.rb +22 -17
  43. data/lib/datadog/ai_guard/component.rb +24 -15
  44. data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
  45. data/lib/datadog/ai_guard/configuration.rb +13 -0
  46. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +48 -55
  47. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
  48. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
  49. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
  50. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
  51. data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
  52. data/lib/datadog/ai_guard/evaluation/content_part.rb +12 -0
  53. data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
  54. data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
  55. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +6 -6
  56. data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
  57. data/lib/datadog/ai_guard/evaluation/request.rb +8 -64
  58. data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
  59. data/lib/datadog/ai_guard/evaluation/result.rb +11 -18
  60. data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
  61. data/lib/datadog/ai_guard/evaluation.rb +36 -14
  62. data/lib/datadog/ai_guard/ext.rb +4 -1
  63. data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +9 -7
  64. data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
  65. data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
  66. data/lib/datadog/ai_guard/redaction/result.rb +29 -0
  67. data/lib/datadog/ai_guard/redaction.rb +80 -0
  68. data/lib/datadog/ai_guard.rb +58 -57
  69. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +22 -43
  70. data/lib/datadog/appsec/actions_handler.rb +6 -6
  71. data/lib/datadog/appsec/anonymizer.rb +1 -1
  72. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +2 -2
  73. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  74. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  75. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +2 -2
  76. data/lib/datadog/appsec/api_security/route_extractor.rb +11 -11
  77. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  78. data/lib/datadog/appsec/api_security.rb +1 -1
  79. data/lib/datadog/appsec/assets/blocked.html +1 -108
  80. data/lib/datadog/appsec/assets.rb +7 -7
  81. data/lib/datadog/appsec/autoload.rb +3 -3
  82. data/lib/datadog/appsec/component.rb +15 -15
  83. data/lib/datadog/appsec/compressed_json.rb +6 -6
  84. data/lib/datadog/appsec/configuration.rb +70 -61
  85. data/lib/datadog/appsec/context.rb +7 -7
  86. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  87. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  88. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  89. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  90. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  91. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  92. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  93. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  94. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  95. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  96. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  97. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  98. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  99. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  100. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  101. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  102. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  103. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +26 -26
  104. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  105. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  106. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +22 -22
  107. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  108. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +2 -2
  109. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  110. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  111. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  112. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  113. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  114. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +14 -18
  115. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  116. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +24 -24
  117. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +6 -6
  118. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  119. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  120. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  121. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +26 -26
  122. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  123. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +10 -10
  124. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +38 -11
  125. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  126. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  127. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  128. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +10 -9
  129. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  130. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  131. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  132. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  133. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +23 -23
  134. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  135. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  136. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +28 -16
  137. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  138. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  139. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +10 -9
  140. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  141. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  142. data/lib/datadog/appsec/event.rb +14 -14
  143. data/lib/datadog/appsec/ext.rb +11 -11
  144. data/lib/datadog/appsec/extensions.rb +2 -2
  145. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  146. data/lib/datadog/appsec/metrics/exporter.rb +8 -8
  147. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  148. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  149. data/lib/datadog/appsec/metrics.rb +4 -4
  150. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  151. data/lib/datadog/appsec/monitor.rb +1 -1
  152. data/lib/datadog/appsec/processor/rule_loader.rb +32 -32
  153. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  154. data/lib/datadog/appsec/remote.rb +6 -6
  155. data/lib/datadog/appsec/response.rb +22 -22
  156. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +11 -11
  157. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +18 -18
  158. data/lib/datadog/appsec/route_normalizer/route_text.rb +3 -3
  159. data/lib/datadog/appsec/route_normalizer.rb +15 -15
  160. data/lib/datadog/appsec/security_engine/engine.rb +41 -40
  161. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  162. data/lib/datadog/appsec/security_event.rb +2 -2
  163. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  164. data/lib/datadog/appsec/utils/http/body_reader.rb +1 -1
  165. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  166. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  167. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  168. data/lib/datadog/appsec.rb +16 -16
  169. data/lib/datadog/auto_instrument.rb +2 -2
  170. data/lib/datadog/core/buffer/cruby.rb +1 -1
  171. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  172. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  173. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  174. data/lib/datadog/core/configuration/base.rb +2 -2
  175. data/lib/datadog/core/configuration/components.rb +82 -47
  176. data/lib/datadog/core/configuration/components_state.rb +8 -1
  177. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  178. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  179. data/lib/datadog/core/configuration/ext.rb +11 -11
  180. data/lib/datadog/core/configuration/option.rb +16 -16
  181. data/lib/datadog/core/configuration/option_definition.rb +5 -5
  182. data/lib/datadog/core/configuration/options.rb +2 -2
  183. data/lib/datadog/core/configuration/settings.rb +95 -100
  184. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  185. data/lib/datadog/core/configuration/supported_configurations.rb +20 -3
  186. data/lib/datadog/core/configuration.rb +8 -8
  187. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  188. data/lib/datadog/core/crashtracking/component.rb +14 -10
  189. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  190. data/lib/datadog/core/deprecations.rb +1 -1
  191. data/lib/datadog/core/diagnostics/environment_logger.rb +42 -7
  192. data/lib/datadog/core/diagnostics/health.rb +2 -2
  193. data/lib/datadog/core/encoding.rb +4 -4
  194. data/lib/datadog/core/environment/agent_info.rb +2 -2
  195. data/lib/datadog/core/environment/cgroup.rb +4 -4
  196. data/lib/datadog/core/environment/container.rb +9 -9
  197. data/lib/datadog/core/environment/execution.rb +3 -3
  198. data/lib/datadog/core/environment/ext.rb +18 -18
  199. data/lib/datadog/core/environment/gc.rb +1 -1
  200. data/lib/datadog/core/environment/git.rb +2 -2
  201. data/lib/datadog/core/environment/identity.rb +10 -10
  202. data/lib/datadog/core/environment/platform.rb +8 -8
  203. data/lib/datadog/core/environment/process.rb +3 -3
  204. data/lib/datadog/core/environment/socket.rb +2 -2
  205. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  206. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  207. data/lib/datadog/core/environment/yjit.rb +2 -2
  208. data/lib/datadog/core/error.rb +5 -5
  209. data/lib/datadog/core/evp.rb +2 -2
  210. data/lib/datadog/core/extensions.rb +1 -1
  211. data/lib/datadog/core/feature_flags.rb +2 -2
  212. data/lib/datadog/core/git/ext.rb +4 -4
  213. data/lib/datadog/core/logger.rb +3 -3
  214. data/lib/datadog/core/logging/ext.rb +1 -1
  215. data/lib/datadog/core/metrics/client.rb +20 -20
  216. data/lib/datadog/core/metrics/ext.rb +5 -5
  217. data/lib/datadog/core/metrics/helpers.rb +1 -1
  218. data/lib/datadog/core/metrics/logging.rb +2 -2
  219. data/lib/datadog/core/metrics/options.rb +5 -5
  220. data/lib/datadog/core/pin.rb +1 -1
  221. data/lib/datadog/core/process_discovery.rb +13 -9
  222. data/lib/datadog/core/rate_limiter.rb +1 -1
  223. data/lib/datadog/core/remote/client/capabilities.rb +60 -33
  224. data/lib/datadog/core/remote/client.rb +61 -20
  225. data/lib/datadog/core/remote/component.rb +48 -17
  226. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  227. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  228. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  229. data/lib/datadog/core/remote/configuration/repository.rb +4 -4
  230. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  231. data/lib/datadog/core/remote/configuration.rb +4 -4
  232. data/lib/datadog/core/remote/dispatcher.rb +47 -6
  233. data/lib/datadog/core/remote/ext.rb +3 -3
  234. data/lib/datadog/core/remote/negotiation.rb +1 -1
  235. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  236. data/lib/datadog/core/remote/transport/config.rb +4 -4
  237. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  238. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  239. data/lib/datadog/core/remote/transport/http.rb +10 -10
  240. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  241. data/lib/datadog/core/remote/worker.rb +13 -5
  242. data/lib/datadog/core/runtime/ext.rb +22 -22
  243. data/lib/datadog/core/runtime/metrics.rb +9 -9
  244. data/lib/datadog/core/tag_builder.rb +18 -18
  245. data/lib/datadog/core/tag_normalizer.rb +7 -7
  246. data/lib/datadog/core/telemetry/component.rb +13 -13
  247. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  248. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  249. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +8 -6
  250. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  251. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  252. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +3 -3
  253. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  254. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  255. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  256. data/lib/datadog/core/telemetry/event/app_started.rb +36 -55
  257. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  258. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  259. data/lib/datadog/core/telemetry/event/generate_metrics.rb +3 -3
  260. data/lib/datadog/core/telemetry/event/log.rb +6 -6
  261. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  262. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  263. data/lib/datadog/core/telemetry/event.rb +16 -16
  264. data/lib/datadog/core/telemetry/ext.rb +11 -11
  265. data/lib/datadog/core/telemetry/logger.rb +1 -1
  266. data/lib/datadog/core/telemetry/logging.rb +5 -5
  267. data/lib/datadog/core/telemetry/metric.rb +9 -9
  268. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  269. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  270. data/lib/datadog/core/telemetry/request.rb +6 -6
  271. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  272. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  273. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  274. data/lib/datadog/core/telemetry/worker.rb +6 -6
  275. data/lib/datadog/core/transport/ext.rb +14 -14
  276. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  277. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  278. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  279. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  280. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  281. data/lib/datadog/core/transport/http/builder.rb +5 -5
  282. data/lib/datadog/core/transport/http/client.rb +2 -2
  283. data/lib/datadog/core/transport/http/response.rb +1 -1
  284. data/lib/datadog/core/transport/http.rb +9 -9
  285. data/lib/datadog/core/transport/transport.rb +2 -2
  286. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +172 -20
  287. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  288. data/lib/datadog/core/utils/duration.rb +1 -1
  289. data/lib/datadog/core/utils/forking.rb +2 -2
  290. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  291. data/lib/datadog/core/utils/network.rb +11 -11
  292. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  293. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  294. data/lib/datadog/core/utils/sequence.rb +3 -6
  295. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  296. data/lib/datadog/core/utils/time.rb +16 -54
  297. data/lib/datadog/core/utils/url.rb +1 -1
  298. data/lib/datadog/core/utils.rb +4 -4
  299. data/lib/datadog/core/workers/async.rb +1 -1
  300. data/lib/datadog/core/workers/polling.rb +2 -2
  301. data/lib/datadog/core/workers/runtime_metrics.rb +5 -5
  302. data/lib/datadog/core.rb +4 -4
  303. data/lib/datadog/data_streams/configuration.rb +3 -3
  304. data/lib/datadog/data_streams/ext.rb +1 -1
  305. data/lib/datadog/data_streams/extensions.rb +2 -2
  306. data/lib/datadog/data_streams/pathway_context.rb +25 -27
  307. data/lib/datadog/data_streams/processor.rb +92 -61
  308. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  309. data/lib/datadog/data_streams/transport/http.rb +5 -5
  310. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  311. data/lib/datadog/data_streams.rb +5 -5
  312. data/lib/datadog/di/base.rb +4 -4
  313. data/lib/datadog/di/boot.rb +26 -25
  314. data/lib/datadog/di/capture_expression_evaluator/result.rb +30 -0
  315. data/lib/datadog/di/capture_expression_evaluator.rb +39 -9
  316. data/lib/datadog/di/code_tracker.rb +6 -6
  317. data/lib/datadog/di/component.rb +119 -6
  318. data/lib/datadog/di/configuration.rb +54 -3
  319. data/lib/datadog/di/context.rb +7 -2
  320. data/lib/datadog/di/contrib/active_record.rb +8 -2
  321. data/lib/datadog/di/contrib/railtie.rb +1 -1
  322. data/lib/datadog/di/contrib.rb +5 -5
  323. data/lib/datadog/di/el/compiler.rb +113 -37
  324. data/lib/datadog/di/el/evaluator.rb +82 -2
  325. data/lib/datadog/di/el/expression.rb +13 -2
  326. data/lib/datadog/di/el.rb +3 -3
  327. data/lib/datadog/di/evaluation_failure.rb +28 -0
  328. data/lib/datadog/di/guardrails_telemetry/reason.rb +87 -0
  329. data/lib/datadog/di/guardrails_telemetry.rb +203 -0
  330. data/lib/datadog/di/instrumenter.rb +124 -23
  331. data/lib/datadog/di/logger.rb +32 -10
  332. data/lib/datadog/di/preload.rb +1 -1
  333. data/lib/datadog/di/probe.rb +9 -1
  334. data/lib/datadog/di/probe_builder.rb +25 -24
  335. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  336. data/lib/datadog/di/probe_file_loader.rb +5 -5
  337. data/lib/datadog/di/probe_manager.rb +57 -9
  338. data/lib/datadog/di/probe_notification_builder.rb +46 -43
  339. data/lib/datadog/di/probe_notifier_worker.rb +62 -12
  340. data/lib/datadog/di/probe_repository.rb +1 -1
  341. data/lib/datadog/di/proc_responder.rb +1 -1
  342. data/lib/datadog/di/remote.rb +52 -8
  343. data/lib/datadog/di/serializer.rb +185 -68
  344. data/lib/datadog/di/snapshot_event.rb +38 -0
  345. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  346. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  347. data/lib/datadog/di/transport/http/input.rb +2 -2
  348. data/lib/datadog/di/transport/http.rb +23 -13
  349. data/lib/datadog/di/transport/input.rb +41 -16
  350. data/lib/datadog/di/utils.rb +4 -4
  351. data/lib/datadog/di.rb +5 -5
  352. data/lib/datadog/error_tracking/collector.rb +2 -2
  353. data/lib/datadog/error_tracking/component.rb +12 -12
  354. data/lib/datadog/error_tracking/configuration.rb +2 -2
  355. data/lib/datadog/error_tracking/ext.rb +7 -7
  356. data/lib/datadog/error_tracking/extensions.rb +2 -2
  357. data/lib/datadog/error_tracking/filters.rb +4 -4
  358. data/lib/datadog/error_tracking.rb +6 -6
  359. data/lib/datadog/kit/appsec/events/v2.rb +40 -40
  360. data/lib/datadog/kit/appsec/events.rb +25 -25
  361. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  362. data/lib/datadog/kit/identity.rb +18 -18
  363. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  364. data/lib/datadog/kit.rb +1 -1
  365. data/lib/datadog/open_feature/activation.rb +268 -0
  366. data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
  367. data/lib/datadog/open_feature/agentless/parser.rb +43 -0
  368. data/lib/datadog/open_feature/agentless/response.rb +19 -0
  369. data/lib/datadog/open_feature/agentless/transport.rb +103 -0
  370. data/lib/datadog/open_feature/component.rb +112 -31
  371. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
  372. data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
  373. data/lib/datadog/open_feature/configuration/source.rb +43 -0
  374. data/lib/datadog/open_feature/configuration.rb +139 -2
  375. data/lib/datadog/open_feature/evaluation_engine.rb +36 -10
  376. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  377. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  378. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  379. data/lib/datadog/open_feature/exposures/event.rb +17 -10
  380. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  381. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  382. data/lib/datadog/open_feature/ext.rb +32 -8
  383. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +242 -86
  384. data/lib/datadog/open_feature/flag_evaluation/writer.rb +211 -100
  385. data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
  386. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +28 -24
  387. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +3 -1
  388. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  389. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  390. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  391. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  392. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  393. data/lib/datadog/open_feature/native_evaluator.rb +24 -10
  394. data/lib/datadog/open_feature/noop_evaluator.rb +8 -3
  395. data/lib/datadog/open_feature/provider.rb +357 -17
  396. data/lib/datadog/open_feature/remote.rb +7 -7
  397. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  398. data/lib/datadog/open_feature/transport.rb +19 -14
  399. data/lib/datadog/open_feature.rb +33 -3
  400. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  401. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  402. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  403. data/lib/datadog/opentelemetry/ext.rb +1 -1
  404. data/lib/datadog/opentelemetry/logs.rb +5 -5
  405. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  406. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  407. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  408. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +6 -6
  409. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -5
  410. data/lib/datadog/opentelemetry/sdk/propagator.rb +8 -8
  411. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  412. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  413. data/lib/datadog/opentelemetry/sdk.rb +2 -2
  414. data/lib/datadog/opentelemetry/signal_configuration.rb +20 -16
  415. data/lib/datadog/opentelemetry/trace.rb +4 -1
  416. data/lib/datadog/opentelemetry.rb +8 -8
  417. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +10 -2
  418. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -7
  419. data/lib/datadog/profiling/collectors/info.rb +40 -13
  420. data/lib/datadog/profiling/collectors/thread_context.rb +6 -17
  421. data/lib/datadog/profiling/component.rb +33 -39
  422. data/lib/datadog/profiling/exporter.rb +11 -11
  423. data/lib/datadog/profiling/http_transport.rb +1 -1
  424. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  425. data/lib/datadog/profiling/tag_builder.rb +19 -19
  426. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  427. data/lib/datadog/profiling.rb +31 -27
  428. data/lib/datadog/single_step_instrument.rb +1 -1
  429. data/lib/datadog/symbol_database/component.rb +15 -15
  430. data/lib/datadog/symbol_database/configuration.rb +3 -3
  431. data/lib/datadog/symbol_database/extensions.rb +2 -2
  432. data/lib/datadog/symbol_database/extractor.rb +141 -159
  433. data/lib/datadog/symbol_database/file_hash.rb +3 -3
  434. data/lib/datadog/symbol_database/logger.rb +1 -1
  435. data/lib/datadog/symbol_database/remote.rb +21 -6
  436. data/lib/datadog/symbol_database/scope.rb +2 -2
  437. data/lib/datadog/symbol_database/scope_batcher.rb +2 -2
  438. data/lib/datadog/symbol_database/service_version.rb +4 -4
  439. data/lib/datadog/symbol_database/symbol.rb +1 -1
  440. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  441. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  442. data/lib/datadog/symbol_database/transport.rb +4 -4
  443. data/lib/datadog/symbol_database/uploader.rb +22 -22
  444. data/lib/datadog/symbol_database.rb +2 -2
  445. data/lib/datadog/tracing/analytics.rb +1 -1
  446. data/lib/datadog/tracing/buffer.rb +5 -5
  447. data/lib/datadog/tracing/client_ip.rb +4 -4
  448. data/lib/datadog/tracing/component.rb +51 -9
  449. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  450. data/lib/datadog/tracing/configuration/dynamic.rb +13 -11
  451. data/lib/datadog/tracing/configuration/ext.rb +46 -42
  452. data/lib/datadog/tracing/configuration/http.rb +2 -2
  453. data/lib/datadog/tracing/configuration/settings.rb +52 -16
  454. data/lib/datadog/tracing/context.rb +25 -3
  455. data/lib/datadog/tracing/context_provider.rb +19 -7
  456. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  457. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  458. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  459. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  460. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  461. data/lib/datadog/tracing/contrib/action_cable/events.rb +5 -5
  462. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  463. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  464. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  465. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  466. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  467. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  468. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  469. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  470. data/lib/datadog/tracing/contrib/action_mailer/events.rb +3 -3
  471. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  472. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  473. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  474. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +9 -9
  475. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  476. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  477. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  478. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  479. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  480. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  481. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  482. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  483. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  484. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  485. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  486. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  487. data/lib/datadog/tracing/contrib/action_view/events.rb +3 -3
  488. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  489. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  490. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  491. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  492. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  493. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +2 -2
  494. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  495. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  496. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  497. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  498. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  499. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  500. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  501. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  502. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  503. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  504. data/lib/datadog/tracing/contrib/active_job/patcher.rb +7 -7
  505. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  506. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  507. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  508. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +6 -6
  509. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +3 -3
  510. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  511. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  512. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  513. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  514. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +7 -7
  515. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  516. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  517. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  518. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +10 -9
  519. data/lib/datadog/tracing/contrib/active_record/events.rb +3 -3
  520. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  521. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  522. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  523. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  524. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  525. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +12 -12
  526. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  527. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  528. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  529. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  530. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  531. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  532. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  533. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  534. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  535. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  536. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  538. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  539. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  540. data/lib/datadog/tracing/contrib/aws/ext.rb +26 -26
  541. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  542. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  543. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  544. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  545. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  546. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  547. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  548. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  549. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  550. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  551. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  552. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  553. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  554. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  555. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  556. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  557. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  558. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  559. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  560. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  561. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  562. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  563. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  564. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  565. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  566. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  567. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  568. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  569. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  570. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  571. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  572. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  573. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  574. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  575. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  576. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  577. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  578. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  579. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +3 -3
  580. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  581. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +18 -13
  582. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  583. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  584. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  585. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  586. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  587. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  588. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  589. data/lib/datadog/tracing/contrib/excon/middleware.rb +17 -10
  590. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  591. data/lib/datadog/tracing/contrib/ext.rb +18 -18
  592. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  593. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  594. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  595. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  596. data/lib/datadog/tracing/contrib/faraday/middleware.rb +17 -11
  597. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  598. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  599. data/lib/datadog/tracing/contrib/grape/endpoint.rb +51 -24
  600. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  601. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  602. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  603. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  604. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  605. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  606. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  607. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  608. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  609. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  610. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  611. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  612. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
  613. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +8 -8
  614. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  615. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  616. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -9
  617. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  618. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  619. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  620. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  621. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  622. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  623. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  624. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  625. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  626. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  627. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  628. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  629. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  630. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  631. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  632. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  633. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  634. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  635. data/lib/datadog/tracing/contrib/http/instrumentation.rb +22 -7
  636. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  637. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  638. data/lib/datadog/tracing/contrib/http.rb +6 -6
  639. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  640. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  641. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +13 -7
  642. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  643. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  644. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  645. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  646. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +16 -10
  647. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  648. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  649. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  650. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  651. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  652. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  653. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  654. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  655. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  656. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  657. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  658. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  659. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  660. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  661. data/lib/datadog/tracing/contrib/kafka/events.rb +10 -10
  662. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  663. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  664. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  665. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  666. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  667. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  668. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +9 -9
  669. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  670. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  671. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  672. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  673. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  674. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  675. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  676. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  677. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  678. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  679. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  680. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  681. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  682. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  683. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  684. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  685. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  686. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  687. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  688. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  689. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  690. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  691. data/lib/datadog/tracing/contrib/opensearch/ext.rb +23 -23
  692. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  693. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  694. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +4 -4
  695. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  696. data/lib/datadog/tracing/contrib/patcher.rb +3 -3
  697. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  698. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  699. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +6 -6
  700. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  701. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  702. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  703. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  704. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  705. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  706. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  707. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  708. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  709. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  710. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  711. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  712. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  713. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  714. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  715. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -2
  716. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  717. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  718. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  719. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  720. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  721. data/lib/datadog/tracing/contrib/racecar/events.rb +4 -4
  722. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  723. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  724. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  725. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +3 -3
  726. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  727. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  728. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  729. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  730. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  731. data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -3
  732. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  733. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  734. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +16 -16
  735. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  736. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  737. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  738. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  739. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  740. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  741. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  742. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  743. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  744. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  745. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  746. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  747. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  748. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  749. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +3 -3
  750. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  751. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  752. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  753. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  754. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  755. data/lib/datadog/tracing/contrib/redis/quantize.rb +39 -5
  756. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  757. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +14 -8
  758. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  759. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  760. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  761. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  762. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  763. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  764. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  765. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  766. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  767. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +15 -8
  768. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  769. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  770. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  771. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  772. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  773. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  774. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  775. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  776. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  777. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  778. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  779. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  780. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  781. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  782. data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
  783. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  784. data/lib/datadog/tracing/contrib/sequel/utils.rb +101 -9
  785. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  786. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  787. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  788. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  789. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  790. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  791. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  792. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +10 -10
  793. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  794. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  795. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  796. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +13 -13
  797. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  798. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  799. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +3 -3
  800. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  801. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  802. data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
  803. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  804. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  805. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  806. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  807. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  808. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  809. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  810. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  811. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -4
  812. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  813. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  814. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  815. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  816. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  817. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  818. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  819. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  820. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  821. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  822. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  823. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  824. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  825. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  826. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  827. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  828. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  829. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  830. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  831. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  832. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +2 -2
  833. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +118 -13
  834. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  835. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +9 -9
  836. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  837. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  838. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  839. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  840. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  841. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  842. data/lib/datadog/tracing/contrib.rb +54 -54
  843. data/lib/datadog/tracing/correlation.rb +12 -12
  844. data/lib/datadog/tracing/diagnostics/environment_logger.rb +12 -11
  845. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  846. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  847. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  848. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  849. data/lib/datadog/tracing/distributed/baggage.rb +27 -29
  850. data/lib/datadog/tracing/distributed/datadog.rb +23 -23
  851. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  852. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  853. data/lib/datadog/tracing/distributed/propagation.rb +15 -12
  854. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  855. data/lib/datadog/tracing/distributed/trace_context.rb +21 -278
  856. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  857. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  858. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  859. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  860. data/lib/datadog/tracing/event.rb +1 -1
  861. data/lib/datadog/tracing/ext.rb +1 -1
  862. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  863. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  864. data/lib/datadog/tracing/metadata/ext.rb +72 -69
  865. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  866. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  867. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  868. data/lib/datadog/tracing/metadata.rb +4 -4
  869. data/lib/datadog/tracing/otel_thread_context.rb +97 -0
  870. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  871. data/lib/datadog/tracing/pipeline.rb +2 -2
  872. data/lib/datadog/tracing/remote.rb +250 -44
  873. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  874. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  875. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  876. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  877. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  878. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  879. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  880. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  881. data/lib/datadog/tracing/sampling/rule_sampler.rb +14 -12
  882. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  883. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  884. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  885. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  886. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  887. data/lib/datadog/tracing/span.rb +9 -9
  888. data/lib/datadog/tracing/span_event.rb +5 -5
  889. data/lib/datadog/tracing/span_operation.rb +22 -22
  890. data/lib/datadog/tracing/sync_writer.rb +12 -7
  891. data/lib/datadog/tracing/trace_digest.rb +22 -4
  892. data/lib/datadog/tracing/trace_operation.rb +33 -21
  893. data/lib/datadog/tracing/trace_segment.rb +10 -10
  894. data/lib/datadog/tracing/tracer.rb +43 -22
  895. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  896. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  897. data/lib/datadog/tracing/transport/http/telemetry.rb +94 -0
  898. data/lib/datadog/tracing/transport/http/traces.rb +10 -8
  899. data/lib/datadog/tracing/transport/http.rb +10 -10
  900. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  901. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  902. data/lib/datadog/tracing/transport/io/traces.rb +5 -5
  903. data/lib/datadog/tracing/transport/io.rb +3 -3
  904. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  905. data/lib/datadog/tracing/transport/native/telemetry.rb +17 -0
  906. data/lib/datadog/tracing/transport/native.rb +395 -0
  907. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  908. data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
  909. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  910. data/lib/datadog/tracing/transport/telemetry.rb +62 -0
  911. data/lib/datadog/tracing/transport/trace_formatter.rb +23 -13
  912. data/lib/datadog/tracing/transport/traces.rb +93 -46
  913. data/lib/datadog/tracing/utils.rb +2 -2
  914. data/lib/datadog/tracing/workers.rb +2 -2
  915. data/lib/datadog/tracing/writer.rb +22 -9
  916. data/lib/datadog/tracing.rb +3 -3
  917. data/lib/datadog/version.rb +4 -4
  918. data/lib/datadog.rb +13 -13
  919. metadata +55 -13
  920. data/lib/datadog/ai_guard/evaluation/content_builder.rb +0 -31
  921. data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
  922. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
@@ -1,10 +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'
7
- require_relative '../di/fatal_exceptions'
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"
8
8
 
9
9
  module Datadog
10
10
  module SymbolDatabase
@@ -43,7 +43,7 @@ module Datadog
43
43
  # These are expected failures — no logging needed.
44
44
  #
45
45
  # 2. **Method-level rescues** (`rescue => e` with logging):
46
- # Catch failures in extract_method_scope, find_source_file, etc. Log at debug
46
+ # Catch failures in build_class_method_scopes, find_source_file, etc. Log at debug
47
47
  # for post-hoc diagnosis, return nil or empty array. One bad method/module
48
48
  # doesn't kill the entire class extraction.
49
49
  #
@@ -68,7 +68,7 @@ module Datadog
68
68
  # PostgreSQL signed INT_MAX (2^31 - 1). Means "entire file" or "unknown end."
69
69
  UNKNOWN_MAX_LINE = 2147483647
70
70
 
71
- EXCLUDED_COMMON_MODULES = ['Kernel', 'PP::', 'JSON::', 'Enumerable', 'Comparable'].freeze
71
+ EXCLUDED_COMMON_MODULES = ["Kernel", "PP::", "JSON::", "Enumerable", "Comparable"].freeze
72
72
 
73
73
  # RubyVM::InstructionSequence#trace_points event types included when
74
74
  # computing targetable lines on METHOD scopes.
@@ -133,22 +133,22 @@ module Datadog
133
133
  return nil unless Module === mod
134
134
  mod_name = safe_mod_name(mod)
135
135
  return nil unless mod_name
136
-
137
- return nil unless user_code_module?(mod)
136
+ return nil unless user_code_module_name?(mod)
138
137
 
139
138
  source_file = find_source_file(mod)
140
139
  return nil unless source_file
140
+ return nil unless user_code_path?(source_file)
141
141
 
142
142
  inner_scope = if Class === mod
143
- extract_class_scope(mod)
143
+ extract_class_scope(mod, source_file)
144
144
  else
145
- extract_module_scope(mod)
145
+ extract_module_scope(mod, source_file)
146
146
  end
147
147
 
148
148
  wrap_in_file_scope(source_file, [inner_scope])
149
149
  rescue Exception => e # standard:disable Lint/RescueException
150
150
  Datadog::DI.reraise_if_fatal(e)
151
- @logger.debug { "symdb: failed to extract #{mod_name || '<unknown>'}: #{e.class}: #{e.message}" }
151
+ @logger.debug { "symdb: failed to extract #{mod_name || "<unknown>"}: #{e.class}: #{e.message}" }
152
152
  nil
153
153
  end
154
154
 
@@ -261,7 +261,7 @@ module Datadog
261
261
  # @return [Boolean]
262
262
  def resolves_to_same_module?(mod_name, mod)
263
263
  current = Object
264
- mod_name.split('::').each do |seg|
264
+ mod_name.split("::").each do |seg|
265
265
  sym = seg.to_sym
266
266
  return false if MODULE_AUTOLOAD_P.bind(current).call(sym, false)
267
267
  return false unless MODULE_CONST_DEFINED.bind(current).call(sym, false)
@@ -275,10 +275,12 @@ module Datadog
275
275
  false
276
276
  end
277
277
 
278
- # Check if module is from user code (not gems or stdlib)
279
- # @param mod [Module] The module to check
280
- # @return [Boolean] true if user code
281
- def user_code_module?(mod)
278
+ # Return whether +mod+ passes the name-based user-code exclusions
279
+ # (named, outside Datadog, not a Ruby root class). Does not resolve
280
+ # a source file.
281
+ # @param mod [Module]
282
+ # @return [Boolean]
283
+ def user_code_module_name?(mod)
282
284
  mod_name = safe_mod_name(mod)
283
285
  return false unless mod_name
284
286
 
@@ -287,7 +289,7 @@ module Datadog
287
289
  # Matches Python: packages.is_user_code() excludes ddtrace.*
288
290
  # Note: bare 'Datadog' must be checked separately — start_with?('Datadog::')
289
291
  # doesn't match the root module itself.
290
- return false if mod_name == 'Datadog' || mod_name.start_with?('Datadog::')
292
+ return false if mod_name == "Datadog" || mod_name.start_with?("Datadog::")
291
293
 
292
294
  # Exclude Ruby root classes. These are never user code, but
293
295
  # find_source_file can return a user-code path for them via
@@ -297,6 +299,15 @@ module Datadog
297
299
  return false if mod.equal?(Object) || mod.equal?(BasicObject) ||
298
300
  mod.equal?(Kernel) || mod.equal?(Module) || mod.equal?(Class)
299
301
 
302
+ true
303
+ end
304
+
305
+ # Check if module is from user code (not gems or stdlib)
306
+ # @param mod [Module] The module to check
307
+ # @return [Boolean] true if user code
308
+ def user_code_module?(mod)
309
+ return false unless user_code_module_name?(mod)
310
+
300
311
  source_file = find_source_file(mod)
301
312
  return false unless source_file
302
313
 
@@ -309,28 +320,47 @@ module Datadog
309
320
  def user_code_path?(path)
310
321
  # Only absolute paths are real source files. Pseudo-paths like '<main>',
311
322
  # '<internal:...>', '(eval)' are not user code.
312
- return false unless path.start_with?('/')
323
+ return false unless path.start_with?("/")
313
324
  # Only .rb files are Ruby source. Excludes the Ruby binary
314
325
  # (/usr/local/bin/ruby), C extensions (.so/.bundle), and other
315
326
  # non-source files that appear in method source_location.
316
- return false unless path.end_with?('.rb')
327
+ return false unless path.end_with?(".rb")
317
328
  # Exclude gem paths
318
- return false if path.include?('/gems/')
329
+ return false if path.include?("/gems/")
319
330
  # Exclude Ruby stdlib
320
- return false if path.include?('/ruby/')
321
- return false if path.start_with?('<internal:')
322
- return false if path.include?('(eval)')
331
+ return false if path.include?("/ruby/")
332
+ return false if path.start_with?("<internal:")
333
+ return false if path.include?("(eval)")
323
334
  # Exclude test code (not application code)
324
- return false if path.include?('/spec/')
325
- return false if path.include?('/test/')
335
+ return false if path.include?("/spec/")
336
+ return false if path.include?("/test/")
326
337
  # Exclude Datadog's own library code (e.g., monkey-patched methods from tracing contrib).
327
338
  # Without this, stdlib classes like Net::HTTP appear as user code when dd-trace-rb
328
339
  # instruments them, because the patched method source points to lib/datadog/tracing/contrib/.
329
- return false if path.include?('/lib/datadog/')
340
+ return false if path.include?("/lib/datadog/")
330
341
 
331
342
  true
332
343
  end
333
344
 
345
+ # Resolve the UnboundMethod +mod+ itself declares for +method_name+,
346
+ # skipping prepended wrapper modules (e.g. a DI method-logpoint wrapper)
347
+ # that shadow it.
348
+ #
349
+ # @param mod [Module] Module or class expected to declare the method
350
+ # @param method_name [Symbol] Name of the method to resolve
351
+ # @return [UnboundMethod] Method whose owner is +mod+, or the
352
+ # prepend-resolved method when +mod+ owns no method in the super chain
353
+ def declared_instance_method(mod, method_name)
354
+ original_method = mod.instance_method(method_name)
355
+ method = original_method
356
+ until method.owner.equal?(mod)
357
+ super_method = method.super_method
358
+ return original_method unless super_method
359
+ method = super_method
360
+ end
361
+ method
362
+ end
363
+
334
364
  # Find source file for a module.
335
365
  # Prefers user code paths over gem/stdlib paths. ActiveRecord models have
336
366
  # generated methods (autosave callbacks) whose source is in the gem, but
@@ -349,7 +379,7 @@ module Datadog
349
379
 
350
380
  # Try instance methods first
351
381
  mod.instance_methods(false).each do |method_name|
352
- method = mod.instance_method(method_name)
382
+ method = declared_instance_method(mod, method_name)
353
383
  location = method.source_location
354
384
  next unless location
355
385
 
@@ -357,10 +387,15 @@ module Datadog
357
387
  return path if user_code_path?(path)
358
388
 
359
389
  fallback ||= path # steep:ignore
390
+ rescue Exception => e # standard:disable Lint/RescueException
391
+ Datadog::DI.reraise_if_fatal(e)
392
+ @logger.debug { "symdb: error resolving #{safe_mod_name(mod)}##{method_name}: #{e.class}: #{e.message}" }
360
393
  end
361
394
 
362
395
  # Try singleton methods
363
396
  mod.singleton_methods(false).each do |method_name|
397
+ # Method-logpoint probes prepend instance methods only, so singleton
398
+ # methods are never shadowed by a DI wrapper.
364
399
  method = mod.method(method_name)
365
400
  location = method.source_location
366
401
  next unless location
@@ -369,6 +404,9 @@ module Datadog
369
404
  return path if user_code_path?(path)
370
405
 
371
406
  fallback ||= path # steep:ignore
407
+ rescue Exception => e # standard:disable Lint/RescueException
408
+ Datadog::DI.reraise_if_fatal(e)
409
+ @logger.debug { "symdb: error resolving #{safe_mod_name(mod)}.#{method_name}: #{e.class}: #{e.message}" }
372
410
  end
373
411
 
374
412
  # Use const_source_location to find where this class/module is declared.
@@ -379,11 +417,11 @@ module Datadog
379
417
  mod_name = safe_mod_name(mod)
380
418
  if mod_name
381
419
  # Look up the class/module by its last name component in its enclosing namespace.
382
- parts = mod_name.split('::')
420
+ parts = mod_name.split("::")
383
421
  const_name = parts.last
384
422
  namespace = if parts.length > 1
385
423
  begin
386
- MODULE_CONST_GET.bind(Object).call(parts[0..-2].join('::')) # steep:ignore
424
+ MODULE_CONST_GET.bind(Object).call(parts[0..-2].join("::")) # steep:ignore
387
425
  rescue NameError
388
426
  nil
389
427
  end
@@ -430,7 +468,7 @@ module Datadog
430
468
  fallback
431
469
  rescue Exception => e # standard:disable Lint/RescueException
432
470
  Datadog::DI.reraise_if_fatal(e)
433
- @logger.debug { "symdb: error finding source file for #{safe_mod_name(mod) || '<unknown>'}: #{e.class}: #{e.message}" }
471
+ @logger.debug { "symdb: error finding source file for #{safe_mod_name(mod) || "<unknown>"}: #{e.class}: #{e.message}" }
434
472
  nil
435
473
  end
436
474
 
@@ -447,7 +485,7 @@ module Datadog
447
485
  lang[:file_hash] = file_hash if file_hash
448
486
 
449
487
  Scope.new(
450
- scope_type: 'FILE',
488
+ scope_type: "FILE",
451
489
  name: file_path,
452
490
  source_file: file_path,
453
491
  start_line: UNKNOWN_MIN_LINE,
@@ -460,12 +498,11 @@ module Datadog
460
498
  # Extract MODULE scope (without file_hash — that belongs on the FILE root scope).
461
499
  # Does not include nested classes — nesting is handled by extract_all via FQN splitting.
462
500
  # @param mod [Module] The module
501
+ # @param source_file [String] Source file resolved by the caller
463
502
  # @return [Scope] The module scope
464
- def extract_module_scope(mod)
465
- source_file = find_source_file(mod)
466
-
503
+ def extract_module_scope(mod, source_file)
467
504
  Scope.new(
468
- scope_type: 'MODULE',
505
+ scope_type: "MODULE",
469
506
  name: safe_mod_name(mod),
470
507
  source_file: source_file,
471
508
  start_line: UNKNOWN_MIN_LINE,
@@ -476,49 +513,33 @@ module Datadog
476
513
 
477
514
  # Extract CLASS scope
478
515
  # @param klass [Class] The class
516
+ # @param source_file [String] Source file resolved by the caller
479
517
  # @return [Scope] The class scope
480
- def extract_class_scope(klass)
481
- methods = klass.instance_methods(false)
482
- start_line, end_line = calculate_class_line_range(klass, methods)
483
- source_file = find_source_file(klass)
518
+ def extract_class_scope(klass, source_file)
519
+ method_scopes = build_class_method_scopes(klass)
520
+ start_line, end_line = line_range_from_scopes(method_scopes)
484
521
 
485
522
  Scope.new(
486
- scope_type: 'CLASS',
523
+ scope_type: "CLASS",
487
524
  name: safe_mod_name(klass),
488
525
  source_file: source_file,
489
526
  start_line: start_line,
490
527
  end_line: end_line,
491
528
  language_specifics: build_class_language_specifics(klass),
492
- scopes: extract_method_scopes(klass),
529
+ scopes: method_scopes,
493
530
  symbols: extract_scope_symbols(klass)
494
531
  )
495
532
  end
496
533
 
497
- # Calculate class line range from method locations.
498
- # Start from the earliest method start, end at the latest method end (derived
499
- # from iseq trace_points so methods spanning multiple lines aren't truncated).
500
- # @param klass [Class] The class
501
- # @param methods [Array<Symbol>] Method names
534
+ # Derive a [start_line, end_line] range from method scopes, ignoring
535
+ # UNKNOWN sentinel values. The end is the max of method end_lines so a
536
+ # multi-line method's last line is not truncated to its start_line.
537
+ # @param method_scopes [Array<Scope>]
502
538
  # @return [Array<Integer, Integer>] [start_line, end_line]
503
- def calculate_class_line_range(klass, methods)
504
- starts = []
505
- ends = []
506
- methods.each do |method_name|
507
- method = klass.instance_method(method_name)
508
- location = method.source_location
509
- next unless location && location[0]
510
- starts << location[1]
511
- _ranges, method_end = extract_targetable_lines(method, location[1])
512
- ends << method_end
513
- end
514
-
515
- return [UNKNOWN_MIN_LINE, UNKNOWN_MAX_LINE] if starts.empty?
516
-
517
- [starts.min, ends.max]
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}" }
521
- [UNKNOWN_MIN_LINE, UNKNOWN_MAX_LINE]
539
+ def line_range_from_scopes(method_scopes)
540
+ starts = method_scopes.map(&:start_line).reject { |line| line == UNKNOWN_MIN_LINE }
541
+ ends = method_scopes.map(&:end_line).reject { |line| line == UNKNOWN_MAX_LINE }
542
+ [starts.min || UNKNOWN_MIN_LINE, ends.max || UNKNOWN_MAX_LINE]
522
543
  end
523
544
 
524
545
  # Build language specifics for CLASS
@@ -566,77 +587,44 @@ module Datadog
566
587
  {}
567
588
  end
568
589
 
569
- # Extract method scopes from a class
570
- # @param klass [Class] The class
571
- # @return [Array<Scope>] Method scopes
572
- def extract_method_scopes(klass)
573
- scopes = []
574
-
575
- # Get all instance methods (public, protected, private)
576
- all_instance_methods = klass.instance_methods(false) +
590
+ # Build a METHOD scope for each user-code instance method +klass+
591
+ # declares.
592
+ # @param klass [Class]
593
+ # @return [Array<Scope>]
594
+ def build_class_method_scopes(klass)
595
+ method_names = (klass.instance_methods(false) +
577
596
  klass.protected_instance_methods(false) +
578
- klass.private_instance_methods(false)
579
- all_instance_methods.uniq!
597
+ klass.private_instance_methods(false)).uniq
580
598
 
581
- all_instance_methods.each do |method_name|
582
- method_scope = extract_method_scope(klass, method_name, :instance)
583
- scopes << method_scope if method_scope
584
- end
599
+ Core::Utils::EnumerableCompat.filter_map(method_names) do |method_name|
600
+ method = declared_instance_method(klass, method_name)
601
+ location = method.source_location
602
+ next unless location
603
+ next unless user_code_path?(location[0])
585
604
 
586
- scopes
605
+ build_instance_method_scope(klass, method_name, method)
606
+ rescue Exception => e # standard:disable Lint/RescueException
607
+ Datadog::DI.reraise_if_fatal(e)
608
+ @logger.debug { "symdb: error resolving #{safe_mod_name(klass)}##{method_name}: #{e.class}: #{e.message}" }
609
+ nil
610
+ end
587
611
  rescue Exception => e # standard:disable Lint/RescueException
588
612
  Datadog::DI.reraise_if_fatal(e)
589
613
  @logger.debug { "symdb: failed to extract methods from #{safe_mod_name(klass)}: #{e.class}: #{e.message}" }
590
614
  []
591
615
  end
592
616
 
593
- # Extract a single method scope
594
- # @param klass [Class] The class
595
- # @param method_name [Symbol] Method name
596
- # @param method_type [Symbol] :instance or :class
597
- # @return [Scope, nil] Method scope or nil
598
- def extract_method_scope(klass, method_name, method_type)
599
- method = klass.instance_method(method_name)
600
- location = method.source_location
601
-
602
- return nil unless location # Skip methods without source location
603
-
604
- source_file, line = location
605
- return nil unless user_code_path?(source_file) # Skip gem/stdlib methods
606
-
607
- targetable_lines, end_line = extract_targetable_lines(method, line)
608
-
609
- Scope.new(
610
- scope_type: 'METHOD',
611
- name: method_name.to_s,
612
- source_file: source_file,
613
- start_line: line,
614
- end_line: end_line,
615
- targetable_lines: targetable_lines,
616
- language_specifics: {
617
- visibility: method_visibility(klass, method_name),
618
- method_type: method_type.to_s,
619
- arity: method.arity
620
- },
621
- symbols: extract_method_parameters(method)
622
- )
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}" }
626
- nil
627
- end
628
-
629
617
  # Get method visibility
630
618
  # @param klass [Class] The class
631
619
  # @param method_name [Symbol] Method name
632
620
  # @return [String] 'public', 'private', or 'protected'
633
621
  def method_visibility(klass, method_name)
634
622
  if klass.private_instance_methods(false).include?(method_name)
635
- 'private'
623
+ "private"
636
624
  elsif klass.protected_instance_methods(false).include?(method_name)
637
- 'protected'
625
+ "protected"
638
626
  else
639
- 'public'
627
+ "public"
640
628
  end
641
629
  end
642
630
 
@@ -647,7 +635,7 @@ module Datadog
647
635
  # @param start_line [Integer] Fallback end_line if iseq unavailable
648
636
  # @return [Array(Array<Hash>, Integer), Array(nil, Integer)]
649
637
  def extract_targetable_lines(method, start_line)
650
- iseq = RubyVM::InstructionSequence.of(method) # steep:ignore
638
+ iseq = RubyVM::InstructionSequence.of(method)
651
639
  unless iseq
652
640
  @logger.debug { "symdb: no iseq for #{method.name} (C extension or native), skipping targetable lines" }
653
641
  return [nil, start_line]
@@ -662,7 +650,7 @@ module Datadog
662
650
  end_line = lines.max || start_line
663
651
  ranges = build_targetable_ranges(lines)
664
652
  result = ranges.empty? ? nil : ranges
665
- @logger.debug { "symdb: #{method.name} targetable lines: #{result ? "#{ranges.size} range(s), lines #{lines.first}..#{lines.last}" : 'none (no matching events)'}" }
653
+ @logger.debug { "symdb: #{method.name} targetable lines: #{result ? "#{ranges.size} range(s), lines #{lines.first}..#{lines.last}" : "none (no matching events)"}" }
666
654
  [result, end_line]
667
655
  end
668
656
 
@@ -702,7 +690,7 @@ module Datadog
702
690
  rescue Exception => e # standard:disable Lint/RescueException
703
691
  Datadog::DI.reraise_if_fatal(e)
704
692
  @logger.debug { "symdb: method.name failed: #{e.class}: #{e.message}" }
705
- 'unknown'
693
+ "unknown"
706
694
  end
707
695
  params = method.parameters
708
696
 
@@ -717,7 +705,7 @@ module Datadog
717
705
  next if param_name.nil?
718
706
 
719
707
  Symbol.new(
720
- symbol_type: 'ARG',
708
+ symbol_type: "ARG",
721
709
  name: param_name.to_s,
722
710
  line: UNKNOWN_MIN_LINE, # Parameters available in entire method
723
711
  )
@@ -790,7 +778,7 @@ module Datadog
790
778
  end
791
779
  rescue Exception => e # standard:disable Lint/RescueException
792
780
  Datadog::DI.reraise_if_fatal(e)
793
- @logger.debug { "symdb: error indexing #{mod_name || '<unknown>'}: #{e.class}: #{e.message}" }
781
+ @logger.debug { "symdb: error indexing #{mod_name || "<unknown>"}: #{e.class}: #{e.message}" }
794
782
  end
795
783
 
796
784
  index
@@ -801,14 +789,14 @@ module Datadog
801
789
  # objects allocated to read `source_location` are not retained between
802
790
  # passes, so they can be GC'd as soon as the inner loop ends.
803
791
  def collect_method_names_by_file(mod)
804
- result = Hash.new { |h, k| h[k] = [] } # steep:ignore
792
+ result = Hash.new { |h, k| h[k] = [] }
805
793
 
806
794
  # Module#instance_methods(false) already returns both public and protected
807
795
  # methods, so iterating it plus private_instance_methods covers all three
808
796
  # visibilities without an intermediate merged array.
809
797
  [mod.instance_methods(false), mod.private_instance_methods(false)].each do |method_names|
810
798
  method_names.each do |method_name|
811
- method = mod.instance_method(method_name)
799
+ method = declared_instance_method(mod, method_name)
812
800
  loc = method.source_location
813
801
  next unless loc
814
802
  next unless user_code_path?(loc[0])
@@ -840,19 +828,19 @@ module Datadog
840
828
  return nil if entries.empty?
841
829
 
842
830
  root = {
843
- name: file_path, type: 'FILE', children: {},
831
+ name: file_path, type: "FILE", children: {},
844
832
  methods: [], mod: nil, source_file: file_path, fqn: nil,
845
833
  }
846
834
 
847
835
  # Sort by FQN depth so parent namespaces are placed before children.
848
- sorted = entries.sort_by { |(mod_name, _, _)| mod_name.count(':') }
836
+ sorted = entries.sort_by { |(mod_name, _, _)| mod_name.count(":") }
849
837
 
850
838
  sorted.each do |mod_name, mod, method_names|
851
839
  # Resolve UnboundMethods for this (mod, file) just-in-time. These objects
852
840
  # live only as long as the tree node holds them; they are released when
853
841
  # convert_tree_to_scope finishes building the file's Scope.
854
842
  method_infos = Core::Utils::EnumerableCompat.filter_map(method_names) do |name|
855
- method = mod.instance_method(name)
843
+ method = declared_instance_method(mod, name)
856
844
  # Pass 1 (build_per_file_index) recorded this method under file_path.
857
845
  # If the method has been redefined in another file between the two
858
846
  # passes (e.g. a class reopened during a Rails reload while extract_all
@@ -875,7 +863,7 @@ module Datadog
875
863
  # the module no longer lives in.
876
864
  next if method_names.any? && method_infos.empty?
877
865
 
878
- parts = mod_name.split('::')
866
+ parts = mod_name.split("::")
879
867
  place_in_tree(root, parts, mod, mod_name, method_infos, file_path)
880
868
  rescue Exception => e # standard:disable Lint/RescueException
881
869
  Datadog::DI.reraise_if_fatal(e)
@@ -901,11 +889,11 @@ module Datadog
901
889
 
902
890
  # Create/find intermediate nodes for each namespace segment except the last
903
891
  name_parts[0..-2].each_with_index do |part, idx| # steep:ignore
904
- fqn = name_parts[0..idx].join('::') # steep:ignore
892
+ fqn = name_parts[0..idx].join("::") # steep:ignore
905
893
  current[:children][part] ||= {
906
894
  name: fqn, type: resolve_scope_type(fqn),
907
895
  children: {}, methods: [], mod: nil,
908
- source_file: file_path, fqn: fqn
896
+ source_file: file_path, fqn: fqn,
909
897
  }
910
898
  current = current[:children][part]
911
899
  end
@@ -916,15 +904,15 @@ module Datadog
916
904
  if leaf
917
905
  # Node exists (was created as intermediate or from another entry).
918
906
  # Update type and mod — the actual module object is authoritative.
919
- leaf[:type] = (Class === mod) ? 'CLASS' : 'MODULE'
907
+ leaf[:type] = (Class === mod) ? "CLASS" : "MODULE"
920
908
  leaf[:mod] = mod
921
909
  else
922
910
  leaf = {
923
911
  name: mod_name,
924
- type: (Class === mod) ? 'CLASS' : 'MODULE',
912
+ type: (Class === mod) ? "CLASS" : "MODULE",
925
913
  children: {}, methods: [],
926
914
  mod: mod, source_file: file_path,
927
- fqn: mod_name
915
+ fqn: mod_name,
928
916
  }
929
917
  current[:children][leaf_name] = leaf
930
918
  end
@@ -939,22 +927,22 @@ module Datadog
939
927
  # @return [String] 'CLASS' or 'MODULE'
940
928
  def resolve_scope_type(fqn)
941
929
  current = Object
942
- fqn.split('::').each do |seg|
930
+ fqn.split("::").each do |seg|
943
931
  sym = seg.to_sym
944
- pending_autoload = if RubyVersion.is?('>= 2.7')
932
+ pending_autoload = if RubyVersion.is?(">= 2.7")
945
933
  MODULE_AUTOLOAD_P.bind(current).call(sym, false)
946
934
  else
947
935
  MODULE_AUTOLOAD_P.bind(current).call(sym)
948
936
  end
949
- return 'MODULE' if pending_autoload
950
- return 'MODULE' unless MODULE_CONST_DEFINED.bind(current).call(sym, false)
937
+ return "MODULE" if pending_autoload
938
+ return "MODULE" unless MODULE_CONST_DEFINED.bind(current).call(sym, false)
951
939
  current = MODULE_CONST_GET.bind(current).call(sym, false)
952
940
  end
953
- (Class === current) ? 'CLASS' : 'MODULE'
941
+ (Class === current) ? "CLASS" : "MODULE"
954
942
  rescue Exception => e # standard:disable Lint/RescueException
955
943
  Datadog::DI.reraise_if_fatal(e)
956
944
  @logger.debug { "symdb: resolve_scope_type(#{fqn}) failed: #{e.class}: #{e.message}, defaulting to MODULE" }
957
- 'MODULE'
945
+ "MODULE"
958
946
  end
959
947
 
960
948
  # Convert a single file tree (built by build_file_scope) to a FILE Scope.
@@ -967,7 +955,7 @@ module Datadog
967
955
  lang[:file_hash] = file_hash if file_hash
968
956
 
969
957
  Scope.new(
970
- scope_type: 'FILE',
958
+ scope_type: "FILE",
971
959
  name: file_path,
972
960
  source_file: file_path,
973
961
  start_line: UNKNOWN_MIN_LINE,
@@ -989,19 +977,13 @@ module Datadog
989
977
  # Recurse into child scopes (nested modules/classes)
990
978
  child_scopes = node[:children].values.map { |child| convert_node_to_scope(child) }
991
979
 
992
- # Compute line range: start from the earliest method start, end at the latest
993
- # method end. Using max(start_line) would underreport the class's end_line for
994
- # classes whose last method spans multiple lines.
995
- starts = method_scopes.map(&:start_line).reject { |l| l == UNKNOWN_MIN_LINE } # steep:ignore
996
- ends = method_scopes.map(&:end_line).reject { |l| l == UNKNOWN_MAX_LINE } # steep:ignore
997
- start_line = starts.empty? ? UNKNOWN_MIN_LINE : starts.min
998
- end_line = ends.empty? ? UNKNOWN_MAX_LINE : ends.max
980
+ start_line, end_line = line_range_from_scopes(method_scopes)
999
981
 
1000
982
  # Extract symbols (constants, class variables) if we have the actual module object
1001
983
  symbols = node[:mod] ? extract_scope_symbols(node[:mod]) : []
1002
984
 
1003
985
  # Build language specifics
1004
- lang = if node[:type] == 'CLASS' && node[:mod]
986
+ lang = if node[:type] == "CLASS" && node[:mod]
1005
987
  build_class_language_specifics(node[:mod])
1006
988
  else
1007
989
  {}
@@ -1034,22 +1016,22 @@ module Datadog
1034
1016
  targetable_lines, end_line = extract_targetable_lines(method, line)
1035
1017
 
1036
1018
  Scope.new(
1037
- scope_type: 'METHOD',
1019
+ scope_type: "METHOD",
1038
1020
  name: method_name.to_s,
1039
1021
  source_file: source_file,
1040
1022
  start_line: line,
1041
1023
  end_line: end_line,
1042
1024
  targetable_lines: targetable_lines,
1043
1025
  language_specifics: {
1044
- visibility: klass ? method_visibility(klass, method_name) : 'public', # steep:ignore
1045
- method_type: 'instance',
1046
- arity: method.arity
1026
+ visibility: klass ? method_visibility(klass, method_name) : "public", # steep:ignore
1027
+ method_type: "instance",
1028
+ arity: method.arity,
1047
1029
  },
1048
1030
  symbols: extract_method_parameters(method)
1049
1031
  )
1050
1032
  rescue Exception => e # standard:disable Lint/RescueException
1051
1033
  Datadog::DI.reraise_if_fatal(e)
1052
- klass_name = klass ? (safe_mod_name(klass) || '<unknown>') : '<unknown>'
1034
+ klass_name = klass ? (safe_mod_name(klass) || "<unknown>") : "<unknown>"
1053
1035
  @logger.debug { "symdb: failed to build method scope #{klass_name}##{method_name}: #{e.class}: #{e.message}" }
1054
1036
  nil
1055
1037
  end
@@ -1065,7 +1047,7 @@ module Datadog
1065
1047
  if Class === mod
1066
1048
  MODULE_CLASS_VARIABLES.bind(mod).call(false).each do |var_name|
1067
1049
  symbols << Symbol.new(
1068
- symbol_type: 'STATIC_FIELD',
1050
+ symbol_type: "STATIC_FIELD",
1069
1051
  name: var_name.to_s,
1070
1052
  line: UNKNOWN_MIN_LINE
1071
1053
  )
@@ -1080,7 +1062,7 @@ module Datadog
1080
1062
  next if Module === const_value
1081
1063
 
1082
1064
  symbols << Symbol.new(
1083
- symbol_type: 'STATIC_FIELD',
1065
+ symbol_type: "STATIC_FIELD",
1084
1066
  name: const_name.to_s,
1085
1067
  line: UNKNOWN_MIN_LINE,
1086
1068
  type: safe_mod_name(KERNEL_CLASS.bind(const_value).call)
@@ -1101,7 +1083,7 @@ module Datadog
1101
1083
  symbols
1102
1084
  rescue Exception => e # standard:disable Lint/RescueException
1103
1085
  Datadog::DI.reraise_if_fatal(e)
1104
- mod_name = safe_mod_name(mod) || '<unknown>'
1086
+ mod_name = safe_mod_name(mod) || "<unknown>"
1105
1087
  @logger.debug { "symdb: failed to extract symbols from #{mod_name}: #{e.class}: #{e.message}" }
1106
1088
  []
1107
1089
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'digest/sha1'
4
- require_relative '../di/fatal_exceptions'
3
+ require "digest/sha1"
4
+ require_relative "../di/fatal_exceptions"
5
5
 
6
6
  module Datadog
7
7
  module SymbolDatabase
@@ -30,7 +30,7 @@ module Datadog
30
30
  return nil unless file_path
31
31
  return nil unless File.exist?(file_path)
32
32
 
33
- content = File.read(file_path, mode: 'rb')
33
+ content = File.read(file_path, mode: "rb")
34
34
  size = content.bytesize
35
35
  git_blob = "blob #{size}\0#{content}"
36
36