datadog 2.0.0.beta1

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 (764) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +4236 -0
  3. data/LICENSE +6 -0
  4. data/LICENSE-3rdparty.csv +7 -0
  5. data/LICENSE.Apache +200 -0
  6. data/LICENSE.BSD3 +24 -0
  7. data/NOTICE +4 -0
  8. data/README.md +25 -0
  9. data/bin/ddprofrb +15 -0
  10. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +134 -0
  11. data/ext/datadog_profiling_loader/extconf.rb +72 -0
  12. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +156 -0
  13. data/ext/datadog_profiling_native_extension/clock_id.h +22 -0
  14. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +56 -0
  15. data/ext/datadog_profiling_native_extension/clock_id_noop.c +22 -0
  16. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +1153 -0
  17. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
  18. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
  19. data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.c +150 -0
  20. data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.h +18 -0
  21. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
  22. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
  23. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +244 -0
  24. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  25. data/ext/datadog_profiling_native_extension/collectors_stack.c +372 -0
  26. data/ext/datadog_profiling_native_extension/collectors_stack.h +27 -0
  27. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +1391 -0
  28. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -0
  29. data/ext/datadog_profiling_native_extension/extconf.rb +302 -0
  30. data/ext/datadog_profiling_native_extension/heap_recorder.c +970 -0
  31. data/ext/datadog_profiling_native_extension/heap_recorder.h +155 -0
  32. data/ext/datadog_profiling_native_extension/helpers.h +23 -0
  33. data/ext/datadog_profiling_native_extension/http_transport.c +375 -0
  34. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
  35. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
  36. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +319 -0
  37. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +892 -0
  38. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +61 -0
  39. data/ext/datadog_profiling_native_extension/profiling.c +267 -0
  40. data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
  41. data/ext/datadog_profiling_native_extension/ruby_helpers.h +119 -0
  42. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +115 -0
  43. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +11 -0
  44. data/ext/datadog_profiling_native_extension/stack_recorder.c +941 -0
  45. data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
  46. data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
  47. data/ext/datadog_profiling_native_extension/time_helpers.h +26 -0
  48. data/lib/datadog/appsec/assets/blocked.html +99 -0
  49. data/lib/datadog/appsec/assets/blocked.json +1 -0
  50. data/lib/datadog/appsec/assets/blocked.text +5 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +7 -0
  52. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  53. data/lib/datadog/appsec/assets/waf_rules/recommended.json +7703 -0
  54. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  55. data/lib/datadog/appsec/assets/waf_rules/strict.json +1635 -0
  56. data/lib/datadog/appsec/assets.rb +46 -0
  57. data/lib/datadog/appsec/autoload.rb +13 -0
  58. data/lib/datadog/appsec/component.rb +94 -0
  59. data/lib/datadog/appsec/configuration/settings.rb +202 -0
  60. data/lib/datadog/appsec/configuration.rb +11 -0
  61. data/lib/datadog/appsec/contrib/auto_instrument.rb +25 -0
  62. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  63. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  64. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  65. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  66. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  68. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  69. data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
  70. data/lib/datadog/appsec/contrib/integration.rb +37 -0
  71. data/lib/datadog/appsec/contrib/patcher.rb +12 -0
  72. data/lib/datadog/appsec/contrib/rack/ext.rb +13 -0
  73. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +104 -0
  74. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
  75. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +162 -0
  76. data/lib/datadog/appsec/contrib/rack/integration.rb +44 -0
  77. data/lib/datadog/appsec/contrib/rack/patcher.rb +34 -0
  78. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +81 -0
  79. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +60 -0
  80. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +66 -0
  81. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +44 -0
  82. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +196 -0
  83. data/lib/datadog/appsec/contrib/rails/ext.rb +13 -0
  84. data/lib/datadog/appsec/contrib/rails/framework.rb +16 -0
  85. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
  86. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +71 -0
  87. data/lib/datadog/appsec/contrib/rails/integration.rb +43 -0
  88. data/lib/datadog/appsec/contrib/rails/patcher.rb +166 -0
  89. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +66 -0
  90. data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
  91. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
  92. data/lib/datadog/appsec/contrib/sinatra/ext.rb +14 -0
  93. data/lib/datadog/appsec/contrib/sinatra/framework.rb +20 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
  95. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
  96. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +117 -0
  97. data/lib/datadog/appsec/contrib/sinatra/integration.rb +43 -0
  98. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +168 -0
  99. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +61 -0
  100. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
  101. data/lib/datadog/appsec/event.rb +171 -0
  102. data/lib/datadog/appsec/ext.rb +10 -0
  103. data/lib/datadog/appsec/extensions.rb +15 -0
  104. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +22 -0
  105. data/lib/datadog/appsec/instrumentation/gateway.rb +64 -0
  106. data/lib/datadog/appsec/instrumentation.rb +9 -0
  107. data/lib/datadog/appsec/monitor/gateway/watcher.rb +67 -0
  108. data/lib/datadog/appsec/monitor/reactive/set_user.rb +58 -0
  109. data/lib/datadog/appsec/monitor.rb +11 -0
  110. data/lib/datadog/appsec/processor/actions.rb +49 -0
  111. data/lib/datadog/appsec/processor/rule_loader.rb +123 -0
  112. data/lib/datadog/appsec/processor/rule_merger.rb +152 -0
  113. data/lib/datadog/appsec/processor.rb +171 -0
  114. data/lib/datadog/appsec/rate_limiter.rb +60 -0
  115. data/lib/datadog/appsec/reactive/address_hash.rb +22 -0
  116. data/lib/datadog/appsec/reactive/engine.rb +47 -0
  117. data/lib/datadog/appsec/reactive/operation.rb +68 -0
  118. data/lib/datadog/appsec/reactive/subscriber.rb +19 -0
  119. data/lib/datadog/appsec/remote.rb +129 -0
  120. data/lib/datadog/appsec/response.rb +151 -0
  121. data/lib/datadog/appsec/sample_rate.rb +21 -0
  122. data/lib/datadog/appsec/scope.rb +61 -0
  123. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  124. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  125. data/lib/datadog/appsec/utils/http.rb +11 -0
  126. data/lib/datadog/appsec/utils.rb +9 -0
  127. data/lib/datadog/appsec.rb +60 -0
  128. data/lib/datadog/auto_instrument.rb +16 -0
  129. data/lib/datadog/auto_instrument_base.rb +8 -0
  130. data/lib/datadog/core/buffer/cruby.rb +55 -0
  131. data/lib/datadog/core/buffer/random.rb +134 -0
  132. data/lib/datadog/core/buffer/thread_safe.rb +58 -0
  133. data/lib/datadog/core/chunker.rb +35 -0
  134. data/lib/datadog/core/configuration/agent_settings_resolver.rb +352 -0
  135. data/lib/datadog/core/configuration/base.rb +91 -0
  136. data/lib/datadog/core/configuration/components.rb +177 -0
  137. data/lib/datadog/core/configuration/ext.rb +45 -0
  138. data/lib/datadog/core/configuration/option.rb +319 -0
  139. data/lib/datadog/core/configuration/option_definition.rb +165 -0
  140. data/lib/datadog/core/configuration/options.rb +128 -0
  141. data/lib/datadog/core/configuration/settings.rb +786 -0
  142. data/lib/datadog/core/configuration.rb +296 -0
  143. data/lib/datadog/core/diagnostics/environment_logger.rb +173 -0
  144. data/lib/datadog/core/diagnostics/health.rb +19 -0
  145. data/lib/datadog/core/encoding.rb +74 -0
  146. data/lib/datadog/core/environment/cgroup.rb +53 -0
  147. data/lib/datadog/core/environment/class_count.rb +21 -0
  148. data/lib/datadog/core/environment/container.rb +91 -0
  149. data/lib/datadog/core/environment/execution.rb +103 -0
  150. data/lib/datadog/core/environment/ext.rb +45 -0
  151. data/lib/datadog/core/environment/gc.rb +20 -0
  152. data/lib/datadog/core/environment/git.rb +25 -0
  153. data/lib/datadog/core/environment/identity.rb +84 -0
  154. data/lib/datadog/core/environment/platform.rb +40 -0
  155. data/lib/datadog/core/environment/socket.rb +24 -0
  156. data/lib/datadog/core/environment/thread_count.rb +20 -0
  157. data/lib/datadog/core/environment/variable_helpers.rb +53 -0
  158. data/lib/datadog/core/environment/vm_cache.rb +64 -0
  159. data/lib/datadog/core/environment/yjit.rb +58 -0
  160. data/lib/datadog/core/error.rb +100 -0
  161. data/lib/datadog/core/extensions.rb +16 -0
  162. data/lib/datadog/core/git/ext.rb +16 -0
  163. data/lib/datadog/core/header_collection.rb +43 -0
  164. data/lib/datadog/core/logger.rb +45 -0
  165. data/lib/datadog/core/logging/ext.rb +13 -0
  166. data/lib/datadog/core/metrics/client.rb +199 -0
  167. data/lib/datadog/core/metrics/ext.rb +18 -0
  168. data/lib/datadog/core/metrics/helpers.rb +25 -0
  169. data/lib/datadog/core/metrics/logging.rb +44 -0
  170. data/lib/datadog/core/metrics/metric.rb +14 -0
  171. data/lib/datadog/core/metrics/options.rb +52 -0
  172. data/lib/datadog/core/pin.rb +75 -0
  173. data/lib/datadog/core/remote/client/capabilities.rb +62 -0
  174. data/lib/datadog/core/remote/client.rb +234 -0
  175. data/lib/datadog/core/remote/component.rb +162 -0
  176. data/lib/datadog/core/remote/configuration/content.rb +111 -0
  177. data/lib/datadog/core/remote/configuration/digest.rb +62 -0
  178. data/lib/datadog/core/remote/configuration/path.rb +90 -0
  179. data/lib/datadog/core/remote/configuration/repository.rb +294 -0
  180. data/lib/datadog/core/remote/configuration/target.rb +74 -0
  181. data/lib/datadog/core/remote/configuration.rb +18 -0
  182. data/lib/datadog/core/remote/dispatcher.rb +59 -0
  183. data/lib/datadog/core/remote/ext.rb +13 -0
  184. data/lib/datadog/core/remote/negotiation.rb +70 -0
  185. data/lib/datadog/core/remote/tie/tracing.rb +39 -0
  186. data/lib/datadog/core/remote/tie.rb +27 -0
  187. data/lib/datadog/core/remote/transport/config.rb +60 -0
  188. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  189. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  190. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  191. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  192. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  193. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  194. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  195. data/lib/datadog/core/remote/transport/http.rb +147 -0
  196. data/lib/datadog/core/remote/transport/negotiation.rb +62 -0
  197. data/lib/datadog/core/remote/worker.rb +102 -0
  198. data/lib/datadog/core/remote.rb +24 -0
  199. data/lib/datadog/core/runtime/ext.rb +38 -0
  200. data/lib/datadog/core/runtime/metrics.rb +185 -0
  201. data/lib/datadog/core/telemetry/client.rb +87 -0
  202. data/lib/datadog/core/telemetry/collector.rb +248 -0
  203. data/lib/datadog/core/telemetry/emitter.rb +50 -0
  204. data/lib/datadog/core/telemetry/event.rb +83 -0
  205. data/lib/datadog/core/telemetry/ext.rb +15 -0
  206. data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
  207. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  208. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  209. data/lib/datadog/core/telemetry/http/ext.rb +22 -0
  210. data/lib/datadog/core/telemetry/http/response.rb +66 -0
  211. data/lib/datadog/core/telemetry/http/transport.rb +56 -0
  212. data/lib/datadog/core/telemetry/v1/app_event.rb +59 -0
  213. data/lib/datadog/core/telemetry/v1/application.rb +94 -0
  214. data/lib/datadog/core/telemetry/v1/configuration.rb +27 -0
  215. data/lib/datadog/core/telemetry/v1/dependency.rb +45 -0
  216. data/lib/datadog/core/telemetry/v1/host.rb +59 -0
  217. data/lib/datadog/core/telemetry/v1/install_signature.rb +38 -0
  218. data/lib/datadog/core/telemetry/v1/integration.rb +66 -0
  219. data/lib/datadog/core/telemetry/v1/product.rb +36 -0
  220. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +108 -0
  221. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
  222. data/lib/datadog/core/telemetry/v2/request.rb +29 -0
  223. data/lib/datadog/core/transport/ext.rb +43 -0
  224. data/lib/datadog/core/transport/http/adapters/net.rb +159 -0
  225. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  226. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  227. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  228. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  229. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  230. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  231. data/lib/datadog/core/transport/http/env.rb +62 -0
  232. data/lib/datadog/core/transport/http/response.rb +60 -0
  233. data/lib/datadog/core/transport/parcel.rb +22 -0
  234. data/lib/datadog/core/transport/request.rb +17 -0
  235. data/lib/datadog/core/transport/response.rb +64 -0
  236. data/lib/datadog/core/utils/duration.rb +52 -0
  237. data/lib/datadog/core/utils/forking.rb +63 -0
  238. data/lib/datadog/core/utils/hash.rb +79 -0
  239. data/lib/datadog/core/utils/network.rb +121 -0
  240. data/lib/datadog/core/utils/only_once.rb +42 -0
  241. data/lib/datadog/core/utils/safe_dup.rb +40 -0
  242. data/lib/datadog/core/utils/sequence.rb +26 -0
  243. data/lib/datadog/core/utils/time.rb +52 -0
  244. data/lib/datadog/core/utils/url.rb +25 -0
  245. data/lib/datadog/core/utils.rb +94 -0
  246. data/lib/datadog/core/vendor/multipart-post/LICENSE +11 -0
  247. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +118 -0
  248. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +59 -0
  249. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +137 -0
  250. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +11 -0
  251. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +10 -0
  252. data/lib/datadog/core/vendor/multipart-post/multipart.rb +14 -0
  253. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +34 -0
  254. data/lib/datadog/core/worker.rb +24 -0
  255. data/lib/datadog/core/workers/async.rb +185 -0
  256. data/lib/datadog/core/workers/interval_loop.rb +123 -0
  257. data/lib/datadog/core/workers/polling.rb +59 -0
  258. data/lib/datadog/core/workers/queue.rb +44 -0
  259. data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
  260. data/lib/datadog/core.rb +45 -0
  261. data/lib/datadog/kit/appsec/events.rb +169 -0
  262. data/lib/datadog/kit/enable_core_dumps.rb +49 -0
  263. data/lib/datadog/kit/identity.rb +104 -0
  264. data/lib/datadog/kit.rb +11 -0
  265. data/lib/datadog/opentelemetry/api/context.rb +193 -0
  266. data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
  267. data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
  268. data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
  269. data/lib/datadog/opentelemetry/sdk/propagator.rb +92 -0
  270. data/lib/datadog/opentelemetry/sdk/span_processor.rb +134 -0
  271. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  272. data/lib/datadog/opentelemetry/trace.rb +59 -0
  273. data/lib/datadog/opentelemetry.rb +51 -0
  274. data/lib/datadog/profiling/collectors/code_provenance.rb +113 -0
  275. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +114 -0
  276. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  277. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +70 -0
  278. data/lib/datadog/profiling/collectors/info.rb +103 -0
  279. data/lib/datadog/profiling/collectors/stack.rb +13 -0
  280. data/lib/datadog/profiling/collectors/thread_context.rb +61 -0
  281. data/lib/datadog/profiling/component.rb +418 -0
  282. data/lib/datadog/profiling/exporter.rb +103 -0
  283. data/lib/datadog/profiling/ext/forking.rb +98 -0
  284. data/lib/datadog/profiling/ext.rb +35 -0
  285. data/lib/datadog/profiling/flush.rb +43 -0
  286. data/lib/datadog/profiling/http_transport.rb +143 -0
  287. data/lib/datadog/profiling/load_native_extension.rb +28 -0
  288. data/lib/datadog/profiling/native_extension.rb +20 -0
  289. data/lib/datadog/profiling/preload.rb +5 -0
  290. data/lib/datadog/profiling/profiler.rb +64 -0
  291. data/lib/datadog/profiling/scheduler.rb +137 -0
  292. data/lib/datadog/profiling/stack_recorder.rb +69 -0
  293. data/lib/datadog/profiling/tag_builder.rb +60 -0
  294. data/lib/datadog/profiling/tasks/exec.rb +50 -0
  295. data/lib/datadog/profiling/tasks/help.rb +18 -0
  296. data/lib/datadog/profiling/tasks/setup.rb +60 -0
  297. data/lib/datadog/profiling.rb +152 -0
  298. data/lib/datadog/tracing/analytics.rb +25 -0
  299. data/lib/datadog/tracing/buffer.rb +129 -0
  300. data/lib/datadog/tracing/client_ip.rb +61 -0
  301. data/lib/datadog/tracing/component.rb +206 -0
  302. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  303. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  304. data/lib/datadog/tracing/configuration/ext.rb +98 -0
  305. data/lib/datadog/tracing/configuration/http.rb +74 -0
  306. data/lib/datadog/tracing/configuration/settings.rb +421 -0
  307. data/lib/datadog/tracing/context.rb +68 -0
  308. data/lib/datadog/tracing/context_provider.rb +82 -0
  309. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +39 -0
  310. data/lib/datadog/tracing/contrib/action_cable/event.rb +71 -0
  311. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
  312. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
  313. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
  314. data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
  315. data/lib/datadog/tracing/contrib/action_cable/ext.rb +33 -0
  316. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +90 -0
  317. data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
  318. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
  319. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +43 -0
  320. data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
  321. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
  322. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
  323. data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
  324. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +34 -0
  325. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
  326. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
  327. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +138 -0
  328. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
  329. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +40 -0
  330. data/lib/datadog/tracing/contrib/action_pack/ext.rb +23 -0
  331. data/lib/datadog/tracing/contrib/action_pack/integration.rb +51 -0
  332. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
  333. data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
  334. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +43 -0
  335. data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
  336. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
  337. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
  338. data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
  339. data/lib/datadog/tracing/contrib/action_view/ext.rb +25 -0
  340. data/lib/datadog/tracing/contrib/action_view/integration.rb +58 -0
  341. data/lib/datadog/tracing/contrib/action_view/patcher.rb +34 -0
  342. data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
  343. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +39 -0
  344. data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
  345. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
  346. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
  347. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
  348. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
  349. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
  350. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
  351. data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
  352. data/lib/datadog/tracing/contrib/active_job/ext.rb +40 -0
  353. data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
  354. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +24 -0
  355. data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
  356. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +37 -0
  357. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +68 -0
  358. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
  359. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
  360. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
  361. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +25 -0
  362. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
  363. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +32 -0
  364. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
  365. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +147 -0
  366. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +48 -0
  367. data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
  368. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
  369. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +77 -0
  370. data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
  371. data/lib/datadog/tracing/contrib/active_record/ext.rb +30 -0
  372. data/lib/datadog/tracing/contrib/active_record/integration.rb +57 -0
  373. data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
  374. data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
  375. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +186 -0
  376. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +76 -0
  377. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
  378. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +47 -0
  379. data/lib/datadog/tracing/contrib/active_support/ext.rb +32 -0
  380. data/lib/datadog/tracing/contrib/active_support/integration.rb +52 -0
  381. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
  382. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
  383. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
  384. data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
  385. data/lib/datadog/tracing/contrib/analytics.rb +28 -0
  386. data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
  387. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +53 -0
  388. data/lib/datadog/tracing/contrib/aws/ext.rb +50 -0
  389. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +119 -0
  390. data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
  391. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +64 -0
  392. data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
  393. data/lib/datadog/tracing/contrib/aws/service/base.rb +16 -0
  394. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +22 -0
  395. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +22 -0
  396. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +32 -0
  397. data/lib/datadog/tracing/contrib/aws/service/s3.rb +22 -0
  398. data/lib/datadog/tracing/contrib/aws/service/sns.rb +30 -0
  399. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +27 -0
  400. data/lib/datadog/tracing/contrib/aws/service/states.rb +40 -0
  401. data/lib/datadog/tracing/contrib/aws/services.rb +139 -0
  402. data/lib/datadog/tracing/contrib/component.rb +41 -0
  403. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
  404. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +24 -0
  405. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
  406. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
  407. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +20 -0
  408. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +44 -0
  409. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +49 -0
  410. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  411. data/lib/datadog/tracing/contrib/configurable.rb +102 -0
  412. data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
  413. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
  414. data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
  415. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +58 -0
  416. data/lib/datadog/tracing/contrib/dalli/ext.rb +40 -0
  417. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +75 -0
  418. data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
  419. data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
  420. data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
  421. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +49 -0
  422. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +29 -0
  423. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
  424. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +37 -0
  425. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +108 -0
  426. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +34 -0
  427. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +57 -0
  428. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +34 -0
  429. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
  430. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +164 -0
  431. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +87 -0
  432. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +56 -0
  433. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +223 -0
  434. data/lib/datadog/tracing/contrib/ethon/ext.rb +32 -0
  435. data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
  436. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +102 -0
  437. data/lib/datadog/tracing/contrib/ethon/patcher.rb +30 -0
  438. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +74 -0
  439. data/lib/datadog/tracing/contrib/excon/ext.rb +30 -0
  440. data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
  441. data/lib/datadog/tracing/contrib/excon/middleware.rb +196 -0
  442. data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
  443. data/lib/datadog/tracing/contrib/ext.rb +55 -0
  444. data/lib/datadog/tracing/contrib/extensions.rb +228 -0
  445. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +77 -0
  446. data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
  447. data/lib/datadog/tracing/contrib/faraday/ext.rb +30 -0
  448. data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
  449. data/lib/datadog/tracing/contrib/faraday/middleware.rb +112 -0
  450. data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
  451. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
  452. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +55 -0
  453. data/lib/datadog/tracing/contrib/grape/endpoint.rb +256 -0
  454. data/lib/datadog/tracing/contrib/grape/ext.rb +30 -0
  455. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
  456. data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
  457. data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
  458. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +50 -0
  459. data/lib/datadog/tracing/contrib/graphql/ext.rb +20 -0
  460. data/lib/datadog/tracing/contrib/graphql/integration.rb +56 -0
  461. data/lib/datadog/tracing/contrib/graphql/patcher.rb +55 -0
  462. data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +24 -0
  463. data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +28 -0
  464. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +58 -0
  465. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +117 -0
  466. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +96 -0
  467. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +107 -0
  468. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
  469. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +46 -0
  470. data/lib/datadog/tracing/contrib/grpc/ext.rb +29 -0
  471. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  472. data/lib/datadog/tracing/contrib/grpc/integration.rb +50 -0
  473. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
  474. data/lib/datadog/tracing/contrib/grpc/patcher.rb +34 -0
  475. data/lib/datadog/tracing/contrib/grpc.rb +45 -0
  476. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  477. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +23 -0
  478. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  479. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  480. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  481. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  482. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  483. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  484. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +40 -0
  485. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +69 -0
  486. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
  487. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +45 -0
  488. data/lib/datadog/tracing/contrib/http/ext.rb +29 -0
  489. data/lib/datadog/tracing/contrib/http/instrumentation.rb +144 -0
  490. data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
  491. data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
  492. data/lib/datadog/tracing/contrib/http.rb +45 -0
  493. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
  494. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +68 -0
  495. data/lib/datadog/tracing/contrib/httpclient/ext.rb +30 -0
  496. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +137 -0
  497. data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
  498. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
  499. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +68 -0
  500. data/lib/datadog/tracing/contrib/httprb/ext.rb +29 -0
  501. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +145 -0
  502. data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
  503. data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
  504. data/lib/datadog/tracing/contrib/integration.rb +78 -0
  505. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +39 -0
  506. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +19 -0
  507. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
  508. data/lib/datadog/tracing/contrib/kafka/event.rb +53 -0
  509. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
  510. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
  511. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
  512. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
  513. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
  514. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
  515. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
  516. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +41 -0
  517. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +44 -0
  518. data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
  519. data/lib/datadog/tracing/contrib/kafka/ext.rb +55 -0
  520. data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
  521. data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
  522. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +24 -0
  523. data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
  524. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +31 -0
  525. data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
  526. data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
  527. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +56 -0
  528. data/lib/datadog/tracing/contrib/mongodb/ext.rb +38 -0
  529. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
  530. data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
  531. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
  532. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
  533. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +141 -0
  534. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +64 -0
  535. data/lib/datadog/tracing/contrib/mysql2/ext.rb +28 -0
  536. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +95 -0
  537. data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
  538. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
  539. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +54 -0
  540. data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -0
  541. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  542. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  543. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  544. data/lib/datadog/tracing/contrib/patchable.rb +109 -0
  545. data/lib/datadog/tracing/contrib/patcher.rb +85 -0
  546. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +64 -0
  547. data/lib/datadog/tracing/contrib/pg/ext.rb +35 -0
  548. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +211 -0
  549. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  550. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  551. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +52 -0
  552. data/lib/datadog/tracing/contrib/presto/ext.rb +38 -0
  553. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +138 -0
  554. data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
  555. data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
  556. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
  557. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  558. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  559. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +55 -0
  560. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +55 -0
  561. data/lib/datadog/tracing/contrib/que/ext.rb +33 -0
  562. data/lib/datadog/tracing/contrib/que/integration.rb +44 -0
  563. data/lib/datadog/tracing/contrib/que/patcher.rb +26 -0
  564. data/lib/datadog/tracing/contrib/que/tracer.rb +63 -0
  565. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +47 -0
  566. data/lib/datadog/tracing/contrib/racecar/event.rb +81 -0
  567. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +38 -0
  568. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
  569. data/lib/datadog/tracing/contrib/racecar/events/message.rb +38 -0
  570. data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
  571. data/lib/datadog/tracing/contrib/racecar/ext.rb +33 -0
  572. data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
  573. data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
  574. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +59 -0
  575. data/lib/datadog/tracing/contrib/rack/ext.rb +30 -0
  576. data/lib/datadog/tracing/contrib/rack/header_collection.rb +40 -0
  577. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  578. data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
  579. data/lib/datadog/tracing/contrib/rack/middlewares.rb +265 -0
  580. data/lib/datadog/tracing/contrib/rack/patcher.rb +119 -0
  581. data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
  582. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +52 -0
  583. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +10 -0
  584. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +76 -0
  585. data/lib/datadog/tracing/contrib/rails/ext.rb +23 -0
  586. data/lib/datadog/tracing/contrib/rails/framework.rb +148 -0
  587. data/lib/datadog/tracing/contrib/rails/integration.rb +52 -0
  588. data/lib/datadog/tracing/contrib/rails/log_injection.rb +29 -0
  589. data/lib/datadog/tracing/contrib/rails/middlewares.rb +46 -0
  590. data/lib/datadog/tracing/contrib/rails/patcher.rb +88 -0
  591. data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
  592. data/lib/datadog/tracing/contrib/rails/utils.rb +26 -0
  593. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +55 -0
  594. data/lib/datadog/tracing/contrib/rake/ext.rb +27 -0
  595. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +103 -0
  596. data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
  597. data/lib/datadog/tracing/contrib/rake/patcher.rb +33 -0
  598. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
  599. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +57 -0
  600. data/lib/datadog/tracing/contrib/redis/ext.rb +35 -0
  601. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +53 -0
  602. data/lib/datadog/tracing/contrib/redis/integration.rb +80 -0
  603. data/lib/datadog/tracing/contrib/redis/patcher.rb +92 -0
  604. data/lib/datadog/tracing/contrib/redis/quantize.rb +80 -0
  605. data/lib/datadog/tracing/contrib/redis/tags.rb +68 -0
  606. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +85 -0
  607. data/lib/datadog/tracing/contrib/redis/vendor/LICENSE +20 -0
  608. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +160 -0
  609. data/lib/datadog/tracing/contrib/registerable.rb +50 -0
  610. data/lib/datadog/tracing/contrib/registry.rb +52 -0
  611. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +42 -0
  612. data/lib/datadog/tracing/contrib/resque/ext.rb +22 -0
  613. data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
  614. data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
  615. data/lib/datadog/tracing/contrib/resque/resque_job.rb +106 -0
  616. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +55 -0
  617. data/lib/datadog/tracing/contrib/rest_client/ext.rb +28 -0
  618. data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
  619. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +28 -0
  620. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +129 -0
  621. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +38 -0
  622. data/lib/datadog/tracing/contrib/roda/ext.rb +19 -0
  623. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
  624. data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
  625. data/lib/datadog/tracing/contrib/roda/patcher.rb +30 -0
  626. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +24 -0
  627. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
  628. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +35 -0
  629. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
  630. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
  631. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +37 -0
  632. data/lib/datadog/tracing/contrib/sequel/database.rb +62 -0
  633. data/lib/datadog/tracing/contrib/sequel/dataset.rb +67 -0
  634. data/lib/datadog/tracing/contrib/sequel/ext.rb +23 -0
  635. data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
  636. data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
  637. data/lib/datadog/tracing/contrib/sequel/utils.rb +90 -0
  638. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +43 -0
  639. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +27 -0
  640. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
  641. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
  642. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +65 -0
  643. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +62 -0
  644. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +47 -0
  645. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +46 -0
  646. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +44 -0
  647. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +61 -0
  648. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +90 -0
  649. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +61 -0
  650. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +36 -0
  651. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +34 -0
  652. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +57 -0
  653. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
  654. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +88 -0
  655. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +44 -0
  656. data/lib/datadog/tracing/contrib/sidekiq.rb +37 -0
  657. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +46 -0
  658. data/lib/datadog/tracing/contrib/sinatra/env.rb +38 -0
  659. data/lib/datadog/tracing/contrib/sinatra/ext.rb +31 -0
  660. data/lib/datadog/tracing/contrib/sinatra/framework.rb +116 -0
  661. data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
  662. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +75 -0
  663. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +86 -0
  664. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +109 -0
  665. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +43 -0
  666. data/lib/datadog/tracing/contrib/sneakers/ext.rb +27 -0
  667. data/lib/datadog/tracing/contrib/sneakers/integration.rb +44 -0
  668. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +27 -0
  669. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +60 -0
  670. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +92 -0
  671. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +33 -0
  672. data/lib/datadog/tracing/contrib/status_range_matcher.rb +25 -0
  673. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +37 -0
  674. data/lib/datadog/tracing/contrib/stripe/ext.rb +27 -0
  675. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  676. data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
  677. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  678. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +39 -0
  679. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
  680. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +28 -0
  681. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +104 -0
  682. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
  683. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +35 -0
  684. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
  685. data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
  686. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
  687. data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
  688. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +31 -0
  689. data/lib/datadog/tracing/contrib/utils/database.rb +31 -0
  690. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
  691. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +179 -0
  692. data/lib/datadog/tracing/contrib.rb +81 -0
  693. data/lib/datadog/tracing/correlation.rb +103 -0
  694. data/lib/datadog/tracing/diagnostics/environment_logger.rb +159 -0
  695. data/lib/datadog/tracing/diagnostics/ext.rb +36 -0
  696. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  697. data/lib/datadog/tracing/distributed/b3_multi.rb +73 -0
  698. data/lib/datadog/tracing/distributed/b3_single.rb +69 -0
  699. data/lib/datadog/tracing/distributed/datadog.rb +200 -0
  700. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
  701. data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
  702. data/lib/datadog/tracing/distributed/helpers.rb +65 -0
  703. data/lib/datadog/tracing/distributed/none.rb +18 -0
  704. data/lib/datadog/tracing/distributed/propagation.rb +121 -0
  705. data/lib/datadog/tracing/distributed/trace_context.rb +436 -0
  706. data/lib/datadog/tracing/event.rb +76 -0
  707. data/lib/datadog/tracing/flush.rb +96 -0
  708. data/lib/datadog/tracing/metadata/analytics.rb +26 -0
  709. data/lib/datadog/tracing/metadata/errors.rb +24 -0
  710. data/lib/datadog/tracing/metadata/ext.rb +193 -0
  711. data/lib/datadog/tracing/metadata/tagging.rb +131 -0
  712. data/lib/datadog/tracing/metadata.rb +20 -0
  713. data/lib/datadog/tracing/pipeline/span_filter.rb +46 -0
  714. data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
  715. data/lib/datadog/tracing/pipeline.rb +63 -0
  716. data/lib/datadog/tracing/remote.rb +78 -0
  717. data/lib/datadog/tracing/runtime/metrics.rb +17 -0
  718. data/lib/datadog/tracing/sampling/all_sampler.rb +24 -0
  719. data/lib/datadog/tracing/sampling/ext.rb +56 -0
  720. data/lib/datadog/tracing/sampling/matcher.rb +65 -0
  721. data/lib/datadog/tracing/sampling/priority_sampler.rb +160 -0
  722. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +87 -0
  723. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +63 -0
  724. data/lib/datadog/tracing/sampling/rate_limiter.rb +185 -0
  725. data/lib/datadog/tracing/sampling/rate_sampler.rb +58 -0
  726. data/lib/datadog/tracing/sampling/rule.rb +61 -0
  727. data/lib/datadog/tracing/sampling/rule_sampler.rb +148 -0
  728. data/lib/datadog/tracing/sampling/sampler.rb +32 -0
  729. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  730. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  731. data/lib/datadog/tracing/sampling/span/rule.rb +78 -0
  732. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  733. data/lib/datadog/tracing/sampling/span/sampler.rb +77 -0
  734. data/lib/datadog/tracing/span.rb +207 -0
  735. data/lib/datadog/tracing/span_operation.rb +498 -0
  736. data/lib/datadog/tracing/sync_writer.rb +67 -0
  737. data/lib/datadog/tracing/trace_digest.rb +185 -0
  738. data/lib/datadog/tracing/trace_operation.rb +492 -0
  739. data/lib/datadog/tracing/trace_segment.rb +222 -0
  740. data/lib/datadog/tracing/tracer.rb +531 -0
  741. data/lib/datadog/tracing/transport/http/api/instance.rb +37 -0
  742. data/lib/datadog/tracing/transport/http/api/spec.rb +19 -0
  743. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  744. data/lib/datadog/tracing/transport/http/builder.rb +162 -0
  745. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  746. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  747. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  748. data/lib/datadog/tracing/transport/http.rb +97 -0
  749. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  750. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  751. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  752. data/lib/datadog/tracing/transport/io.rb +30 -0
  753. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  754. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  755. data/lib/datadog/tracing/transport/trace_formatter.rb +240 -0
  756. data/lib/datadog/tracing/transport/traces.rb +224 -0
  757. data/lib/datadog/tracing/utils.rb +83 -0
  758. data/lib/datadog/tracing/workers/trace_writer.rb +196 -0
  759. data/lib/datadog/tracing/workers.rb +125 -0
  760. data/lib/datadog/tracing/writer.rb +188 -0
  761. data/lib/datadog/tracing.rb +169 -0
  762. data/lib/datadog/version.rb +26 -0
  763. data/lib/datadog.rb +10 -0
  764. metadata +886 -0
