errbitで多い日も安心

プログラムの開発中はエラー発生の連続なものですが、特に開発の初期にはログ出力部分が未整備で、必要な情報が記憶されてなかったりするものです。

こんなときクラッシュレポートサービスを使うと、ほんの少しの手間でエラーが発生したら自動的に情報をクラッシュレポートサーバに転送してくれるようになります。
後はブラウザからその時のパラメータ、スタックトレースなどの情報を見ることができるようになります。

有名なクラッシュレポートサービスとしては[Airbrake](https://airbrake.io/)がありますが、有料サービスなので気軽に試してみることができません。
実は[Errbit](https://github.com/errbit/errbit)というAirbrake互換のオープンソースプロジェクトがあります。
Airbrake互換ということは、クライアントプログラムに仕込むプラグインがAirbrakeのものが使えるということです。

# Errbitのインストール
Errbitはrubyで書かれています。
特にパッケージ化はされていないので、ソースをcloneしてbundlerでライブラリをインストールしていきます。

以下Ubuntu 16.10でインストールした手順を示しますので参考にしてください。

```bash
$ apt-get install ruby-dev bundler libxml2-dev libxslt-dev libcurl4-openssl-dev libzip-dev libssl-dev mongodb make gcc g++
$ git clone https://github.com/errbit/errbit.git
$ cd errbit
$ bundle install --path=vendor/bundle
$ bundle exec rake errbit:bootstrap
```

`errbit:bootstrap`を実行すると以下のように、初期アカウントが生成されて、そのアカウント名とパスワードが表示されます。
忘れずにメモしておいてください。

```bash
(snip)
Seeding database
-------------------------------
Creating an initial admin user:
-- email:    errbit@errbit.example.com
-- password: hfnMO-tYWThr

Be sure to note down these credentials now!

MONGOID: Created indexes on Backtrace:
(snip)
```

以下のコマンドでerrbitが起動します。

```bash
$ bundle exec rails server
```

デフォルトだと`localhost:3000`での待ち受けになります。
`bind ip` と `port`を変更したい場合は`-b`オプション、　`-p`オプションで指定してください。


```bash
$ bundle exec rails server -b 0.0.0.0 -p 80
```

あとはブラウザからアクセスすればErrbitの画面が表示されるはずです。

<img width="961" alt="スクリーンショット 2016-12-09 15.05.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/3da8c177-4e16-8ce2-06f2-ce2a403e1cde.png">

# Errbitの使い方
先に表示された初期アカウントを使ってログインするとこんな画面になります。
<img width="964" alt="スクリーンショット 2016-12-09 15.09.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/ac04e30b-a960-209d-c0a0-29203fb83adb.png">

右上の`Add a New App`をクリックしてください。
新しいAppを作成します。いろいろ設定項目がありますが名前以外は空白できます。

<img width="953" alt="スクリーンショット 2016-12-09 15.10.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/f6aa53bc-b383-d35a-6095-21e4f45ae50a.png">

Appを作成すると`project_key`が発行されます。
![スクリーンショット 2016-12-09 15.12.01.png](https://qiita-image-store.s3.amazonaws.com/0/145575/401840d0-8ca9-0845-d778-9d9d78affbae.png)

# クライアント側
ではErrbitにクラッシュレポートを送ってみましょう。今回はPHP版Airbrakeである[PHPBrake](https://github.com/airbrake/phpbrake)でテストします。

まずはcomposerでPHPBreakをインストールします。　
```
$ composer require airbrake/phpbrake
```

スクリプトはこんな感じ。

```php
// Create new Notifier instance.
$notifier = new Airbrake\Notifier([
    'projectId' => true,
    'projectKey' => 'XXXXXXXXXXXXXXXXXXXXXXXXXX',	// project_key
    'host' => 'http://XXXXXXXX.compute.amazonaws.com',	// Errbitをインストールしたホスト名 or IP
]);

// Set global notifier instance.
Airbrake\Instance::set($notifier);

// Register error and exception handlers.
$handler = new Airbrake\ErrorHandler($notifier);
$handler->register();

// 例外をthrowしてみる。
throw new Exception('Hello, World!');
```

これを実行すると、Errbitにエラーが記録されていることがわかります。
<img width="986" alt="スクリーンショット 2016-12-09 15.42.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/04253594-77c8-1cdb-4767-2e858315891c.png">

タイトルをクリックすると詳細を確認することができます。
スタックトレースや環境変数などもここから確認できます。

<img width="927" alt="スクリーンショット 2016-12-09 17.01.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/07192032-9d3f-6513-3e99-6f0b944c04de.png">
<img width="922" alt="スクリーンショット 2016-12-09 17.01.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/494874eb-3258-4460-54d4-a38a06afec17.png">
![スクリーンショット 2016-12-09 17.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/145575/8258f7eb-1a45-a654-c535-6260aec380f5.png)

クラッシュレポートはサーバサイドでも十分威力を発揮しますが、クライアントサイド（ブラウザのJavaScript,アプリ）に仕込んでおけば、クライアントで発生したエラーを補足できますので非常に便利だと思います。（特に本番かどうしてから）

JavaScriptのAirbrakeクライアントとしては[Airbrake-JS](https://github.com/airbrake/airbrake-js)があります。（アプリ用のAirbrakeクライアントもきっとあるはず。）


# Laravel使いの方へ
フレームワークにLaravel　（またはLumen） を使っている方へ朗報。
Laravelにはそれ用の[Airbrakeプロバイダ](https://packagist.org/packages/rigor789/airbrake-laravel)が用意されていますので、composerでrequireして、

`app/config.php`にプロバイダを登録。

```php:app/config.php
    'providers' => [
        ...
        'rigor789\AirbrakeLaravel\AirbrakeServiceProvider',
        ...

    ],
```

（Lumen の場合は`bootstrap/app.php`）

あとは`.env`ファイルに`project_key`を指定するだけ。

```shell:.env
AIRBRAKE_ENABLED=true
AIRBRAKE_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXX
```

これでwebアクセスの場合も、`artisan`からのCommand起動の場合もエラー発生時の面倒を見てくれます。
さすがLaravel(Lumen)ですね。

# （おまけ）Slack通知を有効にする
Errbitにレポートが登録されたときに、slackに通知するように設定しておくと便利です。

まずはSlackのweb画面のCustom Integrationsから、Incoming WebHooksを選択しましょう。
![スクリーンショット 2016-12-09 18.14.05.png](https://qiita-image-store.s3.amazonaws.com/0/145575/a7d68f16-0a00-c857-a0a5-d8147af151ef.png)

Add Configurationから通知先のチャネル名を選択。
![スクリーンショット 2016-12-09 18.16.15.png](https://qiita-image-store.s3.amazonaws.com/0/145575/1de69701-cfcb-1f9d-6d1f-96efdf596553.png)

するとWebhook URLが発行されます。
![スクリーンショット 2016-12-09 18.19.02.png](https://qiita-image-store.s3.amazonaws.com/0/145575/1c6f540a-6b1c-ab9f-6494-2abb11fb9e7b.png)

あとはこのWebook URLをErrbit側のApp設定でNOTIFICATION SERIVCEからSLACKを選択して、HOOK URLに貼り付けるだけです。
![スクリーンショット 2016-12-09 18.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/145575/2ae4dc32-7080-d4a5-34b1-6f0940ca9ae3.png)


レポートが登録されると、slackから通知が来ます。
![スクリーンショット 2016-12-09 18.24.27.png](https://qiita-image-store.s3.amazonaws.com/0/145575/51aa091b-5ca9-52af-eb93-ddec7bc2a802.png)

便利ですね。