RailsのエラーモニタリングツールErrbitのChefレシピ

4/17に大阪で開催されたRailsの勉強会でLTしてきました。

自分の発表資料をちょっと加筆修正したものを以下に公開しました。

テーマはRailsのエラーモニタリングです。

通知先はSlackという前提で、 exception_notificationというgemで直接Slackに通知する方法と、 New RelicやAirbrakeといったWebサービス経由で通知する方法、 Errbit というOSSのAirbrakクローン経由でSlackに通知する方法を紹介しました。

ErrbitはHerokuの無料枠で運用することが可能で、詳細なセットアップの情報が日本語でも見つかります。

Errbit - Railsアプリの本番エラーをherokuで管理、メール通知する【無料枠】 - 酒と泪とRubyとRailsと

今回はHerokuを使わずにオンプレやAmazon EC2のようなIaaSに自分でセットアップする方法を検討しました。

まずErrbitをセットアップするChefのレシピを探してみたのですが、見つかったものは対応しているErrbitのバージョンが古く、サポートもUbuntuのみでした。

errbit Cookbook - Chef Supermarket

自分はCentOSも好きなので、2015-04-17時点の最新のErrbitに対応していて、かつUbuntuとCentOSのどちらもサポートしているものを作成して公開しました。

errbit-server Cookbook - Chef Supermarket

今回はコミュニティクックブックを多めに使ってやってみました。大まかな構成は下記のとおりです。

  • コミュニティクックブックでやっていること
    • mongodbのインストール
    • rbenvとruby_buildのインストール
    • ruby 2.2.2のインストール(attributeで変更可能)
    • Errbitのチェックアウトと初期化
      • applicationクックブックを利用
      • application_rubyはマイグレーションでbundlerのrakeを使おうとせずにエラーになるのでスルー
    • ErrbitにバンドルされているUnicornをservice_factoryでサービス化(SysV or Upstart)
    • Unicornのlogrotate
  • 自前で追加した分
    • Errbitのデプロイ先のディレクトリレイアウト
    • Errbitの初期化処理(rake errbit:bootstrap)
    • ErrbitのUnicornを起動するためのラッパ作成
    • Errbitの設定値のための環境変数をattributeで設定する仕組み

Vagrantで動作を確認するための手順をsampleディレクトリに置いています。下記のバージョンの組み合わせで動作を確認しています。

  • OSX Yosemite
  • Ruby 2.2.2
  • Vagrant 1.7.2
  • VirtualBox 4.3.26
  • CentOS 6.6 or Ubuntu 14.10

CentOSで試すのであれば、ターミナルで下記のようなコマンドを入力すると、最終的に http://192.168.33.10:3000/ でローカルVM上のErrbitにログインできます。

git clone https://github.com/kwhrtsk/chef-errbit-server
cd chef-errbit-server/sample

# VMのIPアドレスを環境変数 VAGRANT_PRIVATE_NETWORK_IP に設定
source .envrc

# chefなど必要なgemをインストール
bundle install --path=vendor/bundle
bundle binstubs berkshelf chef

# errbit-serverと依存クックブックをダウンロード
./bin/berks vendor cookbooks/

# VM起動
vagrant up

レシピの適用はknife-zeroかknife-soloのいずれかを好みで。

# knife-zeroの場合
./bin/knife zero bootstrap --sudo -x vagrant -i .vagrant/machines/default/virtualbox/private_key $VAGRANT_PRIVATE_NETWORK_IP -N $VAGRANT_PRIVATE_NETWORK_IP
./bin/knife node from file node.json
./bin/knife zero chef_client "name:*" -a chef_ip -x vagrant --identity-file ./.vagrant/machines/default/virtualbox/private_key --sudo

# knife-soloの場合
./bin/knife solo bootstrap $VAGRANT_PRIVATE_NETWORK_IP --identity-file .vagrant/machines/default/virtualbox/private_key -x vagrant
./bin/knife node run_list add $VAGRANT_PRIVATE_NETWORK_IP errbit-server
./bin/knife solo cook -i .vagrant/machines/default/virtualbox/private_key vagrant@$VAGRANT_PRIVATE_NETWORK_IP

Ubuntuで試したい場合はVagrantfileの下記の部分を書き換えてください。

  config.vm.box = "chef/centos-6.6"
  #config.vm.box = "chef/ubuntu-14.10"

Errbitの組み込みの初期化処理は errbit:bootstrap というrakeタスクです。 このタスクを実行するとErrbitの初期ユーザが作成されるのですが、パスワードは毎回ランダムに生成され、標準出力に出力されます。 このレシピではその出力を /opt/errbit/bootstrap.out に記録しています。

レシピの適用が終わったら、下記のコマンドを実行して初期ユーザの認証情報を確認して下さい。

vagrant ssh -- cat /opt/errbit/bootstrap.out

こんな内容です。

Seeding database
-------------------------------
Creating an initial admin user:
-- email:    [email protected]
-- password: Lwc_FBV81Z2z

Be sure to note down these credentials now!

SlackのWebhookはSlackの管理画面で作成することができます。

ここで作ったURLをErrbitのアプリ登録画面で入力します。

登録すると下記のように自分のRailsアプリに置く設定ファイル(config/initializers/errbit.rb)が表示されます。

Gemfileに gem 'airbrake' を追加してRAILS_ENV=productionで例外を発生させれば、 Errbitにエラーが登録されると同時に、slackにも通知が届くはずです。

同一のエラーが複数回届いた場合、何度目のエラーで通知するかを指定できます。 chef-errbit-serverはデフォルトでは1回目、10回目、100回目に通知を行います。 (メールでの通知は行わないようにしています)

このあたりの設定はattributeで変更できるようにしています。 詳細はドキュメントを参照してください。