datadog 2.38.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 (834) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -1
  3. data/bin/ddprofrb +4 -4
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +77 -1
  5. data/ext/datadog_profiling_native_extension/collectors_stack.c +218 -147
  6. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -2
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +12 -7
  8. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  10. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  11. data/ext/datadog_profiling_native_extension/extconf.rb +13 -8
  12. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +259 -65
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -10
  14. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +2 -0
  15. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  16. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  17. data/ext/libdatadog_api/extconf.rb +24 -24
  18. data/ext/libdatadog_api/feature_flags.c +26 -0
  19. data/ext/libdatadog_api/init.c +4 -0
  20. data/ext/libdatadog_api/trace_exporter.c +974 -0
  21. data/ext/libdatadog_api/trace_exporter.h +5 -0
  22. data/ext/libdatadog_extconf_helpers.rb +9 -9
  23. data/lib/datadog/ai_guard/api_client.rb +2 -2
  24. data/lib/datadog/ai_guard/component.rb +10 -10
  25. data/lib/datadog/ai_guard/evaluation.rb +1 -0
  26. data/lib/datadog/ai_guard/ext.rb +2 -0
  27. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +16 -16
  28. data/lib/datadog/appsec/actions_handler.rb +6 -6
  29. data/lib/datadog/appsec/anonymizer.rb +1 -1
  30. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  31. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  32. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  33. data/lib/datadog/appsec/api_security/route_extractor.rb +11 -11
  34. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  35. data/lib/datadog/appsec/api_security.rb +1 -1
  36. data/lib/datadog/appsec/assets.rb +7 -7
  37. data/lib/datadog/appsec/autoload.rb +3 -3
  38. data/lib/datadog/appsec/component.rb +15 -15
  39. data/lib/datadog/appsec/compressed_json.rb +6 -6
  40. data/lib/datadog/appsec/configuration.rb +68 -59
  41. data/lib/datadog/appsec/context.rb +6 -6
  42. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  43. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  44. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  45. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  46. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  47. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  49. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  50. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  51. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  52. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  53. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  54. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  55. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  56. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  57. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  58. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +26 -26
  59. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  60. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  61. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +22 -22
  62. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  63. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +2 -2
  64. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  65. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  66. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  67. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  68. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  69. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +14 -18
  70. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +24 -24
  72. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +6 -6
  73. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  74. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  75. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  76. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +26 -26
  77. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +10 -10
  79. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +10 -10
  80. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  81. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  82. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  83. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  84. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  85. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  86. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  87. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +23 -23
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  90. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +15 -15
  92. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  93. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  94. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  95. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  96. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  97. data/lib/datadog/appsec/event.rb +14 -14
  98. data/lib/datadog/appsec/ext.rb +11 -11
  99. data/lib/datadog/appsec/extensions.rb +2 -2
  100. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  101. data/lib/datadog/appsec/metrics/exporter.rb +8 -8
  102. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  103. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  104. data/lib/datadog/appsec/metrics.rb +4 -4
  105. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  106. data/lib/datadog/appsec/monitor.rb +1 -1
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -26
  108. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  109. data/lib/datadog/appsec/remote.rb +6 -6
  110. data/lib/datadog/appsec/response.rb +21 -21
  111. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +11 -11
  112. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +15 -15
  113. data/lib/datadog/appsec/route_normalizer/route_text.rb +3 -3
  114. data/lib/datadog/appsec/route_normalizer.rb +15 -15
  115. data/lib/datadog/appsec/security_engine/engine.rb +37 -37
  116. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  117. data/lib/datadog/appsec/security_event.rb +2 -2
  118. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  119. data/lib/datadog/appsec/utils/http/body_reader.rb +1 -1
  120. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  121. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  122. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  123. data/lib/datadog/appsec.rb +16 -16
  124. data/lib/datadog/auto_instrument.rb +2 -2
  125. data/lib/datadog/core/buffer/cruby.rb +1 -1
  126. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  127. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  128. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  129. data/lib/datadog/core/configuration/base.rb +2 -2
  130. data/lib/datadog/core/configuration/components.rb +33 -29
  131. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  132. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  133. data/lib/datadog/core/configuration/ext.rb +11 -11
  134. data/lib/datadog/core/configuration/option.rb +16 -16
  135. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  136. data/lib/datadog/core/configuration/options.rb +1 -1
  137. data/lib/datadog/core/configuration/settings.rb +91 -99
  138. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  139. data/lib/datadog/core/configuration/supported_configurations.rb +5 -1
  140. data/lib/datadog/core/configuration.rb +8 -8
  141. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  142. data/lib/datadog/core/crashtracking/component.rb +9 -9
  143. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  144. data/lib/datadog/core/deprecations.rb +1 -1
  145. data/lib/datadog/core/diagnostics/environment_logger.rb +6 -6
  146. data/lib/datadog/core/diagnostics/health.rb +2 -2
  147. data/lib/datadog/core/encoding.rb +4 -4
  148. data/lib/datadog/core/environment/agent_info.rb +2 -2
  149. data/lib/datadog/core/environment/cgroup.rb +4 -4
  150. data/lib/datadog/core/environment/container.rb +9 -9
  151. data/lib/datadog/core/environment/execution.rb +3 -3
  152. data/lib/datadog/core/environment/ext.rb +18 -18
  153. data/lib/datadog/core/environment/gc.rb +1 -1
  154. data/lib/datadog/core/environment/git.rb +2 -2
  155. data/lib/datadog/core/environment/identity.rb +10 -10
  156. data/lib/datadog/core/environment/platform.rb +8 -8
  157. data/lib/datadog/core/environment/process.rb +3 -3
  158. data/lib/datadog/core/environment/socket.rb +2 -2
  159. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  160. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  161. data/lib/datadog/core/environment/yjit.rb +2 -2
  162. data/lib/datadog/core/error.rb +5 -5
  163. data/lib/datadog/core/evp.rb +2 -2
  164. data/lib/datadog/core/extensions.rb +1 -1
  165. data/lib/datadog/core/feature_flags.rb +2 -2
  166. data/lib/datadog/core/git/ext.rb +4 -4
  167. data/lib/datadog/core/logger.rb +3 -3
  168. data/lib/datadog/core/logging/ext.rb +1 -1
  169. data/lib/datadog/core/metrics/client.rb +20 -20
  170. data/lib/datadog/core/metrics/ext.rb +5 -5
  171. data/lib/datadog/core/metrics/logging.rb +2 -2
  172. data/lib/datadog/core/metrics/options.rb +3 -3
  173. data/lib/datadog/core/pin.rb +1 -1
  174. data/lib/datadog/core/process_discovery.rb +8 -8
  175. data/lib/datadog/core/rate_limiter.rb +1 -1
  176. data/lib/datadog/core/remote/client/capabilities.rb +36 -20
  177. data/lib/datadog/core/remote/client.rb +16 -16
  178. data/lib/datadog/core/remote/component.rb +20 -12
  179. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  180. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  181. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  182. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  183. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  184. data/lib/datadog/core/remote/configuration.rb +4 -4
  185. data/lib/datadog/core/remote/ext.rb +3 -3
  186. data/lib/datadog/core/remote/negotiation.rb +1 -1
  187. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  188. data/lib/datadog/core/remote/transport/config.rb +4 -4
  189. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  190. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  191. data/lib/datadog/core/remote/transport/http.rb +10 -10
  192. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  193. data/lib/datadog/core/remote/worker.rb +5 -5
  194. data/lib/datadog/core/runtime/ext.rb +22 -22
  195. data/lib/datadog/core/runtime/metrics.rb +9 -9
  196. data/lib/datadog/core/tag_builder.rb +18 -18
  197. data/lib/datadog/core/tag_normalizer.rb +7 -7
  198. data/lib/datadog/core/telemetry/component.rb +13 -13
  199. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  200. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +5 -5
  201. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  202. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  203. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +2 -2
  204. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  205. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  206. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  207. data/lib/datadog/core/telemetry/event/app_started.rb +33 -33
  208. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  209. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  210. data/lib/datadog/core/telemetry/event/generate_metrics.rb +2 -2
  211. data/lib/datadog/core/telemetry/event/log.rb +4 -4
  212. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  213. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  214. data/lib/datadog/core/telemetry/event.rb +16 -16
  215. data/lib/datadog/core/telemetry/ext.rb +11 -11
  216. data/lib/datadog/core/telemetry/logger.rb +1 -1
  217. data/lib/datadog/core/telemetry/logging.rb +5 -5
  218. data/lib/datadog/core/telemetry/metric.rb +7 -7
  219. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  220. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  221. data/lib/datadog/core/telemetry/request.rb +4 -4
  222. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  223. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  224. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  225. data/lib/datadog/core/telemetry/worker.rb +6 -6
  226. data/lib/datadog/core/transport/ext.rb +14 -14
  227. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  228. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  229. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  230. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  231. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  232. data/lib/datadog/core/transport/http/builder.rb +5 -5
  233. data/lib/datadog/core/transport/http/client.rb +2 -2
  234. data/lib/datadog/core/transport/http/response.rb +1 -1
  235. data/lib/datadog/core/transport/http.rb +8 -8
  236. data/lib/datadog/core/transport/transport.rb +1 -1
  237. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +82 -14
  238. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  239. data/lib/datadog/core/utils/duration.rb +1 -1
  240. data/lib/datadog/core/utils/forking.rb +2 -2
  241. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  242. data/lib/datadog/core/utils/network.rb +11 -11
  243. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  244. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  245. data/lib/datadog/core/utils/sequence.rb +3 -6
  246. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  247. data/lib/datadog/core/utils/time.rb +16 -54
  248. data/lib/datadog/core/utils/url.rb +1 -1
  249. data/lib/datadog/core/utils.rb +4 -4
  250. data/lib/datadog/core/workers/async.rb +1 -1
  251. data/lib/datadog/core/workers/polling.rb +2 -2
  252. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  253. data/lib/datadog/core.rb +4 -4
  254. data/lib/datadog/data_streams/configuration.rb +3 -3
  255. data/lib/datadog/data_streams/ext.rb +1 -1
  256. data/lib/datadog/data_streams/extensions.rb +2 -2
  257. data/lib/datadog/data_streams/pathway_context.rb +5 -5
  258. data/lib/datadog/data_streams/processor.rb +52 -52
  259. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  260. data/lib/datadog/data_streams/transport/http.rb +5 -5
  261. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  262. data/lib/datadog/data_streams.rb +5 -5
  263. data/lib/datadog/di/base.rb +4 -4
  264. data/lib/datadog/di/boot.rb +25 -25
  265. data/lib/datadog/di/code_tracker.rb +6 -6
  266. data/lib/datadog/di/component.rb +11 -3
  267. data/lib/datadog/di/configuration.rb +2 -2
  268. data/lib/datadog/di/contrib/railtie.rb +1 -1
  269. data/lib/datadog/di/contrib.rb +5 -5
  270. data/lib/datadog/di/el/compiler.rb +90 -37
  271. data/lib/datadog/di/el/evaluator.rb +82 -2
  272. data/lib/datadog/di/el/expression.rb +10 -2
  273. data/lib/datadog/di/el.rb +3 -3
  274. data/lib/datadog/di/instrumenter.rb +19 -9
  275. data/lib/datadog/di/logger.rb +1 -1
  276. data/lib/datadog/di/preload.rb +1 -1
  277. data/lib/datadog/di/probe_builder.rb +24 -24
  278. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  279. data/lib/datadog/di/probe_file_loader.rb +5 -5
  280. data/lib/datadog/di/probe_manager.rb +1 -1
  281. data/lib/datadog/di/probe_notification_builder.rb +16 -16
  282. data/lib/datadog/di/probe_notifier_worker.rb +6 -6
  283. data/lib/datadog/di/probe_repository.rb +1 -1
  284. data/lib/datadog/di/remote.rb +3 -3
  285. data/lib/datadog/di/serializer.rb +13 -13
  286. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  287. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  288. data/lib/datadog/di/transport/http/input.rb +2 -2
  289. data/lib/datadog/di/transport/http.rb +10 -10
  290. data/lib/datadog/di/transport/input.rb +9 -9
  291. data/lib/datadog/di/utils.rb +4 -4
  292. data/lib/datadog/di.rb +5 -5
  293. data/lib/datadog/error_tracking/collector.rb +2 -2
  294. data/lib/datadog/error_tracking/component.rb +12 -12
  295. data/lib/datadog/error_tracking/configuration.rb +2 -2
  296. data/lib/datadog/error_tracking/ext.rb +7 -7
  297. data/lib/datadog/error_tracking/extensions.rb +2 -2
  298. data/lib/datadog/error_tracking/filters.rb +4 -4
  299. data/lib/datadog/error_tracking.rb +6 -6
  300. data/lib/datadog/kit/appsec/events/v2.rb +39 -39
  301. data/lib/datadog/kit/appsec/events.rb +25 -25
  302. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  303. data/lib/datadog/kit/identity.rb +18 -18
  304. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  305. data/lib/datadog/kit.rb +1 -1
  306. data/lib/datadog/open_feature/component.rb +31 -22
  307. data/lib/datadog/open_feature/configuration.rb +15 -2
  308. data/lib/datadog/open_feature/evaluation_engine.rb +7 -7
  309. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  310. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  311. data/lib/datadog/open_feature/exposures/event.rb +2 -2
  312. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  313. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  314. data/lib/datadog/open_feature/ext.rb +13 -8
  315. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +8 -8
  316. data/lib/datadog/open_feature/flag_evaluation/writer.rb +36 -36
  317. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +5 -4
  318. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +3 -1
  319. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  320. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  321. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  322. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  323. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  324. data/lib/datadog/open_feature/native_evaluator.rb +4 -4
  325. data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
  326. data/lib/datadog/open_feature/provider.rb +45 -10
  327. data/lib/datadog/open_feature/remote.rb +2 -2
  328. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  329. data/lib/datadog/open_feature/transport.rb +14 -14
  330. data/lib/datadog/open_feature.rb +2 -2
  331. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  332. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  333. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  334. data/lib/datadog/opentelemetry/ext.rb +1 -1
  335. data/lib/datadog/opentelemetry/logs.rb +5 -5
  336. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  337. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  338. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  339. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +6 -6
  340. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -5
  341. data/lib/datadog/opentelemetry/sdk/propagator.rb +7 -7
  342. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  343. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  344. data/lib/datadog/opentelemetry/sdk.rb +2 -2
  345. data/lib/datadog/opentelemetry/signal_configuration.rb +11 -11
  346. data/lib/datadog/opentelemetry/trace.rb +1 -1
  347. data/lib/datadog/opentelemetry.rb +8 -8
  348. data/lib/datadog/profiling/collectors/thread_context.rb +6 -13
  349. data/lib/datadog/profiling/component.rb +1 -0
  350. data/lib/datadog/profiling/exporter.rb +1 -1
  351. data/lib/datadog/profiling/http_transport.rb +1 -1
  352. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  353. data/lib/datadog/profiling/tag_builder.rb +19 -19
  354. data/lib/datadog/profiling.rb +31 -27
  355. data/lib/datadog/single_step_instrument.rb +1 -1
  356. data/lib/datadog/symbol_database/component.rb +15 -15
  357. data/lib/datadog/symbol_database/configuration.rb +3 -3
  358. data/lib/datadog/symbol_database/extensions.rb +2 -2
  359. data/lib/datadog/symbol_database/extractor.rb +53 -53
  360. data/lib/datadog/symbol_database/file_hash.rb +3 -3
  361. data/lib/datadog/symbol_database/logger.rb +1 -1
  362. data/lib/datadog/symbol_database/remote.rb +21 -6
  363. data/lib/datadog/symbol_database/scope.rb +2 -2
  364. data/lib/datadog/symbol_database/scope_batcher.rb +2 -2
  365. data/lib/datadog/symbol_database/service_version.rb +4 -4
  366. data/lib/datadog/symbol_database/symbol.rb +1 -1
  367. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  368. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  369. data/lib/datadog/symbol_database/transport.rb +4 -4
  370. data/lib/datadog/symbol_database/uploader.rb +22 -22
  371. data/lib/datadog/symbol_database.rb +2 -2
  372. data/lib/datadog/tracing/analytics.rb +1 -1
  373. data/lib/datadog/tracing/buffer.rb +5 -5
  374. data/lib/datadog/tracing/client_ip.rb +4 -4
  375. data/lib/datadog/tracing/component.rb +28 -7
  376. data/lib/datadog/tracing/configuration/dynamic.rb +8 -8
  377. data/lib/datadog/tracing/configuration/ext.rb +43 -42
  378. data/lib/datadog/tracing/configuration/http.rb +2 -2
  379. data/lib/datadog/tracing/configuration/settings.rb +32 -16
  380. data/lib/datadog/tracing/context.rb +1 -1
  381. data/lib/datadog/tracing/context_provider.rb +2 -2
  382. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  383. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  384. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  385. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  386. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  387. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  388. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  389. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  390. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  391. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  392. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  393. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  394. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  395. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  396. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  397. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  398. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  399. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  400. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +8 -8
  401. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  402. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  403. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  404. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  405. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  406. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  407. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  408. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  409. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  410. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  411. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  412. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  413. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  414. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  415. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  416. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  417. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  418. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  419. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +2 -2
  420. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  421. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  422. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  423. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  424. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  425. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  426. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  427. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  428. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  429. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  430. data/lib/datadog/tracing/contrib/active_job/patcher.rb +7 -7
  431. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  432. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  433. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  434. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +6 -6
  435. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  436. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  437. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  438. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  439. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  440. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +6 -6
  441. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  442. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  443. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  444. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +9 -9
  445. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  446. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  447. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  448. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  449. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  450. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  451. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -11
  452. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  453. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  454. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  455. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  456. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  457. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  458. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  459. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  460. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  461. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  462. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  463. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  464. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  465. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  466. data/lib/datadog/tracing/contrib/aws/ext.rb +25 -25
  467. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  468. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  469. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  470. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  471. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  472. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  473. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  474. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  475. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  476. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  477. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  478. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  479. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  480. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  481. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  482. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  483. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  484. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  485. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  486. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  487. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  488. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  489. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  490. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  491. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  492. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  493. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  494. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  495. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  496. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  497. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  498. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  499. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  500. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  501. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  502. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  503. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  504. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  505. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  506. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  507. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +8 -8
  508. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  509. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  510. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  511. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  512. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  513. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  514. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  515. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -8
  516. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  517. data/lib/datadog/tracing/contrib/ext.rb +15 -15
  518. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  519. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  520. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  521. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  522. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  523. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  524. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  525. data/lib/datadog/tracing/contrib/grape/endpoint.rb +20 -20
  526. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  527. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  528. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  529. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  530. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  531. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  532. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  533. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  534. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  535. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  536. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  538. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -7
  539. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -7
  540. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  541. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  542. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +8 -8
  543. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  544. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  545. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  546. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  547. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  548. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  549. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  550. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  551. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  552. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  553. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  554. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  555. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  556. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  557. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  558. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  559. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  560. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  561. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -6
  562. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  563. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  564. data/lib/datadog/tracing/contrib/http.rb +6 -6
  565. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  566. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  567. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -5
  568. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  569. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  570. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  571. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  572. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -6
  573. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  574. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  575. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  576. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  577. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  578. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  579. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  580. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  581. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  582. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  583. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  584. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  585. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  586. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  587. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  588. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  589. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  590. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  591. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  592. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  593. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  594. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +8 -8
  595. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  596. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  597. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  598. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  599. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  600. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  601. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  602. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  603. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  604. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  605. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  606. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  607. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  608. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  609. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  610. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  611. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  612. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  613. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  614. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  615. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  616. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  617. data/lib/datadog/tracing/contrib/opensearch/ext.rb +22 -22
  618. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  619. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  620. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +3 -3
  621. data/lib/datadog/tracing/contrib/patcher.rb +2 -2
  622. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  623. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  624. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +6 -6
  625. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  626. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  627. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  628. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  629. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  630. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  631. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  632. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  633. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  634. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  635. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  636. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  637. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  638. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  639. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  640. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  641. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  642. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  643. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  644. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  645. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  646. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  647. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  648. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  649. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  650. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  651. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  652. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  653. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  654. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  655. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  656. data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
  657. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  658. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  659. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +15 -15
  660. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  661. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  662. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  663. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  664. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  665. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  666. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  667. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  668. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  669. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  670. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  671. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  672. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  673. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  674. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  675. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  676. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  677. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  678. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  679. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  680. data/lib/datadog/tracing/contrib/redis/quantize.rb +4 -4
  681. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  682. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +5 -5
  683. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  684. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  685. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  686. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  687. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  688. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  689. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  690. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  691. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  692. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -5
  693. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  694. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  695. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  696. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  697. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  698. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  699. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  700. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  701. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  702. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  703. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  704. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  705. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  706. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  707. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  708. data/lib/datadog/tracing/contrib/sequel/utils.rb +113 -8
  709. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  710. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  711. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  712. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  713. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  714. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  715. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  716. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +9 -9
  717. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  718. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  719. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  720. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +13 -13
  721. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  722. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  723. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  724. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  725. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  726. data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
  727. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  728. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  729. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  730. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  731. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  732. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  733. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  734. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  735. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -3
  736. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  737. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  738. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  739. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  740. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  741. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  742. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  743. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  744. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  745. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  746. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  747. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  748. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  749. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  750. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  751. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  752. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  753. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  754. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  755. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  756. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  757. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
  758. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  759. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +8 -8
  760. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  761. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  762. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  763. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  764. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  765. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  766. data/lib/datadog/tracing/contrib.rb +54 -54
  767. data/lib/datadog/tracing/correlation.rb +10 -10
  768. data/lib/datadog/tracing/diagnostics/environment_logger.rb +9 -9
  769. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  770. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  771. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  772. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  773. data/lib/datadog/tracing/distributed/baggage.rb +27 -27
  774. data/lib/datadog/tracing/distributed/datadog.rb +21 -21
  775. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +3 -3
  776. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  777. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  778. data/lib/datadog/tracing/distributed/propagation.rb +12 -12
  779. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  780. data/lib/datadog/tracing/distributed/trace_context.rb +33 -33
  781. data/lib/datadog/tracing/event.rb +1 -1
  782. data/lib/datadog/tracing/ext.rb +1 -1
  783. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  784. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  785. data/lib/datadog/tracing/metadata/ext.rb +69 -69
  786. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  787. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  788. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  789. data/lib/datadog/tracing/metadata.rb +4 -4
  790. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  791. data/lib/datadog/tracing/pipeline.rb +2 -2
  792. data/lib/datadog/tracing/remote.rb +23 -16
  793. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  794. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  795. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  796. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  797. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  798. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  799. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  800. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  801. data/lib/datadog/tracing/sampling/rule_sampler.rb +12 -12
  802. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  803. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  804. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  805. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  806. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  807. data/lib/datadog/tracing/span.rb +8 -8
  808. data/lib/datadog/tracing/span_event.rb +5 -5
  809. data/lib/datadog/tracing/span_operation.rb +21 -21
  810. data/lib/datadog/tracing/sync_writer.rb +12 -7
  811. data/lib/datadog/tracing/trace_operation.rb +11 -11
  812. data/lib/datadog/tracing/trace_segment.rb +10 -10
  813. data/lib/datadog/tracing/tracer.rb +23 -15
  814. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  815. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  816. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  817. data/lib/datadog/tracing/transport/http.rb +10 -10
  818. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  819. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  820. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  821. data/lib/datadog/tracing/transport/io.rb +3 -3
  822. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  823. data/lib/datadog/tracing/transport/native.rb +363 -0
  824. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  825. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  826. data/lib/datadog/tracing/transport/trace_formatter.rb +10 -10
  827. data/lib/datadog/tracing/transport/traces.rb +8 -8
  828. data/lib/datadog/tracing/utils.rb +2 -2
  829. data/lib/datadog/tracing/workers.rb +2 -2
  830. data/lib/datadog/tracing/writer.rb +21 -8
  831. data/lib/datadog/tracing.rb +3 -3
  832. data/lib/datadog/version.rb +4 -4
  833. data/lib/datadog.rb +13 -13
  834. metadata +13 -5