@@ -0,0 +1,892 @@
1
+ #include "extconf.h"
2
+
3
+ // This file exports functions used to access private Ruby VM APIs and internals.
4
+ // To do this, it imports a few VM internal (private) headers.
5
+ //
6
+ // **Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
7
+ // contribute upstream changes so that they become official public VM APIs.
8
+ //
9
+ // In the meanwhile, be very careful when changing things here :)
10
+
11
+ #ifdef RUBY_MJIT_HEADER
12
+ // Pick up internal structures from the private Ruby MJIT header file
13
+ #include RUBY_MJIT_HEADER
14
+ #else
15
+ // The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on
16
+ // the debase-ruby_core_source gem to get access to private VM headers.
17
+
18
+ // We can't do anything about warnings in VM headers, so we just use this technique to suppress them.
19
+ // See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
20
+ #pragma GCC diagnostic push
21
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
22
+ #pragma GCC diagnostic ignored "-Wattributes"
23
+ #pragma GCC diagnostic ignored "-Wpragmas"
24
+ #pragma GCC diagnostic ignored "-Wexpansion-to-defined"
25
+ #include <vm_core.h>
26
+ #pragma GCC diagnostic pop
27
+
28
+ #pragma GCC diagnostic push
29
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
30
+ #include <iseq.h>
31
+ #pragma GCC diagnostic pop
32
+
33
+ #include <ruby.h>
34
+
35
+ #ifndef NO_RACTOR_HEADER_INCLUDE
36
+ #pragma GCC diagnostic push
37
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
38
+ #include <ractor_core.h>
39
+ #pragma GCC diagnostic pop
40
+ #endif
41
+ #endif
42
+
43
+ #define PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
44
+ #include "private_vm_api_access.h"
45
+
46
+ // MRI has a similar rb_thread_ptr() function which we can't call it directly
47
+ // because Ruby does not expose the thread_data_type publicly.
48
+ // Instead, we have our own version of that function, and we lazily initialize the thread_data_type pointer
49
+ // from a known-correct object: the current thread.
50
+ //
51
+ // Note that beyond returning the rb_thread_struct*, rb_check_typeddata() raises an exception
52
+ // if the argument passed in is not actually a `Thread` instance.
53
+ static inline rb_thread_t *thread_struct_from_object(VALUE thread) {
54
+ static const rb_data_type_t *thread_data_type = NULL;
55
+ if (UNLIKELY(thread_data_type == NULL)) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
56
+
57
+ return (rb_thread_t *) rb_check_typeddata(thread, thread_data_type);
58
+ }
59
+
60
+ rb_nativethread_id_t pthread_id_for(VALUE thread) {
61
+ // struct rb_native_thread was introduced in Ruby 3.2: https://github.com/ruby/ruby/pull/5836
62
+ #ifndef NO_RB_NATIVE_THREAD
63
+ struct rb_native_thread* native_thread = thread_struct_from_object(thread)->nt;
64
+ // This can be NULL on Ruby 3.3 with MN threads (RUBY_MN_THREADS=1)
65
+ if (native_thread == NULL) return 0;
66
+ return native_thread->thread_id;
67
+ #else
68
+ return thread_struct_from_object(thread)->thread_id;
69
+ #endif
70
+ }
71
+
72
+ // Queries if the current thread is the owner of the global VM lock.
73
+ //
74
+ // @ivoanjo: Ruby has a similarly-named `ruby_thread_has_gvl_p` but that API is insufficient for our needs because it can
75
+ // still return `true` even when a thread DOES NOT HAVE the global VM lock.
76
+ // In particular, looking at the implementation, that API assumes that if a thread is not in a "blocking region" then it
77
+ // will have the GVL which is probably true for the situations that API was designed to be called from BUT this assumption
78
+ // does not hold true when calling `ruby_thread_has_gvl_p` from a signal handler. (Because the thread may have lost the
79
+ // GVL due to a scheduler decision, not because it decided to block.)
80
+ // I have also submitted https://bugs.ruby-lang.org/issues/19172 to discuss this with upstream Ruby developers.
81
+ //
82
+ // Thus we need our own gvl-checking method which actually looks at the gvl structure to determine if it is the owner.
83
+ bool is_current_thread_holding_the_gvl(void) {
84
+ current_gvl_owner owner = gvl_owner();
85
+ return owner.valid && pthread_equal(pthread_self(), owner.owner);
86
+ }
87
+
88
+ #ifdef HAVE_RUBY_RACTOR_H
89
+ static inline rb_ractor_t *ddtrace_get_ractor(void) {
90
+ #ifndef USE_RACTOR_INTERNAL_APIS_DIRECTLY // Ruby >= 3.3
91
+ return thread_struct_from_object(rb_thread_current())->ractor;
92
+ #else
93
+ return GET_RACTOR();
94
+ #endif
95
+ }
96
+ #endif
97
+
98
+ #ifndef NO_GVL_OWNER // Ruby < 2.6 doesn't have the owner/running field
99
+ // NOTE: Reading the owner in this is a racy read, because we're not grabbing the lock that Ruby uses to protect it.
100
+ //
101
+ // While we could potentially grab this lock, I (@ivoanjo) think we actually don't need it because:
102
+ // * In the case where a thread owns the GVL and calls `gvl_owner`, it will always see the correct value. That's
103
+ // because every thread sets itself as the owner when it grabs the GVL and unsets itself at the end.
104
+ // That means that `is_current_thread_holding_the_gvl` is always accurate.
105
+ // * In a case where we observe a different thread, then this may change by the time we do something with this value
106
+ // anyway. So unless we want to prevent the Ruby scheduler from switching threads, we need to deal with races here.
107
+ current_gvl_owner gvl_owner(void) {
108
+ const rb_thread_t *current_owner =
109
+ #ifndef NO_RB_THREAD_SCHED // Introduced in Ruby 3.2 as a replacement for struct rb_global_vm_lock_struct
110
+ ddtrace_get_ractor()->threads.sched.running;
111
+ #elif HAVE_RUBY_RACTOR_H
112
+ ddtrace_get_ractor()->threads.gvl.owner;
113
+ #else
114
+ GET_VM()->gvl.owner;
115
+ #endif
116
+
117
+ if (current_owner == NULL) return (current_gvl_owner) {.valid = false};
118
+
119
+ #ifndef NO_RB_NATIVE_THREAD
120
+ struct rb_native_thread* current_owner_native_thread = current_owner->nt;
121
+
122
+ // This can be NULL on Ruby 3.3 with MN threads (RUBY_MN_THREADS=1)
123
+ if (current_owner_native_thread == NULL) return (current_gvl_owner) {.valid = false};
124
+
125
+ return (current_gvl_owner) {.valid = true, .owner = current_owner_native_thread->thread_id};
126
+ #else
127
+ return (current_gvl_owner) {.valid = true, .owner = current_owner->thread_id};
128
+ #endif
129
+ }
130
+ #else
131
+ current_gvl_owner gvl_owner(void) {
132
+ rb_vm_t *vm =
133
+ #ifndef NO_GET_VM
134
+ GET_VM();
135
+ #else
136
+ thread_struct_from_object(rb_thread_current())->vm;
137
+ #endif
138
+
139
+ // BIG Issue: Ruby < 2.6 did not have the owner field. The really nice thing about the owner field is that it's
140
+ // "atomic" -- when a thread sets it, it "declares" two things in a single step
141
+ // * Declaration 1: Someone has the GVL
142
+ // * Declaration 2: That someone is the specific thread
143
+ //
144
+ // Observation 1: On older versions of Ruby, this ownership concept is actually split. Specifically, `gvl.acquired`
145
+ // is a boolean that represents declaration 1 above, and `vm->running_thread` (or `ruby_current_thread`/
146
+ // `ruby_current_execution_context_ptr`) represents declaration 2.
147
+ //
148
+ // Observation 2: In addition, when a thread releases the GVL, it only sets `gvl.acquired` back to 0 **BUT CRUCIALLY
149
+ // DOES NOT CHANGE THE OTHER global variables**.
150
+ //
151
+ // Observation 1+2 above lead to the following possible race:
152
+ // * Thread A grabs the GVL (`gvl.acquired == 1`)
153
+ // * Thread A sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread A`)
154
+ // * Thread A releases the GVL (`gvl.acquired == 0` + `running_thread == Thread A`)
155
+ // * Thread B grabs the GVL (`gvl.acquired == 1` + `running_thread == Thread A`)
156
+ // * Thread A calls gvl_owner. Due to the current state (`gvl.acquired == 1` + `running_thread == Thread A`), this
157
+ // function returns an incorrect result.
158
+ // * Thread B finally sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread B`)
159
+ //
160
+ // This is especially problematic because we use `gvl_owner` to implement `is_current_thread_holding_the_gvl` which
161
+ // is called in a signal handler to decide "is it safe for me to call `rb_postponed_job_register_one` or not".
162
+ // (See constraints in `collectors_cpu_and_wall_time_worker.c` comments for why).
163
+ //
164
+ // Thus an incorrect `is_current_thread_holding_the_gvl` result may lead to issues inside `rb_postponed_job_register_one`.
165
+ //
166
+ // For this reason we currently do not enable the new Ruby profiler on Ruby 2.5 and below by default, and we print a
167
+ // warning when customers force-enable it.
168
+ bool gvl_acquired = vm->gvl.acquired != 0;
169
+ rb_thread_t *current_owner = vm->running_thread;
170
+
171
+ if (!gvl_acquired || current_owner == NULL) return (current_gvl_owner) {.valid = false};
172
+
173
+ return (current_gvl_owner) {.valid = true, .owner = current_owner->thread_id};
174
+ }
175
+ #endif // NO_GVL_OWNER
176
+
177
+ // Taken from upstream vm_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
178
+ // Copyright (C) 2004-2007 Koichi Sasada
179
+ // to support tid_for (see below)
180
+ // Modifications: None
181
+ #if defined(__linux__) || defined(__FreeBSD__)
182
+ # define RB_THREAD_T_HAS_NATIVE_ID
183
+ #endif
184
+
185
+ uint64_t native_thread_id_for(VALUE thread) {
186
+ // The tid is only available on Ruby >= 3.1 + Linux (and FreeBSD). It's the same as `gettid()` aka the task id as seen in /proc
187
+ #if !defined(NO_THREAD_TID) && defined(RB_THREAD_T_HAS_NATIVE_ID)
188
+ #ifndef NO_RB_NATIVE_THREAD
189
+ struct rb_native_thread* native_thread = thread_struct_from_object(thread)->nt;
190
+ if (native_thread == NULL) rb_raise(rb_eRuntimeError, "BUG: rb_native_thread* is null. Is this Ruby running with RUBY_MN_THREADS=1?");
191
+ return native_thread->tid;
192
+ #else
193
+ return thread_struct_from_object(thread)->tid;
194
+ #endif
195
+ #else
196
+ rb_nativethread_id_t pthread_id = pthread_id_for(thread);
197
+
198
+ #ifdef __APPLE__
199
+ uint64_t result;
200
+ // On macOS, this gives us the same identifier that shows up in activity monitor
201
+ int error = pthread_threadid_np(pthread_id, &result);
202
+ if (error) rb_syserr_fail(error, "Unexpected failure in pthread_threadid_np");
203
+ return result;
204
+ #else
205
+ // Fallback, when we have nothing better (e.g. on Ruby < 3.1 on Linux)
206
+ // @ivoanjo: In the future we may want to explore some potential hacks to get the actual tid on linux
207
+ // (e.g. https://stackoverflow.com/questions/558469/how-do-i-get-a-thread-id-from-an-arbitrary-pthread-t )
208
+ return (uint64_t) pthread_id;
209
+ #endif
210
+ #endif
211
+ }
212
+
213
+ // Returns the stack depth by using the same approach as rb_profile_frames and backtrace_each: get the positions
214
+ // of the end and current frame pointers and subtracting them.
215
+ ptrdiff_t stack_depth_for(VALUE thread) {
216
+ #ifndef USE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT // Modern Rubies
217
+ const rb_execution_context_t *ec = thread_struct_from_object(thread)->ec;
218
+ #else // Ruby < 2.5
219
+ const rb_thread_t *ec = thread_struct_from_object(thread);
220
+ #endif
221
+
222
+ const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
223
+
224
+ if (end_cfp == NULL) return 0;
225
+
226
+ // Skip dummy frame, as seen in `backtrace_each` (`vm_backtrace.c`) and our custom rb_profile_frames
227
+ // ( https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
228
+ end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
229
+
230
+ return end_cfp <= cfp ? 0 : end_cfp - cfp - 1;
231
+ }
232
+
233
+ // This was renamed in Ruby 3.2
234
+ #if !defined(ccan_list_for_each) && defined(list_for_each)
235
+ #define ccan_list_for_each list_for_each
236
+ #endif
237
+
238
+ // Tries to match rb_thread_list() but that method isn't accessible to extensions
239
+ void ddtrace_thread_list(VALUE result_array) {
240
+ rb_thread_t *thread = NULL;
241
+
242
+ // Ruby 3 Safety: Our implementation is inspired by `rb_ractor_thread_list` BUT that method wraps the operations below
243
+ // with `RACTOR_LOCK` and `RACTOR_UNLOCK`.
244
+ //
245
+ // This initially made me believe that one MUST grab the ractor lock (which is different from the ractor-scoped Global
246
+ // VM Lock) in able to iterate the `threads.set`. This turned out not to be the case: upon further study of the VM
247
+ // codebase in 3.2-master, 3.1 and 3.0, there's quite a few places where `threads.set` is accessed without grabbing
248
+ // the ractor lock: `ractor_mark` (ractor.c), `thgroup_list` (thread.c), `rb_check_deadlock` (thread.c), etc.
249
+ //
250
+ // I suspect the design in `rb_ractor_thread_list` may be done that way to perhaps in the future expose it to be
251
+ // called from a different Ractor, but I'm not sure...
252
+ #ifdef HAVE_RUBY_RACTOR_H
253
+ rb_ractor_t *current_ractor = ddtrace_get_ractor();
254
+ ccan_list_for_each(&current_ractor->threads.set, thread, lt_node) {
255
+ #else
256
+ rb_vm_t *vm =
257
+ #ifndef NO_GET_VM
258
+ GET_VM();
259
+ #else
260
+ thread_struct_from_object(rb_thread_current())->vm;
261
+ #endif
262
+ list_for_each(&vm->living_threads, thread, vmlt_node) {
263
+ #endif
264
+ switch (thread->status) {
265
+ case THREAD_RUNNABLE:
266
+ case THREAD_STOPPED:
267
+ case THREAD_STOPPED_FOREVER:
268
+ rb_ary_push(result_array, thread->self);
269
+ default:
270
+ break;
271
+ }
272
+ }
273
+ }
274
+
275
+ bool is_thread_alive(VALUE thread) {
276
+ return thread_struct_from_object(thread)->status != THREAD_KILLED;
277
+ }
278
+
279
+ VALUE thread_name_for(VALUE thread) {
280
+ return thread_struct_from_object(thread)->name;
281
+ }
282
+
283
+ // -----------------------------------------------------------------------------
284
+ // The sources below are modified versions of code extracted from the Ruby project.
285
+ // Each function is annotated with its origin, why we imported it, and the changes made.
286
+ //
287
+ // The Ruby project copyright and license follow:
288
+ // -----------------------------------------------------------------------------
289
+ // Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
290
+ //
291
+ // Redistribution and use in source and binary forms, with or without
292
+ // modification, are permitted provided that the following conditions
293
+ // are met:
294
+ // 1. Redistributions of source code must retain the above copyright
295
+ // notice, this list of conditions and the following disclaimer.
296
+ // 2. Redistributions in binary form must reproduce the above copyright
297
+ // notice, this list of conditions and the following disclaimer in the
298
+ // documentation and/or other materials provided with the distribution.
299
+ //
300
+ // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
301
+ // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
302
+ // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
303
+ // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
304
+ // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
305
+ // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
306
+ // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
307
+ // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
308
+ // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
309
+ // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
310
+ // SUCH DAMAGE.
311
+
312
+ // Taken from upstream vm_core.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
313
+ // Copyright (C) 2004-2007 Koichi Sasada
314
+ // to support our custom rb_profile_frames (see below)
315
+ // Modifications: None
316
+ #define ISEQ_BODY(iseq) ((iseq)->body)
317
+
318
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
319
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
320
+ // to support our custom rb_profile_frames (see below)
321
+ // Modifications:
322
+ // * Support int first_lineno for Ruby 3.2.0+ (https://github.com/ruby/ruby/pull/6430)
323
+ //
324
+ // `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
325
+ // To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
326
+ // with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
327
+ #pragma GCC diagnostic push
328
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
329
+ inline static int
330
+ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
331
+ {
332
+ VM_ASSERT(iseq);
333
+ VM_ASSERT(ISEQ_BODY(iseq));
334
+ VM_ASSERT(ISEQ_BODY(iseq)->iseq_encoded);
335
+ VM_ASSERT(ISEQ_BODY(iseq)->iseq_size);
336
+ if (! pc) {
337
+ if (ISEQ_BODY(iseq)->type == ISEQ_TYPE_TOP) {
338
+ VM_ASSERT(! ISEQ_BODY(iseq)->local_table);
339
+ VM_ASSERT(! ISEQ_BODY(iseq)->local_table_size);
340
+ return 0;
341
+ }
342
+ # ifndef NO_INT_FIRST_LINENO // Ruby 3.2+
343
+ if (lineno) *lineno = ISEQ_BODY(iseq)->location.first_lineno;
344
+ # else
345
+ if (lineno) *lineno = FIX2INT(ISEQ_BODY(iseq)->location.first_lineno);
346
+ #endif
347
+ #ifdef USE_ISEQ_NODE_ID
348
+ if (node_id) *node_id = -1;
349
+ #endif
350
+ return 1;
351
+ }
352
+ else {
353
+ ptrdiff_t n = pc - ISEQ_BODY(iseq)->iseq_encoded;
354
+ VM_ASSERT(n <= ISEQ_BODY(iseq)->iseq_size);
355
+ VM_ASSERT(n >= 0);
356
+ ASSUME(n >= 0);
357
+ size_t pos = n; /* no overflow */
358
+ if (LIKELY(pos)) {
359
+ /* use pos-1 because PC points next instruction at the beginning of instruction */
360
+ pos--;
361
+ }
362
+ #if VMDEBUG && defined(HAVE_BUILTIN___BUILTIN_TRAP)
363
+ else {
364
+ /* SDR() is not possible; that causes infinite loop. */
365
+ rb_print_backtrace();
366
+ __builtin_trap();
367
+ }
368
+ #endif
369
+ if (lineno) *lineno = rb_iseq_line_no(iseq, pos);
370
+ #ifdef USE_ISEQ_NODE_ID
371
+ if (node_id) *node_id = rb_iseq_node_id(iseq, pos);
372
+ #endif
373
+ return 1;
374
+ }
375
+ }
376
+ #pragma GCC diagnostic pop
377
+
378
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
379
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
380
+ // to support our custom rb_profile_frames (see below)
381
+ // Modifications: None
382
+ inline static int
383
+ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
384
+ {
385
+ int lineno;
386
+ if (calc_pos(iseq, pc, &lineno, NULL)) return lineno;
387
+ return 0;
388
+ }
389
+
390
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
391
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
392
+ // Modifications:
393
+ // * Renamed rb_profile_frames => ddtrace_rb_profile_frames
394
+ // * Add thread argument
395
+ // * Add is_ruby_frame argument
396
+ // * Removed `if (lines)` tests -- require/assume that like `buff`, `lines` is always specified
397
+ // * Support Ruby < 2.5 by using rb_thread_t instead of rb_execution_context_t (which did not exist and was just
398
+ // part of rb_thread_t)
399
+ // * Support Ruby < 2.4 by using `RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)` instead of `VM_FRAME_RUBYFRAME_P(cfp)`.
400
+ // Given that the Ruby 2.3 version of `rb_profile_frames` did not support native methods and thus did not need this
401
+ // check, how did I figure out what to replace it with? I did it by looking at other places in the VM code where the
402
+ // code looks exactly the same but Ruby 2.4 uses `VM_FRAME_RUBYFRAME_P` whereas Ruby 2.3 used `RUBY_VM_NORMAL_ISEQ_P`.
403
+ // Examples of these are `errinfo_place` in `eval.c`, `rb_vm_get_ruby_level_next_cfp` (among others) in `vm.c`, etc.
404
+ // * Skip dummy frame that shows up in main thread
405
+ // * Add `end_cfp == NULL` and `end_cfp <= cfp` safety checks. These are used in a bunch of places in
406
+ // `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
407
+ // absent from `rb_profile_frames`. Oversight?
408
+ // * Skip frames where `cfp->iseq && !cfp->pc`. These seem to be internal and are skipped by `backtrace_each` in
409
+ // `vm_backtrace.c`.
410
+ // * Check thread status and do not sample if thread has been killed.
411
+ // * Match Ruby reference stack trace APIs that use the iseq instead of the callable method entry to get information
412
+ // for iseqs created from calls to `eval` and `instance_eval`. This makes it so that `rb_profile_frame_path` on
413
+ // the `VALUE` returned by rb_profile_frames returns `(eval)` instead of the path of the file where the `eval`
414
+ // was called from.
415
+ // * Imported fix from https://github.com/ruby/ruby/pull/7116 to avoid sampling threads that are still being created
416
+ // * Imported fix from https://github.com/ruby/ruby/pull/8415 to avoid potential crash when using YJIT.
417
+ //
418
+ // What is rb_profile_frames?
419
+ // `rb_profile_frames` is a Ruby VM debug API added for use by profilers for sampling the stack trace of a Ruby thread.
420
+ // Its main other user is the stackprof profiler: https://github.com/tmm1/stackprof .
421
+ //
422
+ // Why do we need a custom version of rb_profile_frames?
423
+ //
424
+ // There are a few reasons:
425
+ // 1. To backport improved behavior to older Rubies. Prior to Ruby 3.0 (https://github.com/ruby/ruby/pull/3299),
426
+ // rb_profile_frames skipped CFUNC frames, aka frames that are implemented with native code, and thus the resulting
427
+ // stacks were quite incomplete as a big part of the Ruby standard library is implemented with native code.
428
+ //
429
+ // 2. To extend this function to work with any thread. The upstream rb_profile_frames function only targets the current
430
+ // thread, and to support wall-clock profiling we require sampling other threads. This is only safe because of the
431
+ // Global VM Lock. (We don't yet support sampling Ractors beyond the main one; we'll need to find a way to do it
432
+ // safely first.)
433
+ //
434
+ // 3. To get more information out of the Ruby VM. The Ruby VM has a lot more information than is exposed through
435
+ // rb_profile_frames, and by making our own copy of this function we can extract more of this information.
436
+ // See for backtracie gem (https://github.com/ivoanjo/backtracie) for an exploration of what can potentially be done.
437
+ //
438
+ // 4. Because we haven't yet submitted patches to upstream Ruby. As with any changes on the `private_vm_api_access.c`,
439
+ // our medium/long-term plan is to contribute upstream changes and make it so that we don't need any of this
440
+ // on modern Rubies.
441
+ //
442
+ // 5. To make rb_profile_frames behave more like the Ruby-level reference stack trace APIs (`Thread#backtrace_locations`
443
+ // and friends). We've found quite a few situations where the data from rb_profile_frames and the reference APIs
444
+ // disagree, and quite a few of them seem oversights/bugs (speculation from my part) rather than deliberate
445
+ // decisions.
446
+ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame)
447
+ {
448
+ int i;
449
+ // Modified from upstream: Instead of using `GET_EC` to collect info from the current thread,
450
+ // support sampling any thread (including the current) passed as an argument
451
+ rb_thread_t *th = thread_struct_from_object(thread);
452
+ #ifndef USE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT // Modern Rubies
453
+ const rb_execution_context_t *ec = th->ec;
454
+ #else // Ruby < 2.5
455
+ const rb_thread_t *ec = th;
456
+ #endif
457
+ const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
458
+ #ifndef NO_JIT_RETURN
459
+ const rb_control_frame_t *top = cfp;
460
+ #endif
461
+ const rb_callable_method_entry_t *cme;
462
+
463
+ // Avoid sampling dead threads
464
+ if (th->status == THREAD_KILLED) return 0;
465
+
466
+ // `vm_backtrace.c` includes this check in several methods. This happens on newly-created threads, and may
467
+ // also (not entirely sure) happen on dead threads
468
+ if (end_cfp == NULL) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
469
+
470
+ // This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
471
+ // it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
472
+ if (cfp == NULL) return 0;
473
+
474
+ // As of this writing, we don't support profiling with MN enabled, and this only happens in that mode, but as we
475
+ // probably want to experiment with it in the future, I've decided to import https://github.com/ruby/ruby/pull/9310
476
+ // here.
477
+ if (ec == NULL) return 0;
478
+
479
+ // Fix: Skip dummy frame that shows up in main thread.
480
+ //
481
+ // According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
482
+ // at the base of every thread's stack.
483
+ // (see https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
484
+ //
485
+ // One is being pointed to by `RUBY_VM_END_CONTROL_FRAME(ec)`, and so we need to advance to the next one, and
486
+ // reaching it will be used as a condition to break out of the loop below.
487
+ //
488
+ // Note that in `backtrace_each` there's two calls to `RUBY_VM_NEXT_CONTROL_FRAME`, but the loop bounds there
489
+ // are computed in a different way, so the two calls really are equivalent to one here.
490
+ end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
491
+
492
+ // See comment on `record_placeholder_stack_in_native_code` for a full explanation of what this means (and why we don't just return 0)
493
+ if (end_cfp <= cfp) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
494
+
495
+ for (i=0; i<limit && cfp != end_cfp;) {
496
+ if (cfp->iseq && !cfp->pc) {
497
+ // Fix: Do nothing -- this frame should not be used
498
+ //
499
+ // rb_profile_frames does not do this check, but `backtrace_each` (`vm_backtrace.c`) does. This frame is not
500
+ // exposed by the Ruby backtrace APIs and for now we want to match its behavior 1:1
501
+ }
502
+ #ifndef USE_ISEQ_P_INSTEAD_OF_RUBYFRAME_P // Modern Rubies
503
+ else if (VM_FRAME_RUBYFRAME_P(cfp)) {
504
+ #else // Ruby < 2.4
505
+ else if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
506
+ #endif
507
+ if (start > 0) {
508
+ start--;
509
+ continue;
510
+ }
511
+
512
+ /* record frame info */
513
+ cme = rb_vm_frame_method_entry(cfp);
514
+
515
+ if (cme && cme->def->type == VM_METHOD_TYPE_ISEQ &&
516
+ // Fix: Do not use callable method entry when iseq is for an eval.
517
+ // TL;DR: This fix is needed for us to match the Ruby reference API information in the
518
+ // "when sampling an eval/instance eval inside an object" spec.
519
+ //
520
+ // Longer note:
521
+ // When a frame is a ruby frame (VM_FRAME_RUBYFRAME_P above), we can get information about it
522
+ // by introspecting both the callable method entry, as well as the iseq directly.
523
+ // Often they match... but sometimes they provide different info (as in the "iseq for an eval" situation
524
+ // here).
525
+ // If my reading of vm_backtrace.c is correct, the actual Ruby stack trace API **never** uses the
526
+ // callable method entry for Ruby frames, but only for VM_METHOD_TYPE_CFUNC (see `backtrace_each` method
527
+ // on that file).
528
+ // So... why does `rb_profile_frames` do something different? Is it a bug? Is it because it exposes
529
+ // more information than the Ruby stack frame API?
530
+ // As a final note, the `backtracie` gem (https://github.com/ivoanjo/backtracie) can be used to introspect
531
+ // the full metadata provided by both the callable method entry as well as the iseq, and is really useful
532
+ // to debug and learn more about these differences.
533
+ cfp->iseq->body->type != ISEQ_TYPE_EVAL) {
534
+ buff[i] = (VALUE)cme;
535
+ }
536
+ else {
537
+ buff[i] = (VALUE)cfp->iseq;
538
+ }
539
+
540
+ // The topmost frame may not have an updated PC because the JIT
541
+ // may not have set one. The JIT compiler will update the PC
542
+ // before entering a new function (so that `caller` will work),
543
+ // so only the topmost frame could possibly have an out of date PC
544
+ #ifndef NO_JIT_RETURN
545
+ if (cfp == top && cfp->jit_return) {
546
+ lines[i] = 0;
547
+ } else {
548
+ lines[i] = calc_lineno(cfp->iseq, cfp->pc);
549
+ }
550
+ #else // Ruby < 3.1
551
+ lines[i] = calc_lineno(cfp->iseq, cfp->pc);
552
+ #endif
553
+
554
+ is_ruby_frame[i] = true;
555
+ i++;
556
+ }
557
+ else {
558
+ cme = rb_vm_frame_method_entry(cfp);
559
+ if (cme && cme->def->type == VM_METHOD_TYPE_CFUNC) {
560
+ buff[i] = (VALUE)cme;
561
+ lines[i] = 0;
562
+ is_ruby_frame[i] = false;
563
+ i++;
564
+ }
565
+ }
566
+ cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
567
+ }
568
+
569
+ return i;
570
+ }
571
+
572
+ #ifdef USE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME
573
+
574
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
575
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
576
+ // to support our custom rb_profile_frame_method_name (see below)
577
+ // Modifications: None
578
+ static VALUE
579
+ id2str(ID id)
580
+ {
581
+ VALUE str = rb_id2str(id);
582
+ if (!str) return Qnil;
583
+ return str;
584
+ }
585
+ #define rb_id2str(id) id2str(id)
586
+
587
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
588
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
589
+ // to support our custom rb_profile_frame_method_name (see below)
590
+ // Modifications: None
591
+ static const rb_iseq_t *
592
+ frame2iseq(VALUE frame)
593
+ {
594
+ if (NIL_P(frame)) return NULL;
595
+
596
+ if (RB_TYPE_P(frame, T_IMEMO)) {
597
+ switch (imemo_type(frame)) {
598
+ case imemo_iseq:
599
+ return (const rb_iseq_t *)frame;
600
+ case imemo_ment:
601
+ {
602
+ const rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)frame;
603
+ switch (cme->def->type) {
604
+ case VM_METHOD_TYPE_ISEQ:
605
+ return cme->def->body.iseq.iseqptr;
606
+ default:
607
+ return NULL;
608
+ }
609
+ }
610
+ default:
611
+ break;
612
+ }
613
+ }
614
+ rb_bug("frame2iseq: unreachable");
615
+ }
616
+
617
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
618
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
619
+ // to support our custom rb_profile_frame_method_name (see below)
620
+ // Modifications: None
621
+ static const rb_callable_method_entry_t *
622
+ cframe(VALUE frame)
623
+ {
624
+ if (NIL_P(frame)) return NULL;
625
+
626
+ if (RB_TYPE_P(frame, T_IMEMO)) {
627
+ switch (imemo_type(frame)) {
628
+ case imemo_ment:
629
+ {
630
+ const rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)frame;
631
+ switch (cme->def->type) {
632
+ case VM_METHOD_TYPE_CFUNC:
633
+ return cme;
634
+ default:
635
+ return NULL;
636
+ }
637
+ }
638
+ default:
639
+ return NULL;
640
+ }
641
+ }
642
+
643
+ return NULL;
644
+ }
645
+
646
+ // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
647
+ // Copyright (C) 1993-2012 Yukihiro Matsumoto
648
+ //
649
+ // Ruby 3.0 finally added support for showing CFUNC frames (frames for methods written using native code)
650
+ // in stack traces gathered via `rb_profile_frames` (https://github.com/ruby/ruby/pull/3299).
651
+ // To access this information on older Rubies, beyond using our custom `ddtrace_rb_profile_frames` above, we also need
652
+ // to backport the Ruby 3.0+ version of `rb_profile_frame_method_name`.
653
+ //
654
+ // Modifications:
655
+ // * Renamed rb_profile_frame_method_name => ddtrace_rb_profile_frame_method_name
656
+ VALUE
657
+ ddtrace_rb_profile_frame_method_name(VALUE frame)
658
+ {
659
+ const rb_callable_method_entry_t *cme = cframe(frame);
660
+ if (cme) {
661
+ ID mid = cme->def->original_id;
662
+ return id2str(mid);
663
+ }
664
+ const rb_iseq_t *iseq = frame2iseq(frame);
665
+ return iseq ? rb_iseq_method_name(iseq) : Qnil;
666
+ }
667
+
668
+ #endif // USE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME
669
+
670
+ // Support code for older Rubies that cannot use the MJIT header
671
+ #ifndef RUBY_MJIT_HEADER
672
+
673
+ #define MJIT_STATIC // No-op on older Rubies
674
+
675
+ // Taken from upstream include/ruby/backward/2/bool.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
676
+ // Copyright (C) Ruby developers <ruby-core@ruby-lang.org>
677
+ // to support our custom rb_profile_frames (see above)
678
+ // Modifications: None
679
+ #ifndef FALSE
680
+ # define FALSE false
681
+ #elif FALSE
682
+ # error FALSE must be false
683
+ #endif
684
+
685
+ #ifndef TRUE
686
+ # define TRUE true
687
+ #elif ! TRUE
688
+ # error TRUE must be true
689
+ #endif
690
+
691
+ // Taken from upstream vm_insnhelper.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
692
+ // Copyright (C) 2007 Koichi Sasada
693
+ // to support our custom rb_profile_frames (see above)
694
+ // Modifications: None
695
+ static rb_callable_method_entry_t *
696
+ check_method_entry(VALUE obj, int can_be_svar)
697
+ {
698
+ if (obj == Qfalse) return NULL;
699
+
700
+ #if VM_CHECK_MODE > 0
701
+ if (!RB_TYPE_P(obj, T_IMEMO)) rb_bug("check_method_entry: unknown type: %s", rb_obj_info(obj));
702
+ #endif
703
+
704
+ switch (imemo_type(obj)) {
705
+ case imemo_ment:
706
+ return (rb_callable_method_entry_t *)obj;
707
+ case imemo_cref:
708
+ return NULL;
709
+ case imemo_svar:
710
+ if (can_be_svar) {
711
+ return check_method_entry(((struct vm_svar *)obj)->cref_or_me, FALSE);
712
+ }
713
+ // fallthrough
714
+ default:
715
+ #if VM_CHECK_MODE > 0
716
+ rb_bug("check_method_entry: svar should not be there:");
717
+ #endif
718
+ return NULL;
719
+ }
720
+ }
721
+
722
+ #ifndef USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
723
+ // Taken from upstream vm_insnhelper.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
724
+ // Copyright (C) 2007 Koichi Sasada
725
+ // to support our custom rb_profile_frames (see above)
726
+ //
727
+ // While older Rubies may have this function, the symbol is not exported which leads to dynamic loader issues, e.g.
728
+ // `dyld: lazy symbol binding failed: Symbol not found: _rb_vm_frame_method_entry`.
729
+ //
730
+ // Modifications: None
731
+ MJIT_STATIC const rb_callable_method_entry_t *
732
+ rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
733
+ {
734
+ const VALUE *ep = cfp->ep;
735
+ rb_callable_method_entry_t *me;
736
+
737
+ while (!VM_ENV_LOCAL_P(ep)) {
738
+ if ((me = check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], FALSE)) != NULL) return me;
739
+ ep = VM_ENV_PREV_EP(ep);
740
+ }
741
+
742
+ return check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], TRUE);
743
+ }
744
+ #else
745
+ // Taken from upstream vm_insnhelper.c at commit 556e9f726e2b80f6088982c6b43abfe68bfad591 (October 2018, ruby_2_3 branch)
746
+ // Copyright (C) 2007 Koichi Sasada
747
+ // to support our custom rb_profile_frames (see above)
748
+ //
749
+ // Quite a few macros in this function changed after Ruby 2.3. Rather than trying to fix the Ruby 3.2 version to work
750
+ // with 2.3 constants, I decided to import the Ruby 2.3 version.
751
+ //
752
+ // Modifications: None
753
+ const rb_callable_method_entry_t *
754
+ rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
755
+ {
756
+ VALUE *ep = cfp->ep;
757
+ rb_callable_method_entry_t *me;
758
+
759
+ while (!VM_EP_LEP_P(ep)) {
760
+ if ((me = check_method_entry(ep[-1], FALSE)) != NULL) return me;
761
+ ep = VM_EP_PREV_EP(ep);
762
+ }
763
+
764
+ return check_method_entry(ep[-1], TRUE);
765
+ }
766
+ #endif // USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
767
+ #endif // RUBY_MJIT_HEADER
768
+
769
+ #ifndef NO_RACTORS
770
+ // 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
771
+ // repeat it here to be able to use in our code.
772
+ #ifndef USE_RACTOR_INTERNAL_APIS_DIRECTLY
773
+ // Disable fast path for detecting multiple Ractors. Unfortunately this symbol is no longer visible on modern Ruby
774
+ // versions, so we need to do a bit more work.
775
+ struct rb_ractor_struct *ruby_single_main_ractor = NULL;
776
+
777
+ // Alternative implementation of rb_ractor_main_p_ that avoids relying on non-public symbols
778
+ bool rb_ractor_main_p_(void) {
779
+ // We need to get the main ractor in a bit of a roundabout way, since Ruby >= 3.3 hid `GET_VM()`
780
+ return ddtrace_get_ractor() == thread_struct_from_object(rb_thread_current())->vm->ractor.main_ractor;
781
+ }
782
+ #else
783
+ // Directly access Ruby internal fast path for detecting multiple Ractors.
784
+ extern struct rb_ractor_struct *ruby_single_main_ractor;
785
+
786
+ // Ruby 3.0 to 3.2 directly expose this symbol, we just need to tell the compiler it exists.
787
+ bool rb_ractor_main_p_(void);
788
+ #endif
789
+
790
+ // Taken from upstream ractor_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
791
+ // to allow us to ensure that we're always operating on the main ractor (if Ruby has ractors)
792
+ // Modifications:
793
+ // * None
794
+ bool ddtrace_rb_ractor_main_p(void)
795
+ {
796
+ if (ruby_single_main_ractor) {
797
+ return true;
798
+ }
799
+ else {
800
+ return rb_ractor_main_p_();
801
+ }
802
+ }
803
+ #else
804
+ // Simplify callers on older Rubies, instead of having them probe if the VM supports Ractors we just tell them that yes
805
+ // they're always on the main Ractor
806
+ bool ddtrace_rb_ractor_main_p(void) { return true; }
807
+ #endif // NO_RACTORS
808
+
809
+ // This is a tweaked and inlined version of
810
+ // threadptr_invoke_proc_location + rb_proc_location + iseq_location .
811
+ //
812
+ // It's useful to have here because not all of the methods above are accessible to extensions + to avoid the
813
+ // array allocation that iseq_location did to contain its return value.
814
+ static const rb_iseq_t *maybe_thread_invoke_proc_iseq(VALUE thread_value) {
815
+ rb_thread_t *thread = thread_struct_from_object(thread_value);
816
+
817
+ #ifndef NO_THREAD_INVOKE_ARG // Ruby 2.6+
818
+ if (thread->invoke_type != thread_invoke_type_proc) return NULL;
819
+
820
+ VALUE proc = thread->invoke_arg.proc.proc;
821
+ #else
822
+ if (thread->first_func || !thread->first_proc) return NULL;
823
+
824
+ VALUE proc = thread->first_proc;
825
+ #endif
826
+
827
+ const rb_iseq_t *iseq = rb_proc_get_iseq(proc, 0);
828
+ if (iseq == NULL) return NULL;
829
+
830
+ rb_iseq_check(iseq);
831
+ return iseq;
832
+ }
833
+
834
+ VALUE invoke_location_for(VALUE thread, int *line_location) {
835
+ const rb_iseq_t *iseq = maybe_thread_invoke_proc_iseq(thread);
836
+
837
+ if (iseq == NULL) return Qnil;
838
+
839
+ *line_location = NUM2INT(rb_iseq_first_lineno(iseq));
840
+ return rb_iseq_path(iseq);
841
+ }
842
+
843
+ void self_test_mn_enabled(void) {
844
+ #ifdef NO_MN_THREADS_AVAILABLE
845
+ return;
846
+ #else
847
+ if (ddtrace_get_ractor()->threads.sched.enable_mn_threads == true) {
848
+ rb_raise(rb_eRuntimeError, "Ruby VM is running with RUBY_MN_THREADS=1. This is not yet supported");
849
+ }
850
+ #endif
851
+ }
852
+
853
+ // Taken from upstream imemo.h at commit 6ebcf25de2859b5b6402b7e8b181066c32d0e0bf (November 2023, master branch)
854
+ // (See the Ruby project copyright and license above)
855
+ // to enable calling rb_imemo_name
856
+ //
857
+ // Modifications:
858
+ // * Added IMEMO_MASK define
859
+ // * Changed return type to int to avoid having to define `enum imemo_type`
860
+ static inline int ddtrace_imemo_type(VALUE imemo) {
861
+ // This mask is the same between Ruby 2.5 and 3.3-preview3. Furthermore, the intention of this method is to be used
862
+ // to call `rb_imemo_name` which correctly handles invalid numbers so even if the mask changes in the future, at most
863
+ // we'll get incorrect results (and never a VM crash)
864
+ #define IMEMO_MASK 0x0f
865
+ return (RBASIC(imemo)->flags >> FL_USHIFT) & IMEMO_MASK;
866
+ }
867
+
868
+ // Safety: This function assumes the object passed in is of the imemo type. But in the worst case, you'll just get
869
+ // a string that doesn't make any sense.
870
+ #ifndef NO_IMEMO_NAME
871
+ const char *imemo_kind(VALUE imemo) {
872
+ return rb_imemo_name(ddtrace_imemo_type(imemo));
873
+ }
874
+ #else
875
+ const char *imemo_kind(__attribute__((unused)) VALUE imemo) {
876
+ return NULL;
877
+ }
878
+ #endif
879
+
880
+ // This is used to workaround a VM bug. See "handle_sampling_signal" in "collectors_cpu_and_wall_time_worker" for details.
881
+ #ifdef NO_POSTPONED_TRIGGER
882
+ void *objspace_ptr_for_gc_finalize_deferred_workaround(void) {
883
+ rb_vm_t *vm =
884
+ #ifndef NO_GET_VM // TODO: Inline GET_VM below once we drop support in dd-trace-rb 2.x for < Ruby 2.5
885
+ GET_VM();
886
+ #else
887
+ thread_struct_from_object(rb_thread_current())->vm;
888
+ #endif
889
+
890
+ return vm->objspace;
891
+ }
892
+ #endif