使用するGemは↓
https://github.com/ianheggie/health_check/tree/v2.8.0
Rails4なのでREADMEにあるとおりv2.8.0を使う。
install
Gemfileの記述
gem 'health_check', "~> 2.8"
config
config/initializers/health_check.rb
に色々書いていく。
GithubのREADMEにサンプルもあるので基本はそれを編集して作る。
ルーティング
↓のように書いておくと↓↓で指定したURIからアクセスできるようになる。
ちなみにpassengerなどを使ってRailsを起動していると再起動が必要になるので注意。
health_check_routes
config.uri = 'health_check'
ヘルスチェック方法
http://example.com/health_check
にアクセス。
http://example.com/health_check.json
でJsonも取れる。
下のようにURLを変えることによりチェック項目も指定可能。
未指定だとstandard
が使用され、DBやマイグレーションなどがチェックされる。
full
or all
も可能でstandardよりも項目数が多い。
何がstandardなのかといった項目も変更可能で、変更方法は↓のミドルウェア化の項目を参考に。
http://example.com/health_check/database
http://example.com/health_check/standard
http://example.com/health_check/full
# JSONで取得したい場合はこう↓
http://example.com/health_check/full.json
ミドルウェア化
DBへ接続できないときなどはRails自体が死ぬのでヘルスチェックすらできなくなる。
そうなるのを回避するためにミドルウェア化する。
config.middleware.insert_after "Rails::Rack::Logger", HealthCheck::MiddlewareHealthcheck
次にconfig/initializers/health_check.rb
にconfig.middleware_checks
を設定してミドルウェアでチェックする項目を指定する。
デフォルトだとDB接続は入ってないので指定しないとミドルウェアでDB接続をチェックしてくれなくなる。
middleware_checksとURLを比較してミドルウェアで行うか判断しているみたいなのでstandard
やfull
などを使う場合は明示的に含める必要がある。
/health_check/
(/health_check/standard
と同じ)やhealth_check/all
にアクセスしてDBのヘルスチェックをミドルウェアでしてもらうには例えば↓のようにする。
逆にfull
だけ指定してall
は指定しないとかすると挙動を変えられそう(未検証)。
config.middleware_checks = ['middleware', 'migrations', 'standard', 'full', 'all']
config.standard_checks = ['database', 'migrations']
config.full_checks = ['database', 'migrations', 'custom', 'email', 'cache', 'redis', 'resque-redis', 'sidekiq-redis', 's3']
ステータスコードを変更
ヘルスチェックの結果がエラーだった場合に返るステータスコードを変更することができる。
テキストで受け取る際とオブジェクト(XMLやJson)で受け取る場合で別に指定できる。
config.http_status_for_error_text = 503
config.http_status_for_error_object = 503
動作確認
ミドルウェア化によりDBに接続できない場合でもヘルスチェックができることを確認する。
- まずは通常通りRailsを起動して
/health_check
にアクセスする- →
success
の文字が確認できる
- →
-
sudo service mysqld stop
としてDBを落として/health_check
にアクセスする- →
health_check failed: closed MySQL connection
になる - curlに
-i
オプションを付けて確認するとステータスコードが503
であることも確認できる
- →
- DBが落ちたまま
/health_check
以外のページにアクセスする- → Railsがエラーとスタックトレースを出す