@@ -153,6 +153,8 @@ typedef struct {
153
153
  VALUE otel_current_span_key;
154
154
  // Used to enable native filenames in stack traces
155
155
  bool native_filenames_enabled;
156
+ // Used to include class/module names in method names (e.g. "Foo#bar" instead of "bar")
157
+ bool show_classes;
156
158
  // Used to cache native filename lookup results (Map[void *function_pointer, char *filename])
157
159
  st_table *native_filenames_cache;
158
160
  // Used to attribute overhead during sampling to this component
@@ -493,7 +495,7 @@ static void thread_context_collector_typed_data_free(void *state_ptr) {
493
495
 
494
496
  // Important: Remember that we're only guaranteed to see here what's been set in _native_new, aka
495
497
  // pointers that have been set NULL there may still be NULL here.
496
- if (state->locations.ptr != NULL) ruby_xfree(state->locations.ptr);
498
+ sample_locations_free(&state->locations);
497
499
 
498
500
  st_free_table(state->native_filenames_cache);
499
501
 
@@ -550,14 +552,13 @@ static VALUE _native_new(VALUE klass) {
550
552
  // being leaked.
551
553
 
552
554
  // Update this when modifying state struct
553
- state->locations.ptr = NULL;
554
- state->locations.len = 0;
555
555
  state->recorder_instance = Qnil;
556
556
  state->tracer_context_key = MISSING_TRACER_CONTEXT_KEY;
557
557
  VALUE thread_list_buffer = rb_ary_new();
558
558
  state->thread_list_buffer = thread_list_buffer;
559
559
  state->endpoint_collection_enabled = true;
560
560
  state->native_filenames_enabled = false;
561
+ state->show_classes = false;
561
562
  state->native_filenames_cache = st_init_numtable();
562
563
  state->otel_context_enabled = OTEL_CONTEXT_ENABLED_FALSE;
563
564
  state->otel_context_source = OTEL_CONTEXT_SOURCE_UNKNOWN;
@@ -593,12 +594,14 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
593
594
  VALUE waiting_for_gvl_threshold_ns = rb_hash_fetch(options, ID2SYM(rb_intern("waiting_for_gvl_threshold_ns")));
594
595
  VALUE otel_context_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("otel_context_enabled")));
595
596
  VALUE native_filenames_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("native_filenames_enabled")));
