akishin999の日記

調べた事などを書いて行きます。

Ruby から Sentry を使う

前回インストールした Sentry に Ruby からイベントを登録してみます。
Ruby から Sentry を使うには、プロジェクトの設定画面の Ruby のところにも書いてあるように sentry-raven という gem を使います。

getsentry/raven-ruby
https://github.com/getsentry/raven-ruby

インストール

gem から入れる場合は以下。

# gem install sentry-raven --no-rdoc --no-ri

bundler から入れる場合は Gemfile を作成。

# bundle init
# vi Gemfile

以下を追記します。

gem "sentry-raven"

bundle install します。

# bundle install

Ruby から使う

以下のような Ruby コードを記述します。

require 'raven'

Raven.configure do |config|
  config.dsn = 'http://6e874f2d864c4925b2049069f5e8af86:04756c0af5154d69aee463018cef97c0@192.0.2.1/2'
end

Raven.capture do
  1 / 0
end

config.dsn には Sentry 上で [設定]-[APIキー] のところに表示されている値を使用します。

実行してみます。

 % ruby sentry01.rb 
I, [2014-03-23T17:08:18.060929 #10369]  INFO -- : ** [Raven] Raven 0.7.1 ready to catch errors
D, [2014-03-23T17:08:18.062539 #10369] DEBUG -- : ** [Raven] Sending event 18180a944cdd445799d8de694e7691e8 to Sentry
D, [2014-03-23T17:08:18.068214 #10369] DEBUG -- : ** [Raven] Raven HTTP Transport connecting to http://192.0.2.1
sentry-ex01.rb:8:in `/': divided by 0 (ZeroDivisionError)
    from sentry-ex01.rb:8:in `block in <main>'
    from /home/akishin/.anyenv/envs/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/sentry-raven-0.7.1/lib/raven.rb:89:in `call'
    from /home/akishin/.anyenv/envs/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/sentry-raven-0.7.1/lib/raven.rb:89:in `capture'
    from sentry-ex01.rb:7:in `<main>'

例外が発生しました。
Raven.capture に指定したブロックの内部で例外が発生すると自動的に Sentry に通知されます。

実行後に Sentry 上ストリームを見ると以下のようにエラーが通知されているはずです。

また、例外を自分で処理した上で通知を行いたい、という場合には capture_exception が使用できます。

begin
  raise ArgumentError.new("test")
rescue ArgumentError => e
  Raven.capture_exception(e)
end

例外ではない、任意のイベントを通知したい場合には capture_message を使用します。

Raven.capture_message("test event", {
  level: 'debug',
  logger: 'debug',
  extra: { foo: "123", bar: "abc" },
})

Rails から使う

Rails から使う場合は、まずは作成した Rails プロジェクトの Gemfile に sentry-raven を追記して bundle install します。
インストールすると以下の rake タスクが追加されます。

 % bundle exec rake -T | grep raven   
rake raven:test[dsn]                    # Send a test event to the remote Sentry server

このタスクに Sentry の画面で確認した dsn を指定することで Sentry の動作確認を行う事ができます。
実行して以下のような感じで event ID が取得できていれば Sentry サーバとの通信は成功しています。

 % bundle exec rake "raven:test[http://6e874f2d864c4925b2049069f5e8af86:04756c0af5154d69aee463018cef97c0@192.0.2.1/2]"
Client configuration:
-> server: http://192.0.2.1
-> project_id: 2
-> public_key: 6e874f2d864c4925b2049069f5e8af86
-> secret_key: 04756c0af5154d69aee463018cef97c0

Sending a test event:
-> event ID: e09165be7fb741a18ebe214139430c39

Done!

Sentry 画面のストリームからもこのテストイベントを確認することが出来ます。

テストが問題なければ、Rails から sentry-raven を使うための設定ファイルを作成します。

% vi config/initializers/raven.rb

以下のような内容を記述します。
Raven-Ruby はデフォルトでは development 環境の時にイベントの送信を行わないので、ここでは確認のため config.environments で対象に含めるよう設定しています。

Raven.configure do |config|
  config.dsn = 'http://6e874f2d864c4925b2049069f5e8af86:04756c0af5154d69aee463018cef97c0@192.0.2.1/2'
  config.environments = %w[ development ]
end

これで設定は完了です。
Rails で使う場合はこれだけで処理されなかった例外が全て Sentry へ通知されるようになります。
Controller 内などで適当に例外を投げてみれば Sentry へ通知される事が確認できると思います。

まとめ

エラー管理ツールについては実際に試してみるまでは「ログ見ればいいじゃん」などと思っていましたが、使ってみると本番環境でしか発生しなかったり、たまにしか発生しなかったりするようなエラーまでその発生箇所や発生頻度を一元管理することができるようになり、その有用性が理解できました。

また、Sentry ではエラーだけでなく、任意のイベントを管理する事もできるため、どの処理がどれくらい呼ばれているか、などといった事も簡単に調べる事ができるので、プロダクトの品質向上に一役買ってくれそうです。

ちなみに、他のサービスなどとの連携についてはプラグイン方式を取っているようです。
対応しているサービスは以下のページの [3rd Party Extensions] にまとまっています。

Plugins
https://sentry.readthedocs.org/en/latest/plugins/index.html

これらのサービスと連携させる事でより効果的に活用することができそうです。