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
では以下のエラーはキャッチしないようにデフォルトで設定している。
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にし、テストをすると良い。