Edited at

RailsアプリケーションにSentryを導入する

More than 1 year has passed since last update.

railsアプリケーションにSentryを導入する。


Sentry とは

https://sentry.io/welcome/

エラーログ収集に使うツールである。slack通知などもできるので便利。


Railsアプリケーションに導入

基本的にはドキュメントのとおり。

https://docs.sentry.io/clients/ruby/integrations/rails/


installation

ruby用のSentryクライアントとして、 raven-ruby gemを使う。

gem "sentry-raven"

bundle install


Configuration

config/initializers 配下などにraven.rbなど適当な名前で作成する。

Raven.configure do |config|

config.dsn = 'https://<key>:<secret>@sentry.io/<project>'
end

'https://<key>:<secret>@sentry.io/<project>' はSentryの任意のプロジェクトに接続するためのAPIキーである。

このAPIキーはRailsアプリケーションの場合、dotenvなどで環境変数として設定するのが良いだろう。


Parameters Filtering

パスワード等の情報をフィルタリングしている(このような設定をしている↓)場合

http://qiita.com/kakkunpakkun/items/4639bc653924e2dc8dbe

Raven.configure do |config|

config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s)
end

とすることでその内容をSentryに送らないようにできる。


environment

環境によってSentryを使用するか選択する場合、以下のように設定する。

(例)test, production環境で動かす場合

Raven.configure do |config|

config.environments = %w[test production]
end

開発環境で確認したい場合、config.environments = 'development' を追加する。


Test


rubyでテスト

単純にrubyコードでテストしたい場合、以下のようなコードを実行する。

Raven.capture { 1 / 0 } 


rake taskでテスト

bundle exec rake raven:test["https://<key>:<secret>@sentry.io/<project>"]

でSentryと接続テストを行うことができる。


アプリケーション上でテスト

Railsアプリケーションでは上の設定のみで、Raven.capture を呼ばなくてもSentryにエラーログを収集できる。試しにアプリケーションコード内で1/0のような例外を発生させれば良い。

またエラーハンドリングしたい場合は、Raven.capture_exception(e) メソッドを使用する。


気をつける点


エラーキャッチから除外されているものがある

sentry-ravenでは以下のエラーはキャッチしないようにデフォルトで設定している。

https://github.com/getsentry/raven-ruby/blob/a80cf01488b5dc7f3930975274c4d109816dd258/lib/raven/configuration.rb#L152-L161

    IGNORE_DEFAULT = [

'AbstractController::ActionNotFound',
'ActionController::InvalidAuthenticityToken',
'ActionController::RoutingError',
'ActionController::UnknownAction',
'ActiveRecord::RecordNotFound',
'CGI::Session::CookieStore::TamperedWithCookie',
'Mongoid::Errors::DocumentNotFound',
'Sinatra::NotFound'
].freeze


開発環境で動かない

自動でエラーキャッチできるはずが動かない場合、

gem 'better_errors'

gem 'binding_of_caller'

のようなgemがデバッグ用に使われるのでそこで処理が止まってしまい、ravenがcallされないことがあるかもしれない。


config.consider_all_requests_local = true にしている

詳細なデバッグ情報をHTTPレスポンスとして出力するかどうかのフラグで、development環境ではデフォルトでtrueになっている。

これが邪魔をする可能性があるので一時的にfalseにし、テストをすると良い。