404、500エラー発生時のSlack通知
どうもどハマりエンジニアです。
目的
slack-notifier
exception_notification
上記の2つのgemを追加・適切な記述をし、Slackの該当チャンネルに通知できるようにします。Slackの通知設定でWebhookURLに指定するURL情報は、credentials(日本語だと信任状)を使って設定してください。通知確認後は、production環境のみで通知がいくようにします。
404エラーに関してはエラーハンドリング処理を実装し、public/404.htmlを表示させ、500エラーに関してはエラーハンドリング処理を実装し、ログに「エラーメッセージ」と「エラーのバックトレース」を出力させ、public/500.htmlを表示させます。
gemのインストール
$slack-notifier
&exception_notification ←なんかしらのエラーが発生すると、メールを自動的に送付してくれる gem
gemfileに上記を記載し$bundle install
slackのwebhook_urlを取得
https://任意のslackワークスペース名.slack.com/services/new
でアクセス- 検索フィールドから
Incoming WebHooks
を検索 Slackに追加
をクリックして通知したいチャンネル名を選択して保存- webhook_URLをコピー
通知設定
$ bundle exec rails g exception_notification:install
exception_notification.rb
env.production?のところで、エラーが発生した際にどの環境でエラーをslack に送るか設定します。確認の段階だけdevelopmentにします。
webhook_url と channel では、さきほど取得したurlとチャンネル名を記載します。
コントローラーでのrescue_formによるエラー補足
application_controller.rb
動的なエラーページを表示する方法としては、おそらくApplicationController
で下記のようにするのが最もポピュラーで手軽な方法です。ここで例外が発生した際にrenderさせる設定を記載します。
<注意>
明示的にrescue_from ActiveRecord::RecordNotFound, with: :render_404
のように例外を捕捉した場合はconsider_all_requests_local
の設定にかかわらず必ずwith:
の後のメソッドが呼ばれます。
その中のメソッドでは render file: Rails.root.join('public/404.html'), layout: false, status: :not_found
と記述しているので何が何でも404.htmlが表示されます。
ですので unless Rails.env.development? と記載し、開発環境意外でrenderさせるようにします。でないと、開発環境でなんのエラーが出ているのか分からなくなってしまいます。
あとは404.html、500.htmlを設定すれば完了です。
後rescue_from
で補足しているエラーはSlack通知がいかないので気をつけましょう。