我正在尝试为我的应用创建运行状况检查页面。后端,前端和数据库有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?
):
如何解决此错误?
答案 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。我确保托管在与生产机器相同的机器上。
db
- 尝试建立与生产数据库的连接 - 是否失败redis
- 尝试查看它是redis-server
sidekiq
- 尝试查看它是sidekiq
etc ...
再次,只是一个想法。也许有人以不同的方式做到了。