Rails4でhealth_checkをミドルウェア化してヘルスチェックを行う


使用する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を起動していると再起動が必要になるので注意。

config/routes.rb
  health_check_routes
config/initializers/health_check.rb
  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/application.rb
    config.middleware.insert_after "Rails::Rack::Logger", HealthCheck::MiddlewareHealthcheck

次にconfig/initializers/health_check.rbconfig.middleware_checksを設定してミドルウェアでチェックする項目を指定する。
デフォルトだとDB接続は入ってないので指定しないとミドルウェアでDB接続をチェックしてくれなくなる。
middleware_checksとURLを比較してミドルウェアで行うか判断しているみたいなのでstandardfullなどを使う場合は明示的に含める必要がある。
/health_check/(/health_check/standardと同じ)やhealth_check/allにアクセスしてDBのヘルスチェックをミドルウェアでしてもらうには例えば↓のようにする。
逆にfullだけ指定してallは指定しないとかすると挙動を変えられそう(未検証)。

config/initializers/health_check.rb
  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/initializers/health_check.rb
  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がエラーとスタックトレースを出す