無料エラー収集システムErrbitで、ログファイルをgrepする生活とサヨナラ


## なぜエラートラッキングシステムが必要なのか

多くの開発者は、開発環境での手動テスト、テストコードの実装に多くの時間をかけている事と思います。
しかしながら、本番環境やステージング環境でもエラーは起こりうるものです。
このようなエラーに気づくのが遅れるほど、ユーザ体験は低下し、結果的に機会損失を招く事となります。エラーに気づいた際に、過去のログをgrepしたりするのも、非常に労力がかかります。

このような課題を解決するため、エラーの概要、Backtrace、発生時のセッション情報などの詳細情報をWebインタフェースで管理でき、類似したエラーを分類したり、担当者へメールやSlackで通知するための仕組みがエラートラッキングシステムです。

代表的なものとしてAirbrakeがありますが、スタートアップとしては少しお高い値段です。

## Errbitとは

AirbrakeのOSSクローンです。実際にはAirbrakeのAPIとも互換性があり、非常に使い勝手の良い製品となっています。


## 必要なもの

普段、mac上でRailsアプリケーションを開発している方であれば、このあたりが用意されていれば大丈夫です。

- 動作するRailsアプリケーション
- mongodb

## 構築手順

まずErrbitを構築し、その後、既存のRailsアプリケーションにエラーを通知するための設定が必要となります。

### Errbitの構築

*適当なディレクトリにソースコードを取得*

```zsh
git clone https://github.com/errbit/errbit.git
cd errbit
```

*必要なgemをインストール*

```zsh
bundle install --path=vendor/bundle --binstubs=vendor/bin
```

*Errbitの起動準備*

```zsh
rake errbit:bootstrap


Creating an initial admin user:
-- email: errbit@errbit.example.com
-- password: your_password

```
ここで表示されるemailとpasswordは後ほど必要になりますので、控えておきます。


*mongodbを起動*

```zsh
mongod --config /usr/local/etc/mongod.conf
```


*適当なポートでErrbitを起動*

```
rails s -p 8080
```

*webインタフェースが表示される*

![スクリーンショット 2015-04-12 17.24.58.png](https://qiita-image-store.s3.amazonaws.com/1489/34321/be1101cb-faea-78c5-2d4c-0002e93defbd.png "スクリーンショット 2015-04-12 17.24.58.png")

webインタフェースからAPI_KEYを取得します。

**既存のRailsアプリケーションにエラー通知のための仕組みを導入する**

airbrakeのgemを用いて、Errbit側にエラーを通知します。

```ruby:Gemfile
    # error tracking
    gem 'airbrake'
```

環境によってはairbrakeが必要ない場合もあるかもしれません。今回は諸事情によりstaging環境とdevelopment環境にairbrakeを導入しています。


```ruby:config/initializers/errbit.rb
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やポート番号は環境変数を用いてセットしています。

```~/.zshrc
export API_KEY=hogefuga_api_key
export API_PORT=8080
```

```zsh
source ~/.zshrc
```

## テスト


まずは一連の設定が正しい事をテストしてみます。


```zsh
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/...

```

例外発生を通知し、正常にレスポンスが返って来ています。


次に、オンライン処理で例外発生した場合の挙動を確認します。
アプリケーションのエントリポイントで例外発生させてみます。

```ruby:app/controllers/hoge_controller.rb

def login
  raise 'exception inside hoge_controller'
end

```


最後に、バッチ処理で例外発生した場合の挙動を確認します。

```ruby:lib/tasks/notification.rake
raise 'exception inside rake task'
```

それぞれのエラーをErrbitのWebインタフェースで確認できれば、テスト終了です。


## 参考資料

[Using Airbrake with Rake](https://github.com/airbrake/airbrake/wiki/Using-Airbrake-with-Rake)

## 更に上を目指すなら

様々な通知サービスと連携できたり、複数人で使えたり、非常にクオリティの高い製品だと思います。
応用として、このあたりに挑戦してみても面白いかもしれません。

- GitHub issueとの連携
- Slack、HUBOT、HIPCHATとの連携
- Errbitの開発に参加