LoginSignup
2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-29

使用する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がエラーとスタックトレースを出す
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1