読者です 読者をやめる 読者になる 読者になる

おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

エラー通知用ウェブサービス airbrake のメモ

rails

エラー通知用のウェブサービス 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_usercurrent_member で取得できるインスタンスを「ログインユーザ」としている。(両方あるときは current_user優先)。

他のメソッド名使いたければ alias_method すればおk。

デフォルトでは下記の属性を取得する

  • id
  • name
  • username
  • email

下記のようにしてカスタム出来る

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