597
+ VALUE show_classes = rb_hash_fetch(options, ID2SYM(rb_intern("show_classes")));
596
598
  VALUE overhead_filename = rb_hash_fetch(options, ID2SYM(rb_intern("overhead_filename")));
597
599
 
598
600
  ENFORCE_TYPE(max_frames, T_FIXNUM);
599
601
  ENFORCE_BOOLEAN(endpoint_collection_enabled);
600
602
  ENFORCE_TYPE(waiting_for_gvl_threshold_ns, T_FIXNUM);
601
603
  ENFORCE_BOOLEAN(native_filenames_enabled);
604
+ ENFORCE_BOOLEAN(show_classes);
602
605
  ENFORCE_TYPE(overhead_filename, T_STRING);
603
606
 
604
607
  uint16_t max_frame_int = sampling_buffer_check_max_frames(NUM2INT(max_frames));
@@ -607,12 +610,12 @@ static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _sel
607
610
  TypedData_Get_Struct(self_instance, thread_context_collector_state, &thread_context_collector_typed_data, state);
608
611
 
609
612
  // Update this when modifying state struct
610
- state->locations.len = max_frame_int;
611
- state->locations.ptr = ruby_xcalloc(max_frame_int, sizeof(ddog_prof_Location));
613
+ sample_locations_initialize(&state->locations, max_frame_int, show_classes == Qtrue);
612
614
  state->recorder_instance = enforce_recorder_instance(recorder_instance);
