【问题标题】:How to check if postgres server is up through Rails App?如何通过 Rails App 检查 postgres 服务器是否已启动?
【发布时间】:2018-02-08 12:54:44
【问题描述】:

我正在尝试为我的应用创建健康检查页面。后端、前端和数据库有 3 个不同的服务器。 我创建了一个 API 来检查服务(sidekiq、redis)是否正在运行。 现在,我想检查 postgres 服务器是否启动。 为此我添加了一个方法

def database? ActiveRecord::Base.connection.active? end

这个方法在 postgres 运行时返回 true。如果 Postgres 服务器停止,并且我尝试访问我的 API,我会得到

PG::ConnectionBad (could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? ):

如何挽救这个错误?

【问题讨论】:

  • 我不认为你可以通过 rails 应用程序做到这一点,因为它首先尝试连接到数据库。您必须使用一个没有 db 要求的应用程序,该应用程序可以 ping 某些服务,例如 db、redis、sidekiq。 Redis,sidekiq,您可以从 rails 应用程序轻松完成,但 db,不。也许有人知道更多:)。
  • @razvans,谢谢。您能否指导我检查数据库连接的标准方法是什么?或者您能否详细说明没有数据库要求的应用程序。

标签: ruby-on-rails postgresql database-connection


【解决方案1】:

为了防止在实际检查数据库连接之前加载 rails guts,我建议创建一个简单的机架中间件,并将中间件堆栈放在最开始:

class StatusMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    return @app.call(env) unless status_request?(env)

    # Feel free to respond with JS here if needed
    if database_alive?
      [200, {}, []]
    else
      [503, {}, []]
    end
  end

  private

  def status_request?(env)
    # Change the route to whatever you like
    env['PATH_INFO'] == '/postgres_status' && env['REQUEST_METHOD'] == 'GET'
  end

  def database_alive?
    ::ActiveRecord::Base.connection.verify!
    true
  rescue StandardError
    false
  end
end

在你的config/application.rb:

config.middleware.insert_before 0, StatusMiddleware

【讨论】:

  • 如果 Postgres 服务器没有运行,那么请求不会到达控制器,并抛出 PG::ConnectionBad 错误。所以上面提到的救援是行不通的。
  • @nattfodd 但是当你进入一个最终使用该方法的“系统健康”页面时,它不会崩溃吗?会的。
  • 你是对的,我已经改变了答案,你看看
  • @nattfodd。是的!这工作正常。也会检查其他服务。谢谢!
  • @PrajaktaC 完成后别忘了选择正确答案
【解决方案2】:

我没有做任何类似的事情,但我会这样做。

status.myapp.com 上托管一个 rails 应用程序(或 sinatra,没有 db 或虚拟应用程序),这只是一个简单的索引页面,其中包含一堆检查 - db、redis、sidekiq。我会确保托管在与生产机器相同的机器上。

  1. db - 尝试建立与生产数据库的连接 - 是否失败
  2. redis - 尝试查看它是否是 redis-server 的正在运行的进程
  3. sidekiq - 尝试查看它是否是 sidekiq 的正在运行的进程
  4. etc ...

再次,只是一个想法。也许有人做了不同的事情。

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 2019-11-12
    • 2017-03-16
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多