如何通过Rails App检查postgres服务器是否正常运行?

时间:2018-02-08 12:54:44

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

我正在尝试为我的应用创建运行状况检查页面。后端,前端和数据库有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? ):

如何解决此错误?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我没有做任何类似的事情,但这就是我要做的事情。

将一个rails应用程序(或sinatra,没有数据库或虚拟数据库)托管到status.myapp.com,这只是一个带有大量检查的简单索引页面 - db,redis,sidekiq。我确保托管在与生产机器相同的机器上。

  1. db - 尝试建立与生产数据库的连接 - 是否失败
  2. redis - 尝试查看它是redis-server
  3. 的正在运行的过程
  4. sidekiq - 尝试查看它是sidekiq
  5. 的正在运行的过程
  6. etc ...
  7. 再次,只是一个想法。也许有人以不同的方式做到了。