🔖

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

2022/02/09に公開約1,700字

今まで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

ログインするとコメントできます