RailsのエラーをSlackに通知

環境

gem exception_notification

Railsアプリケーションでエラーが発生した際に、通知を送る為の機能を提供してくれるgemです。
公式: GitHub - smartinez87/exception_notification: Exception Notifier Plugin for Rails

使用例

開発環境でこちらを参考に開発環境でEmailでの送信を試してみたいと思います。
補足: letter_openerを使用しています!!

config/environments/development.rb

Rails.application.configure do
・・・
  config.action_mailer.delivery_method = :letter_opener 
  config.action_mailer.default_url_options = { host: 'localhost:3000' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
・・・
end

設定用のファイルを下記のコマンドで作成します。

rails g exception_notification:install

デフォルトでEmail用の設定は生成されるのでそのままでokです。 config/initializers/exception_notification.rb

require 'exception_notification/rails'

ExceptionNotification.configure do |config|
  config.add_notifier :email, {
    email_prefix: '[ERROR] ',
    sender_address: %{"Notifier" <notifier@example.com>},
    exception_recipients: %w{exceptions@example.com}
  }
end

適当な箇所で例外を発生させてみます。

class StaticPagesController < ApplicationController
  def top
    raise
  end
end

対応するURLにアクセスするとメールが届くはずです!! Image from Gyazo

Slack通知を実装する

まずは下記をGemfileに追加してbundleします。

gem 'slack-notifier'

こちらのページから設定を行っていきます。

  1. 通知先のワークスペースを選択します。
  2. 通知先のチャンネルを選択します。
  3. 設定を保存したら完了です。

Image from Gyazo

rails consoleで送れるか試してみます。

> WEBHOCK_URL = <自分のWebhook URL>
> channel = "#基礎編通知"
> username = "tanaka"
> Slack::Notifier.new(WEBHOOK_URL, channel: channel, username: username).ping('Hello World')
=> [#<Net::HTTPOK 200 OK readbody=true>]

Slackを確認すると通知が送られているのが確認できると思います。

確認できたら、slack用の設定をconfig/initializers/exception_notification.rbに追加します。

require 'exception_notification/rails'

ExceptionNotification.configure do |config|
  # Slack notifier
  config.add_notifier :slack, {
    webhook_url: <自分のWebhook URL>
    channel: "#基礎編通知",
  }
end

サーバーを立ち上げ直した後、エラーを発生させるとSlackに通知が届いているはずです。

404、500エラーに対してエラーハンドリング処理を実装する

まず、開発環境で本番環境のエラー画面を確認できるように下記の設定を行います。
config/environmentst/development.rb

config.consider_all_requests_local = false

404エラー

間違ったURLにアクセスした場合に発生します。

Image from Gyazo

このHTMLはpublic/404.htmlを表示しています。

500エラー

サーバー側でのエラーの場合に発生します

Image from Gyazo

このHTMLはpublic/500.htmlを表示しています。

500エラーの場合はログに「エラーメッセージ」と「エラーのバックトレース」を表示させたいと思います。

application_controller.rb

class ApplicationController < ActionController::Base

  rescue_from StandardError, with: :render_500
  private

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

参考:
レイアウトとレンダリング - Railsガイド
class Exception (Ruby 2.7.0 リファレンスマニュアル)

最後に

開発環境でエラー表示の詳細が表示されるようにtrueに戻します。 config/environmentst/development.rb

config.consider_all_requests_local = true

また、開発環境でSlackに通知が送信されないようにconfig/initializers/exception_notification.rbに下記を追加します。

if Rails.env.production?
  require 'exception_notification/rails'

  ExceptionNotification.configure do |config|
  ・・・
  end
end