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を取得

  1. https://任意のslackワークスペース名.slack.com/services/newでアクセス
  2. 検索フィールドからIncoming WebHooksを検索
  3. Slackに追加をクリックして通知したいチャンネル名を選択して保存
  4. webhook_URLをコピー

 

通知設定

$ bundle exec rails g exception_notification:install

exception_notification.rb
require 'exception_notification/rails'

ExceptionNotification.configure do |config|
 config.ignore_if do
  !Rails.env.production?
 end
 config.add_notifier :slack, {
 channel: '#基礎編通知'
}
end
env.production?のところで、エラーが発生した際にどの環境でエラーをslack に送るか設定します。確認の段階だけdevelopmentにします。
webhook_url と channel では、さきほど取得したurlとチャンネル名を記載します。

 

コントローラーでのrescue_formによるエラー補足

application_controller.rb

 

unless Rails.env.development?
rescue_from StandardError, with: :render_500
rescue_from ActiveRecord::RecordNotFound, with: :render_404
end
 
private
 
def render_404
render file: Rails.root.join('public/404.html'), layout: false, status: :not_found
end

def render_500(error = nil)
logger.error(error.message)
logger.error(error.backtrace.join('\n'))
render file: Rails.root.join('public/500.html'), layout: false, status: :internal_server_error
end

動的なエラーページを表示する方法としては、おそらく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通知がいかないので気をつけましょう。