613
615
  recorder_install_on_serialize(recorder_instance, self_instance);
614
616
  state->endpoint_collection_enabled = (endpoint_collection_enabled == Qtrue);
615
617
  state->native_filenames_enabled = (native_filenames_enabled == Qtrue);
618
+ state->show_classes = (show_classes == Qtrue);
616
619
  state->overhead_filename = overhead_filename;
617
620
  if (otel_context_enabled == Qfalse || otel_context_enabled == Qnil) {
618
621
  state->otel_context_enabled = OTEL_CONTEXT_ENABLED_FALSE;
@@ -949,7 +952,7 @@ bool thread_context_collector_on_gc_finish(VALUE self_instance) {
949
952
 
950
953
  // Update cpu-time accounting so it doesn't include the cpu-time spent in GC during the next sample.
951
954
  // We don't do the same for wall-time, because GC is just like any other reason a thread didn't make
952
- // progress -- time always goes forward regardless of the thread making progress on what it wanted.
955
+ // progress -- time always goes forward regardless of the thread making progress on what it wanted.
953
956
  if (thread_context->cpu_time_at_previous_sample_ns != INVALID_TIME) {
954
957
  thread_context->cpu_time_at_previous_sample_ns += gc_cpu_time_elapsed_ns;
955
958
  }
@@ -1157,7 +1160,8 @@ static void trigger_sample_for_thread(
1157
1160
  .is_gvl_waiting_state = is_gvl_waiting_state,
1158
1161
  },
1159
1162
  state->native_filenames_enabled,
1160
- state->native_filenames_cache
1163
+ state->native_filenames_cache,
1164
+ state->show_classes
1161
1165
  );
1162
1166
  }
1163
1167
 
@@ -1329,6 +1333,7 @@ static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instanc
1329
1333
  rb_str_concat(result, rb_sprintf(" stats=%"PRIsVALUE, stats_to_ruby_hash(state, rb_hash_new())));
