ActionController::RoutingError を Sentry のエラーとして分類する方法
概要
Rails 6.1 アプリケーションには、Ruby 用の新しい Sentry (Raven ではありません) を使用しています。
gem "sentry-ruby"
gem "sentry-rails"
ユーザーが ActionController::RoutingError をトリガーしたときのトランザクションを確認できますが、これらを Sentry でエラーとして表示したいと考えています。 ActionController::RoutingError が「無視」または「除外」エラーとして表示されません。
> Sentry::Configuration::IGNORE_DEFAULT
=> ["Mongoid::Errors::DocumentNotFound", "Rack::QueryParser::InvalidParameterError", "Rack::QueryParser::ParameterTypeError", "Sinatra::NotFound"]
Sentry.rb 初期化ファイルの Excluded_Exceptions をクリアしようとしましたが、効果はありませんでした。
Sentry.init do |config|
...
config.excluded_exceptions = []
end
これらがエラーとして送信されるように Sentry を設定するにはどうすればよいですか?また、ミドルウェア (ActionDispatch?、ActionPack?) を変更して、必要に応じて Sentry.capture_message を追加できるとも考えましたが、その方法がわかりません。
ErrorController または ApplicationController にリダイレクトする「キャッチオール」ルートは必要ありません。
’*path’ と一致: “application#handle_route_error”、経由: :all
解決策
問題は、このエラーが Rails でデフォルトで処理され、「Not Found」応答で救済されることです。
もちろん、ルーターを使用してそのようなエラー (「見つからない」、「処理できないエンティティ」、「内部サーバー エラー」など) を手動で処理し、ErrorsController などの特定のアクションで応答することもできます。そこからSentryにメッセージを送信できます
しかし、そのような決定は望まないので、ミドルウェアまたは正確に ActionController::RoutingError にモンキーパッチを適用することができます。このエラーのソースを見つけて、次のように初期化子を追加します
# config/initializers/handle_routing_error.rb
module ActionController
class RoutingError < ActionControllerError
attr_reader :failures
def initialize(message, failures = [])
Sentry.capture_message(message) # or Sentry.capture_error(self)
super(message)
@failures = failures
end
end
end
通常、モンキーパッチはハックであり、良い解決策ではありませんが、うまくいきます