エラー通知用のウェブサービス Airbrake の ruby 用プラグイン airbrake の README を一部和訳したメモを発掘したので載せておきます。
airbrake は exception_notification とは違い同種のエラーであれば複数回発生しても通知は一回だけ送られるのと、web上にエラー内容がまとまってくれるのは良い点です。ただ値段に見合っているかはちょっとわからないです。とりあえず miuchee では airbrake を使っています。
基本的な使い方
基本的には、APIキーとかの設定をしておけば Rails が例外を吐いたときに rack middleware 層で例外をキャッチして、airbrake に通知するらしい。ただ普通の Rails アプリはコントローラ中で rescue_from
などを使って例外をキャッチして「エラーが発生しました」みたいな画面を出すようにしているので、例外は middleware まで届かない。そのような場合は下記のように明示的に airbrake に例外を送るようにする。
コントローラ中では notify_airbrake
メソッドを使う。引数はエラーオブジェクト。
begin
# ...
rescue => ex
notify_airbrake(ex)
end
コントローラ以外では Airbrake.notify
メソッドを使う。
昔の rails にあった rescue_action
に相当するメソッド rescue_action_in_public_without_airbrake(exception)
というのも用意されているらしい。
rake タスク中の例外を airbrake に送る
下記のようにしてやると、rake タスク中に発生した例外を airbrake に送ってくれる。
Airbrake.configure do |config|
...
config.rescue_rake_exceptions = true
end
ユーザにエラーを通知する
500.html の一部を指定した方法で差し替える機能があって、そこで error_id を表示させてユーザから通知させるようなものが作れる。詳細は省略。
ユーザ情報を送る
airbrake はログインユーザの情報も取得して表示できる。デフォルトでは current_user
と current_member
で取得できるインスタンスを「ログインユーザ」としている。(両方あるときは current_user
優先)。
他のメソッド名使いたければ alias_method
すればおk。
デフォルトでは下記の属性を取得する
- id
- name
- username
下記のようにしてカスタム出来る
Airbrake.configure do |config|
# collect only user ids
config.user_attributes = [:id] # ["id"] also works
end
非同期で送信する
設定すると airbrake との通信を非同期で行うことが出来る。thread 使ったり、Resque や Sidekiq 使ったりできるそうな。詳細は省略。
デプロイ通知
新しくデプロイしたときに、それまで発生していた例外を全て resolved にできる。
capistrano を使っているなら deploy.rb に下記を追加すればそれだけでデプロイの通知が出来る
require 'airbrake/capistrano
capistrano 使ってないなら下記の rake タスクを実行する
rake airbrake:deploy TO=#{rails_env} REVISION=#{current_revision} REPO=#{repository} USER=#{local_user}
オプション
Airbrake.nofity
には例外オブジェクト以外にもいろいろ渡せる。
begin
params = {
# params that you pass to a method that can throw an exception
}
my_unpredicable_method(params)
rescue => e
Airbrake.notify_or_ignore(
:error_class => "Special Error",
:error_message => "Special Error: #{e.message}",
:parameters => params
)
end