なぜエラートラッキングシステムが必要なのか
多くの開発者は、開発環境での手動テスト、テストコードの実装に多くの時間をかけている事と思います。
しかしながら、本番環境やステージング環境でもエラーは起こりうるものです。
このようなエラーに気づくのが遅れるほど、ユーザ体験は低下し、結果的に機会損失を招く事となります。エラーに気づいた際に、過去のログをgrepしたりするのも、非常に労力がかかります。
このような課題を解決するため、エラーの概要、Backtrace、発生時のセッション情報などの詳細情報をWebインタフェースで管理でき、類似したエラーを分類したり、担当者へメールやSlackで通知するための仕組みがエラートラッキングシステムです。
代表的なものとしてAirbrakeがありますが、スタートアップとしては少しお高い値段です。
Errbitとは
AirbrakeのOSSクローンです。実際にはAirbrakeのAPIとも互換性があり、非常に使い勝手の良い製品となっています。
必要なもの
普段、mac上でRailsアプリケーションを開発している方であれば、このあたりが用意されていれば大丈夫です。
- 動作するRailsアプリケーション
- mongodb
構築手順
まずErrbitを構築し、その後、既存のRailsアプリケーションにエラーを通知するための設定が必要となります。
Errbitの構築
適当なディレクトリにソースコードを取得
git clone https://github.com/errbit/errbit.git
cd errbit
必要なgemをインストール
bundle install --path=vendor/bundle --binstubs=vendor/bin
Errbitの起動準備
rake errbit:bootstrap
Creating an initial admin user:
-- email: errbit@errbit.example.com
-- password: your_password
ここで表示されるemailとpasswordは後ほど必要になりますので、控えておきます。
mongodbを起動
mongod --config /usr/local/etc/mongod.conf
適当なポートでErrbitを起動
rails s -p 8080
webインタフェースが表示される
webインタフェースからAPI_KEYを取得します。
既存のRailsアプリケーションにエラー通知のための仕組みを導入する
airbrakeのgemを用いて、Errbit側にエラーを通知します。
# error tracking
gem 'airbrake'
環境によってはairbrakeが必要ない場合もあるかもしれません。今回は諸事情によりstaging環境とdevelopment環境にairbrakeを導入しています。
require 'rake'
require 'airbrake/rake_handler'
Airbrake.configure do |config|
config.api_key = ENV['API_KEY']
config.host = 'localhost'
config.port = ENV['API_PORT']
config.development_environments = []
config.secure = config.port == 443
# report exceptions that happen inside a rake task
config.rescue_rake_exceptions = true
end
ENV['API_PORT'] にはErrbitが使用しているポート番号を指定します。
このあたりの情報をgitで管理すると、柔軟な設定が出来なくなったり、開発メンバーによってアクセス権限レベルを分けたりする事が難しくなります。
そこで、ここではAPI_KEYやポート番号は環境変数を用いてセットしています。
export API_KEY=hogefuga_api_key
export API_PORT=8080
source ~/.zshrc
テスト
まずは一連の設定が正しい事をテストしてみます。
rake airbrake:test
Started GET "/verify" for at 2015-04-12 17:43:47 +0900
Raising 'AirbrakeTestingException' to simulate application failure.
** [Airbrake] Success: Net::HTTPOK
** [Airbrake] Environment Info: [Ruby: 2.2.0] [Rails: 4.1.5] [Env: development]
** [Airbrake] Response from Airbrake:
UUID: ...
URL: http://errbit.example.com:8080/locate/...
例外発生を通知し、正常にレスポンスが返って来ています。
次に、オンライン処理で例外発生した場合の挙動を確認します。
アプリケーションのエントリポイントで例外発生させてみます。
def login
raise 'exception inside hoge_controller'
end
最後に、バッチ処理で例外発生した場合の挙動を確認します。
raise 'exception inside rake task'
それぞれのエラーをErrbitのWebインタフェースで確認できれば、テスト終了です。
参考資料
更に上を目指すなら
様々な通知サービスと連携できたり、複数人で使えたり、非常にクオリティの高い製品だと思います。
応用として、このあたりに挑戦してみても面白いかもしれません。
- GitHub issueとの連携
- Slack、HUBOT、HIPCHATとの連携
- Errbitの開発に参加