【发布时间】:2021-09-22 17:20:17
【问题描述】:
如何记录 Rails 应用程序在准备好服务请求之前的启动持续时间?
在 boot.rb 中添加 puts "Rails app booted in #{(boot_start - Time.now)} seconds" 的幼稚方法无法按预期工作。
# config/boot.rb
boot_start = Time.now
require "bundler/setup"
require "bootsnap/setup" if ENV["RAILS_ENV"] == "development"
puts "Rails app booted in #{(boot_start - Time.now)} seconds"
我需要的是
- 使用环境中定义的 Rails.logger 打印日志条目
- 尽可能准确(尤其包括需要所有宝石所需的时间,最好是https://guides.rubyonrails.org/initialization.html 中提到的所有内容)
请注意,我上面提到的幼稚方法会打印 Web 服务器实际启动之前的持续时间:
app_1 | Database 'XXX_staging' already exists
app_1 | Rails app booted in -1.2772e-05 seconds # Not only it appears before the server is ready
app_1 | Rails app booted in -1.01e-05 seconds # But is also duplicated for some reason
app_1 | => Booting Puma
app_1 | => Rails 6.1.3.2 application starting in staging
app_1 | => Run `bin/rails server --help` for more startup options
app_1 | [12] Puma starting in cluster mode...
app_1 | [12] * Puma version: 5.3.1 (ruby 3.0.1-p64) ("Sweetnighter")
app_1 | [12] * Min threads: 5
app_1 | [12] * Max threads: 5
app_1 | [12] * Environment: staging
app_1 | [12] * Master PID: 12
app_1 | [12] * Workers: 2
app_1 | [12] * Restarts: (✔) hot (✖) phased
app_1 | [12] * Preloading application
app_1 | [12] * Listening on http://0.0.0.0:3000
我了解 Web 服务器是异步启动的,并且测量方式将与用于运行应用程序的实际 Web 服务器(在本例中为 puma)耦合,但一个如何使用任何 Web 服务器实现此目的的示例可能会很有用.
【问题讨论】:
-
我会使用一个非常懒惰的解决方案:流式传输日志输出,并在打印
Listening on http://0.0.0.0:3000时立即停止计时器。 -
通过这种方式,您可以测量端到端的实际启动时间。您可以保证在启动服务器之前真正“启动时钟”(在一个单独的过程中!!),并且您可以保证在最后记录的 rails 指示“就绪”之后“停止时钟”。
-
虽然本身不是答案,但您可能想看看
bumbler
标签: ruby-on-rails ruby ruby-on-rails-6 puma