1330
1334
  rb_str_concat(result, rb_sprintf(" endpoint_collection_enabled=%"PRIsVALUE, state->endpoint_collection_enabled ? Qtrue : Qfalse));
1331
1335
  rb_str_concat(result, rb_sprintf(" native_filenames_enabled=%"PRIsVALUE, state->native_filenames_enabled ? Qtrue : Qfalse));
1336
+ rb_str_concat(result, rb_sprintf(" show_classes=%"PRIsVALUE, state->show_classes ? Qtrue : Qfalse));
1332
1337
  // Note: `st_table_size()` is available from Ruby 3.2+ but not before
1333
1338
  rb_str_concat(result, rb_sprintf(" native_filenames_cache_size=%zu", state->native_filenames_cache->num_entries));
1334
1339
  rb_str_concat(result, rb_sprintf(" otel_context_enabled=%d", state->otel_context_enabled));
@@ -159,7 +159,7 @@ static void ruby_runtime_stack_callback(
159
159
  frame_info *info = &runtime_stack_buffer[i];
160
160
 
161
161
  if (info->is_ruby_frame) {
162
- const void *iseq = (const void *)info->as.ruby_frame.iseq;
162
+ const rb_iseq_t *iseq = info->as.ruby_frame.iseq;
163
163
  ddog_CharSlice function_slice = DDOG_CHARSLICE_C("<unknown>");
164
164
  ddog_CharSlice file_slice = DDOG_CHARSLICE_C("<unknown>");
165
165
 
@@ -181,9 +181,10 @@ static void ruby_runtime_stack_callback(
181
181
  ddog_CharSlice function_slice = DDOG_CHARSLICE_C("<C method>");
182
182
  ddog_CharSlice file_slice = DDOG_CHARSLICE_C("<C extension>");
183
183
 
184
- if (info->as.native_frame.method_id) {
185
- const char *method_name = rb_id2name(info->as.native_frame.method_id);
186
- if (is_pointer_readable(method_name, 256)) {
184
+ const rb_callable_method_entry_t *cme = info->cme;
185
+ if (cme && is_pointer_readable(cme, sizeof_rb_callable_method_entry_t())) {
186
+ const char *method_name = ddtrace_cme_original_method_name(cme);
187
+ if (method_name && is_pointer_readable(method_name, 256)) {
187
188
  size_t method_name_len = strnlen(method_name, 256);
188
189
  if (method_name_len > 0 && method_name_len < 256) {
189
190
  function_slice = char_slice_from_cstr(method_name);
@@ -6,19 +6,27 @@
6
6
  static ID telemetry_message_id;
7
7
 
8
8
  void raise_unexpected_type(VALUE value, const char *value_name, const char *type_name, const char *file, int line, const char *function_name) {
9
- rb_exc_raise(
10
- rb_exc_new_str(
11
- rb_eTypeError,
12
- rb_sprintf("wrong argument %"PRIsVALUE" for '%s' (expected a %s) at %s:%d:in `%s'",
13
- rb_inspect(value),
14
- value_name,
15
- type_name,
16
- file,
17
- line,
18
- function_name
19
- )
9
+ // All of the below come from `ENFORCE_TYPE` and are constant for their call-site
10
+ VALUE simple_message = rb_sprintf("wrong argument for '%s' (expected a %s) at %s:%d:in `%s'",
11
+ value_name,
12
+ type_name,
13
+ file,
14
+ line,
15
+ function_name
16
+ );
17
+ VALUE exception = rb_exc_new_str(
18
+ rb_eTypeError,
19
+ rb_sprintf("wrong argument %"PRIsVALUE" for '%s' (expected a %s) at %s:%d:in `%s'",
20
+ rb_inspect(value),
21
+ value_name,
22
+ type_name,
23
+ file,
24
+ line,
25
+ function_name
20
26
  )
21
27
  );
28
+ rb_ivar_set(exception, telemetry_message_id, simple_message);
29
+ rb_exc_raise(exception);
22
30
  }
23
31
 
24
32
  // Raises an exception with separate telemetry-safe and detailed messages.
@@ -5,6 +5,13 @@
5
5
  #include <ruby.h>
6
6
  #include <datadog/common.h>
7
7
 
8
+ // All recommended backward compatible macros for keyword argument functions can be found here:
9
+ // https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#defining-backward-compatible-macros-for-keyword-argument-functions
10
+ #ifndef RB_PASS_KEYWORDS
11
+ /* Only define macros on Ruby <2.7 */
12
+ #define rb_funcallv_kw(o, m, c, v, kw) rb_funcallv(o, m, c, v)
13
+ #endif
14
+
8
15
  // Must be called once during initialization
9
16
  void datadog_ruby_common_init(void);
10
17
 
@@ -94,7 +94,7 @@ append_cflags "-Wno-error=typedef-redefinition" if ENV["DATADOG_GEM_CI"] == "tru
94
94
  # * by msgpack, another datadog gem dependency
95
95
  # (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
96
96
  # @ivoanjo: We could probably start using C11/gnu11 for non macOS-too but it's somewhat hard to validate so I chickened out for now
97
- append_cflags RUBY_PLATFORM.include?('darwin') ? '-std=gnu11' : '-std=gnu99'
97
+ append_cflags RUBY_PLATFORM.include?("darwin") ? "-std=gnu11" : "-std=gnu99"
98
98
 
99
99
  # Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
100
100
  append_cflags "-Wno-unused-function"
@@ -139,13 +139,6 @@ end
139
139
 
140
140
  have_func "malloc_stats"
141
141
 
142
- # Used to get native filenames (dladdr1 is preferred, so we only check for the other if not available)
143
- # Note it's possible none are available
144
- if have_header("dlfcn.h")
145
- (have_struct_member("struct link_map", "l_name", "link.h") && have_func("dladdr1")) ||
146
- have_func("dladdr")
147
- end
148
-
149
142
  # On older Rubies, there was no primitive mutex and condition variable implemented in `thread_sync.rb` (internal)
150
143
  $defs << "-DNO_PRIMITIVE_MUTEX_AND_CONDITION_VARIABLE" if RUBY_VERSION < "4"
151
144
 
@@ -182,9 +175,18 @@ $defs << "-DUSE_RACTOR_INTERNAL_APIS_DIRECTLY" if RUBY_VERSION < "3.3"
182
175
  # On older Rubies, there was no GVL instrumentation API and APIs created to support it
183
176
  $defs << "-DNO_GVL_INSTRUMENTATION" if RUBY_VERSION < "3.2"
184
177
 
178
+ # On older Rubies, rb_class_attached_object is not available
179
+ $defs << "-DNO_CLASS_ATTACHED_OBJECT" if RUBY_VERSION < "3.2"
180
+
181
+ # On older Rubies, rb_mod_name allocates (rb_str_dup); use rb_attr_get(__classpath__) instead
182
+ $defs << "-DNO_ALLOC_FREE_MOD_NAME" if RUBY_VERSION < "2.7"
183
+
185
184
  # rb_internal_thread_specific_*()
186
185
  $defs << "-DHAVE_RUBY_THREAD_STORAGE_API" if RUBY_VERSION >= "3.3"
187
186
 
187
+ # RCLASS_EXT(mod)->permanent_classpath
188
+ $defs << "-DHAVE_PERMANENT_CLASSPATH" if RUBY_VERSION >= "3.3"
189
+
188
190
  # On older Rubies, there was no struct rb_native_thread. See private_vm_api_acccess.c for details.
189
191
  $defs << "-DNO_RB_NATIVE_THREAD" if RUBY_VERSION < "3.2"
190
192
 
@@ -207,6 +209,9 @@ $defs << "-DNO_THREAD_TID" if RUBY_VERSION < "3.1"
207
209
  # On older Rubies, there was no jit_return member on the rb_control_frame_t struct
208
210
  $defs << "-DNO_JIT_RETURN" if RUBY_VERSION < "3.1"
209
211
 
212
+ # internal/class.h is available since 3.0
213
+ $defs << "-DNO_INTERNAL_CLASS_HEADER_INCLUDE" if RUBY_VERSION < "3"
214
+
210
215
  # On older Rubies, there are no Ractors
211
216
  $defs << "-DNO_RACTORS" if RUBY_VERSION < "3"
212
217
 
@@ -30,6 +30,13 @@
30
30
  #include <iseq.h>
31
31
  #pragma GCC diagnostic pop
32
32
 
33
+ #ifndef NO_INTERNAL_CLASS_HEADER_INCLUDE
34
+ #pragma GCC diagnostic push
35
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
36
+ #include <internal/class.h>
37
+ #pragma GCC diagnostic pop
38
+ #endif
39
+
33
40
  #include <ruby.h>
34
41
 
35
42
  #ifndef NO_RACTOR_HEADER_INCLUDE
@@ -38,6 +45,7 @@
38
45
  #include <ractor_core.h>
39
46
  #pragma GCC diagnostic pop
40
47
  #endif
48
+
41
49
  #endif
42
50
 
43
51
  // This file can't include datadog_ruby_common.h so we replicate this here
@@ -50,6 +58,8 @@
50
58
  #define PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
51
59
  #include "private_vm_api_access.h"
52
60
 
61
+ static inline const rb_callable_method_entry_t* get_cfunc_method_entry(const rb_control_frame_t *cfp);
62
+
53
63
  // MRI has a similar rb_thread_ptr() function which we can't call it directly
54
64
  // because Ruby does not expose the thread_data_type publicly.
55
65
  // Instead, we have our own version of that function, and we lazily initialize the thread_data_type pointer
@@ -76,18 +86,6 @@ rb_nativethread_id_t pthread_id_for(VALUE thread) {
76
86
  #endif
77
87
  }
78
88
 
79
- size_t sizeof_rb_iseq_t(void) {
80
- return sizeof(rb_iseq_t);
81
- }
82
-
83
- VALUE ddtrace_iseq_base_label(const void *iseq) {
84
- return rb_iseq_base_label((const rb_iseq_t *)iseq);
85
- }
86
-
87
- VALUE ddtrace_iseq_path(const void *iseq) {
88
- return rb_iseq_path((const rb_iseq_t *)iseq);
89
- }
90
-
91
89
  // Queries if the current thread is the owner of the global VM lock.
92
90
  //
93
91
  // @ivoanjo: Ruby has a similarly-named `ruby_thread_has_gvl_p` but that API is insufficient for our needs because it can
@@ -514,48 +512,43 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
514
512
  // rb_profile_frames does not do this check, but `backtrace_each` (`vm_backtrace.c`) does. This frame is not
515
513
  // exposed by the Ruby backtrace APIs and for now we want to match its behavior 1:1
516
514
  }
515
+ else if (cfp->ep == NULL) {
516
+ // Do nothing -- this frame should not be used
517
+ //
518
+ // We're not sure this can ever happen, but we've seen a crash inside `VM_FRAME_RUBYFRAME_P` below (which
519
+ // dereferences `cfp->ep`), so "just in case" we're adding this extra sanity check to avoid crashing on a
520
+ // NULL `ep`.
521
+ }
517
522
  else if (VM_FRAME_RUBYFRAME_P(cfp)) {
518
523
  if (start > 0) {
519
524
  start--;
520
525
  continue;
521
526
  }
522
527
 
528
+ cme = rb_vm_frame_method_entry(cfp);
529
+
530
+ // Upstream (Ruby 4.0) does:
531
+ // if (cme && cme->def->type == VM_METHOD_TYPE_ISEQ) {
532
+ // buff[i] = (VALUE)cme;
533
+ // } else {
534
+ // buff[i] = (VALUE)cfp->iseq;
535
+ // }
536
+ // We get both the iseq and CME because we need both to format like Ruby backtraces
537
+
523
538
  stack_buffer[i].same_frame =
524
539
  stack_buffer[i].is_ruby_frame &&
525
- stack_buffer[i].as.ruby_frame.iseq == (VALUE) cfp->iseq &&
526
- stack_buffer[i].as.ruby_frame.caching_pc == cfp->pc;
540
+ stack_buffer[i].as.ruby_frame.iseq == cfp->iseq &&
541
+ stack_buffer[i].as.ruby_frame.caching_pc == cfp->pc &&
542
+ stack_buffer[i].cme == cme;
527
543
 
528
544
  if (stack_buffer[i].same_frame) { // Nothing to do, buffer already contains this frame
529
545
  i++;
530
546
  continue;
531
547
  }
532
548
 
533
- // dd-trace-rb NOTE:
534
- // Upstream Ruby has code here to retrieve the rb_callable_method_entry_t (cme) and in some cases to use it
535
- // instead of the iseq.
536
- // In practice, they are usually the same; the difference is that when you have e.g. block, one gets you a
537
- // reference to the block, and the other to the method containing the block.
538
- // This would be important if we used `rb_profile_frame_label` and wanted the "block in foo" label instead
539
- // of just "foo". But we're currently using `rb_profile_frame_base_label` which I believe is always the same
540
- // between the rb_callable_method_entry_t and the iseq. Thus, to simplify a bit our logic and reduce a bit
541
- // the overhead, we always use the iseq here.
542
- //
543
- // @ivoanjo: I've left the upstream Ruby code commented out below for reference, so it's more obvious that
544
- // we're diverging, and we can easily compare and experiment with the upstream version in the future.
545
- //
546
- // cme = rb_vm_frame_method_entry(cfp);
547
-
548
- // if (cme && cme->def->type == VM_METHOD_TYPE_ISEQ &&
549
- // // Fix: Do not use callable method entry when iseq is for an eval.
550
- // // TL;DR: This fix is needed for us to match the Ruby reference API information in the
551
- // // "when sampling an eval/instance eval inside an object" spec.
552
- // cfp->iseq->body->type != ISEQ_TYPE_EVAL) {
553
- // buff[i] = (VALUE)cme;
554
- // }
555
- // else {
556
- stack_buffer[i].as.ruby_frame.iseq = (VALUE)cfp->iseq;
549
+ stack_buffer[i].as.ruby_frame.iseq = cfp->iseq;
557
550
  stack_buffer[i].as.ruby_frame.caching_pc = (void *) cfp->pc;
558
- // }
551
+ stack_buffer[i].cme = cme;
559
552
 
560
553
  // The topmost frame may not have an updated PC because the JIT
561
554
  // may not have set one. The JIT compiler will update the PC
@@ -575,7 +568,7 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
575
568
  i++;
576
569
  }
577
570
  else {
578
- cme = rb_vm_frame_method_entry(cfp);
571
+ cme = get_cfunc_method_entry(cfp);
579
572
  if (cme && cme->def->type == VM_METHOD_TYPE_CFUNC) {
580
573
  if (start > 0) {
581
574
  start--;
@@ -584,16 +577,14 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
584
577
 
585
578
  stack_buffer[i].same_frame =
586
579
  !stack_buffer[i].is_ruby_frame &&
587
- stack_buffer[i].as.native_frame.caching_cme == (VALUE) cme;
580
+ stack_buffer[i].cme == cme;
588
581
 
589
582
  if (stack_buffer[i].same_frame) { // Nothing to do, buffer already contains this frame
590
583
  i++;
591
584
  continue;
592
585
  }
593
586
 
594
- stack_buffer[i].as.native_frame.caching_cme = (VALUE)cme;
595
- stack_buffer[i].as.native_frame.method_id = cme->def->original_id;
596
- stack_buffer[i].as.native_frame.function = cme->def->body.cfunc.func;
587
+ stack_buffer[i].cme = cme;
597
588
  stack_buffer[i].is_ruby_frame = false;
598
589
  i++;
599
590
  }
@@ -629,24 +620,24 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
629
620
  // to support our custom rb_profile_frames (see above)
630
621
  // Modifications:
631
622
  // * Removed debug checks (they were ifdef'd out anyway)
623
+ // * Optimized to avoid recursion
632
624
  static rb_callable_method_entry_t *
633
- check_method_entry(VALUE obj, int can_be_svar)
634
- {
635
- if (obj == Qfalse) return NULL;
636
-
637
- switch (imemo_type(obj)) {
638
- case imemo_ment:
639
- return (rb_callable_method_entry_t *)obj;
640
- case imemo_cref:
641
- return NULL;
642
- case imemo_svar:
643
- if (can_be_svar) {
644
- return check_method_entry(((struct vm_svar *)obj)->cref_or_me, FALSE);
645
- }
646
- // fallthrough
647
- default:
648
- return NULL;
625
+ check_method_entry(VALUE obj, int can_be_svar) {
626
+ if (obj == Qfalse) {
627
+ return NULL;
628
+ }
629
+
630
+ enum imemo_type type = imemo_type(obj);
631
+ if (type == imemo_ment) {
632
+ return (rb_callable_method_entry_t *)obj;
633
+ } else if (can_be_svar && type == imemo_svar) {
634
+ VALUE cref_or_me = ((struct vm_svar *)obj)->cref_or_me;
635
+ if (imemo_type(cref_or_me) == imemo_ment) {
636
+ return (rb_callable_method_entry_t *)cref_or_me;
649
637
  }
638
+ }
639
+
640
+ return NULL;
650
641
  }
651
642
 
652
643
  // Taken from upstream vm_insnhelper.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
@@ -664,7 +655,9 @@ rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
664
655
  rb_callable_method_entry_t *me;
665
656
 
666
657
  while (!VM_ENV_LOCAL_P(ep)) {
667
- if ((me = check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], FALSE)) != NULL) return me;
658
+ if ((me = check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], FALSE)) != NULL) {
659
+ return me;
660
+ }
668
661
  ep = VM_ENV_PREV_EP(ep);
669
662
  }
670
663
 
@@ -672,6 +665,16 @@ rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
672
665
  }
673
666
  #endif // RUBY_MJIT_HEADER
674
667
 
668
+ // Optimized version of rb_vm_frame_method_entry() for cfunc frames.
669
+ // Cfunc frames always have VM_ENV_FLAG_LOCAL set, so ep[-2] is the cme directly
670
+ // with no EP chain walk needed. The only complication is cfuncs that set $~ or $_
671
+ // (e.g. Regexp#match, String#gsub) which replace ep[-2] with an imemo_svar wrapping
672
+ // the cme - in that case svar->cref_or_me is always the cme (never a cref).
673
+ static inline const rb_callable_method_entry_t *
674
+ get_cfunc_method_entry(const rb_control_frame_t *cfp) {
675
+ return check_method_entry(cfp->ep[VM_ENV_DATA_INDEX_ME_CREF], TRUE);
676
+ }
677
+
675
678
  #ifndef NO_RACTORS
676
679
  // This API and definition are exported as a public symbol by the VM BUT the function header is not defined in any public header, so we
677
680
  // repeat it here to be able to use in our code.
@@ -743,7 +746,7 @@ VALUE invoke_location_for(VALUE thread, int *line_location) {
743
746
  if (iseq == NULL) return Qnil;
744
747
 
745
748
  *line_location = NUM2INT(rb_iseq_first_lineno(iseq));
746
- return rb_iseq_path(iseq);
749
+ return ddtrace_iseq_path(iseq);
747
750
  }
748
751
 
749
752
  void self_test_mn_enabled(void) {
@@ -872,7 +875,198 @@ bool is_raised_flag_set(VALUE thread) { return thread_struct_from_object(thread)
872
875
  void self_test_current_fiber_for(void) { } // Nothing to do
873
876
  #endif
874
877
 
875
- bool pathobj_is_null(VALUE iseq) {
876
- const rb_iseq_t *iseq_ptr = (const rb_iseq_t *) iseq;
877
- return ISEQ_BODY(iseq_ptr)->location.pathobj == 0;
878
+ // Variant of functions related to Thread::Backtrace::Location#label in Ruby 4.0
879
+ // (location_label(), rb_gen_method_name(), calculate_iseq_label()),
880
+ // but formatting using a C buffer instead of allocating Ruby Strings.
881
+ // Also, those functions are static functions in vm_backtrace.c so not reusable.
882
+ // There is also AFAIK no reasonable way to create a rb_backtrace_location_t from outside that file.
883
+
884
+ // Return true if a given location is a C method or supposed to behave like one.
885
+ static bool location_cfunc_p(const rb_callable_method_entry_t *cme) {
886
+ if (!cme) return false;
887
+
888
+ switch (cme->def->type) {
889
+ case VM_METHOD_TYPE_CFUNC:
890
+ return true;
891
+ // Upstream, but we don't want that behavior:
892
+ // case VM_METHOD_TYPE_ISEQ:
893
+ // return is_internal_location(loc->cme->def->body.iseq.iseqptr);
894
+ default:
895
+ return false;
896
+ }
897
+ }
898
+
899
+ // RCLASS_SINGLETON_P() is only defined on Ruby 3.4+, so we have a copy for older versions
900
+ static bool ddtrace_RCLASS_SINGLETON_P(VALUE klass) {
901
+ return RB_TYPE_P(klass, T_CLASS) && FL_TEST_RAW(klass, FL_SINGLETON);
902
+ }
903
+
904
+ static VALUE get_class_attached_object(VALUE klass) {
905
+ #ifndef NO_CLASS_ATTACHED_OBJECT
906
+ return rb_class_attached_object(klass);
907
+ #else
908
+ return rb_ivar_get(klass, rb_intern("__attached__"));
909
+ #endif
910
+ }
911
+
912
+ static bool is_metaclass(VALUE mod, VALUE* attached) {
913
+ if (ddtrace_RCLASS_SINGLETON_P(mod)) {
914
+ VALUE attached_object = get_class_attached_object(mod);
915
+ if (RB_TYPE_P(attached_object, T_CLASS) || RB_TYPE_P(attached_object, T_MODULE)) {
916
+ *attached = attached_object;
917
+ return true;
918
+ }
919
+ }
920
+ return false;
921
+ }
922
+
923
+ static VALUE alloc_free_rb_mod_name(VALUE mod) {
924
+ #ifdef NO_ALLOC_FREE_MOD_NAME
925
+ return rb_attr_get(mod, rb_intern("__classpath__"));
926
+ #else
927
+ return rb_mod_name(mod);
928
+ #endif
929
+ }
930
+
931
+ // Ruby 3.3+ has a `permanent_classpath` flag on rb_classext_struct.
932
+ // Checking for '#' in the name is equivalent on older Rubies:
933
+ // non-permanent names contain '#' from `#<Module:0x...>` or `#<Class:0x...>` prefixes.
934
+ static bool has_permanent_classpath(DDTRACE_UNUSED VALUE mod, DDTRACE_UNUSED VALUE mod_name) {
935
+ #if defined(RCLASS_PERMANENT_CLASSPATH_P) // 4.0+
936
+ return RCLASS_PERMANENT_CLASSPATH_P(mod);
937
+ #elif defined(HAVE_PERMANENT_CLASSPATH) // 3.3 - 3.4
938
+ return RCLASS_EXT(mod)->permanent_classpath;
939
+ #else // 3.2 and older
940
+ return memchr(RSTRING_PTR(mod_name), '#', RSTRING_LEN(mod_name)) == NULL;
941
+ #endif
942
+ }
943
+
944
+ #define ONLY_METHOD_NAME ((ssize_t) -1)
945
+ #define BUFFER_OUT_OF_SPACE ((ssize_t) -2)
946
+
947
+ static ssize_t rb_gen_method_name(VALUE owner, VALUE method_name, char *buf, size_t buf_size) {
948
+ if (!(RB_TYPE_P(owner, T_CLASS) || RB_TYPE_P(owner, T_MODULE))) {
949
+ return ONLY_METHOD_NAME;
950
+ }
951
+
952
+ VALUE mod = owner;
953
+ char separator = '#';
954
+ if (is_metaclass(owner, &mod)) {
955
+ separator = '.';
956
+ }
957
+ VALUE mod_name = alloc_free_rb_mod_name(mod);
958
+
959
+ // Exclude non-permanent names (e.g. `#<Module:0x0123>::Foo`) which break flamegraph aggregation
960
+ // since they contain addresses that differ across processes/runs.
961
+ if (NIL_P(mod_name) || !has_permanent_classpath(mod, mod_name)) {
962
+ return ONLY_METHOD_NAME;
963
+ }
964
+
965
+ size_t mod_name_len = RSTRING_LEN(mod_name);
966
+ size_t method_name_len = RSTRING_LEN(method_name);
967
+ size_t total = mod_name_len + 1 + method_name_len;
968
+ if (total <= buf_size) {
969
+ memcpy(buf, RSTRING_PTR(mod_name), mod_name_len);
970
+ buf[mod_name_len] = separator;
971
+ memcpy(buf + mod_name_len + 1, RSTRING_PTR(method_name), method_name_len);
972
+ return total;
973
+ } else {
974
+ return BUFFER_OUT_OF_SPACE;
975
+ }
976
+ }
977
+
978
+ static ssize_t calculate_iseq_label(VALUE owner, const rb_iseq_t *iseq, char *buf, size_t buf_size) {
979
+ switch (ISEQ_BODY(iseq)->type) {
980
+ case ISEQ_TYPE_TOP:
981
+ case ISEQ_TYPE_CLASS:
982
+ case ISEQ_TYPE_MAIN:
983
+ // Just the method name, not `Object#<top (required)>`
984
+ return ONLY_METHOD_NAME;
985
+
986
+ case ISEQ_TYPE_METHOD:
987
+ return rb_gen_method_name(owner, ISEQ_BODY(iseq)->location.label, buf, buf_size);
988
+
989
+ #ifdef ISEQ_TYPE_PLAIN /* 2.5 does not have it */
990
+ case ISEQ_TYPE_PLAIN:
991
+ #endif
992
+ case ISEQ_TYPE_BLOCK: {
993
+ // CRuby uses "block in Foo#bar" and ""block (N levels) in Foo#bar" in backtraces.
994
+ // We use "Foo#bar (block)" because it's much faster and looks better in the UI.
995
+ const rb_iseq_t* method_iseq = ISEQ_BODY(iseq)->local_iseq;
996
+
997
+ static const char suffix[] = " (block)";
998
+ size_t suffix_len = sizeof(suffix) - 1;
999
+
1000
+ // Only use the result if there is enough space for both parts
1001
+ ssize_t written = calculate_iseq_label(owner, method_iseq, buf, buf_size);
1002
+ if (written > 0 && (written + suffix_len) <= buf_size) {
1003
+ memcpy(buf + written, suffix, suffix_len);
1004
+ return written + suffix_len;
1005
+ } else if (written == ONLY_METHOD_NAME) {
1006
+ VALUE method_name = rb_iseq_base_label(method_iseq);
1007
+ size_t method_name_len = RSTRING_LEN(method_name);
1008
+ if ((method_name_len + suffix_len) <= buf_size) {
1009
+ memcpy(buf, RSTRING_PTR(method_name), method_name_len);
1010
+ memcpy(buf + method_name_len, suffix, suffix_len);
1011
+ return method_name_len + suffix_len;
1012
+ }
1013
+ }
1014
+
1015
+ return BUFFER_OUT_OF_SPACE;
1016
+ }
1017
+
1018
+ case ISEQ_TYPE_RESCUE:
1019
+ case ISEQ_TYPE_ENSURE:
1020
+ case ISEQ_TYPE_EVAL:
1021
+ iseq = ISEQ_BODY(iseq)->parent_iseq;
1022
+ return calculate_iseq_label(owner, iseq, buf, buf_size);
1023
+
1024
+ default:
1025
+ // Upstream: rb_bug("calculate_iseq_label: unreachable");
1026
+ return ONLY_METHOD_NAME;
1027
+ }
1028
+ }
1029
+
1030
+ // MRI: location_label()
1031
+ // C methods don't have an iseq, only Ruby methods have
1032
+ ssize_t ddtrace_location_label(const rb_callable_method_entry_t *cme, const rb_iseq_t *iseq, char *buf, size_t buf_size) {
1033
+ if (location_cfunc_p(cme)) {
1034
+ VALUE method_name = rb_id2str(cme->def->original_id);
1035
+ return rb_gen_method_name(cme->owner, method_name, buf, buf_size);
1036
+ } else {
1037
+ VALUE owner = cme ? cme->owner : Qnil;
1038
+ return calculate_iseq_label(owner, iseq, buf, buf_size);
1039
+ }
1040
+ }
1041
+
1042
+ VALUE ddtrace_location_base_label(const rb_callable_method_entry_t *cme, const rb_iseq_t *iseq) {
1043
+ if (location_cfunc_p(cme)) {
1044
+ return rb_id2str(cme->def->original_id);
1045
+ } else {
1046
+ return rb_iseq_base_label(iseq);
1047
+ }
1048
+ }
1049
+
1050
+ VALUE ddtrace_iseq_base_label(const rb_iseq_t *iseq) {
1051
+ return rb_iseq_base_label(iseq);
1052
+ }
1053
+
1054
+ VALUE ddtrace_iseq_path(const rb_iseq_t *iseq) {
1055
+ return rb_iseq_path(iseq);
1056
+ }
1057
+
1058
+ size_t sizeof_rb_iseq_t(void) {
1059
+ return sizeof(rb_iseq_t);
1060
+ }
1061
+
1062
+ size_t sizeof_rb_callable_method_entry_t(void) {
1063
+ return sizeof(rb_callable_method_entry_t);
1064
+ }
1065
+
1066
+ void* ddtrace_cme_cfunc_func(const rb_callable_method_entry_t *cme) {
1067
+ return cme->def->body.cfunc.func;
1068
+ }
1069
+
1070
+ const char *ddtrace_cme_original_method_name(const rb_callable_method_entry_t *cme) {
1071
+ return rb_id2name(cme->def->original_id);
878
1072
  }