🔖

sentry-ravenからsentry-ruby移行時に気をつけること

2022/02/09に公開

今まで Rails アプリケーションの Sentry クライアントとしてsentry-ravenという Gem を使わせてもらってました。
https://github.com/getsentry/sentry-ruby/tree/master/sentry-raven

そのsentry-ravenがメンテナンスモードになったため、最近sentry-rubyに移行しました。
https://github.com/getsentry/sentry-ruby

移行自体はドキュメントの通りに進めればそこまで大変ではないのですが、1 点ドキュメントには書いてない点で気をつけたほうがいいことがあったので共有できればと思います(正確には元々の使い方が悪かっただけなのですが...)。
https://docs.sentry.io/platforms/ruby/migration/

capture_exception と capture_message の引数を見直そう

例えば移行前に下記のようなコードがあったとします。

begin
  1 / 0
rescue ZeroDivisionError => e
  Raven.capture_message(e)
end

上記のコードでエラーは出ないのですが、移行してRaven.capture_message(e) から Sentry.capture_message(e)に変更するとエラーが発生してしまいます。

ArgumentError: expect the argument to be a String, got ZeroDivisionError (#<ZeroDivisionError: divided by 0>)

sentry-raven では capture_exception と capture_message がエイリアスメソッドだった

そもそもcapture_messageは Sentry にテキスト情報を送るメソッドなので引数に文字列を指定しないといけません。
https://docs.sentry.io/platforms/ruby/usage/#capturing-messages

ではなぜRaven.capture_message(e)は引数に文字列を指定しなくても実行できていたのだろうと調べてると、
どうやらcapture_exceptioncapture_messageは両方capture_typeのエイリアスメソッドだったため実行できたようです。
https://www.rubydoc.info/gems/sentry-raven/Raven%2FRack.capture_type
https://github.com/getsentry/sentry-ruby/blob/master/sentry-raven/lib/raven/integrations/rack.rb#L35

capture_messageの引数が文字列ではなくてもcapture_exceptionの方の引数として解釈され、capture_exceptionメソッドとして動いていたみたいですね。

ではsentry-rubyではどうかというと、見た感じそれぞれ別個のメソッドとして独立していました。
なので移行した時にエラーが起きたと思われます。
https://github.com/getsentry/sentry-ruby/blob/master/sentry-ruby/lib/sentry-ruby.rb#L292
https://github.com/getsentry/sentry-ruby/blob/master/sentry-ruby/lib/sentry-ruby.rb#L284

もしこれからsentry-ravenからsentry-rubyに移行する方がいましたら、お気をつけくださいー!

Discussion