/ #sidekiq #rails 

sentry-ravenはデフォルトではActiveRecord::RecordNotFoundを通知してくれない

Sidekiqでエラーが起きてるっぽいにもかかわらず、sentryに通知されず、謎ですねみたいな現象がありました。

調べたところ、

sentry-ravenはデフォルト設定では特定の例外を通知してくれない!!

ということがわかりました。

ActiveRecord::RecordNotFoundに気づきたい場合は、設定をいじる必要があります。

ドキュメント

ドキュメントの、このへん に書かれていました。

該当箇所のソース抜粋

以下の通り、IGNORE_DEFAULTという定数で例外名が列挙されており、excluded_exceptions で設定できるようになっています。

https://github.com/getsentry/raven-ruby/blob/v2.11.0/lib/raven/configuration.rb#L175-L185

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

https://github.com/getsentry/raven-ruby/blob/v2.11.0/lib/raven/configuration.rb#L211

      self.excluded_exceptions = IGNORE_DEFAULT.dup


config/initializers/sentry.rb での設定例

ということで、ActiveRecord::RecordNotFound が通知されるようにするには、このようにすれば良いです。

Raven.configure do |config|
  # ...普段の設定....

  config.excluded_exceptions -= ['ActiveRecord::RecordNotFound']
end


しかし、私の職場の場合は、webサーバ(puma)では今のままでもいいので、

Sidekiqやrakeタスクでのみこの設定を有効にしたい

という感じでした。

最善の方法かどうかはわかりませんが、$PROGRAM_NAMEの内容を見て場合分けするようにしてみました。

Raven.configure do |config|
  # ...普段の設定....

  # NOTE:
  # sentry-ravenのデフォルト設定により、特定の例外が通知無効になっているが
  # sidekiqやrakeタスクの場合は、RecordNotFoundはsentryに通知したい
  if %w(sidekiq rake).any? { |name| $PROGRAM_NAME.include? name }
    config.excluded_exceptions -= ['ActiveRecord::RecordNotFound']
  end
end


…これでうまく動いています! 🍻


Author

hoshinotsuyoshi

星野剛志(ほしのつよし) web application engineer. ruby/rails/docker