rollbar-gem
rollbar-gem copied to clipboard
`ActiveJob::DeserializationError` is not reported in ActionMailer
I use ActionMailer.
Since we are using ActionMailer, Rollbar::ActiveJob is automatically applied.
https://github.com/rollbar/rollbar-gem/blob/c4edf7e5094c3c043f2032fe560d217d5057c752/lib/rollbar/plugins/active_job.rb#L46
This makes it very convenient that any exceptions that occur during the mail sending process are automatically reported to the Rollbar.
Steps to reproduce
- Prepare a Mailer class like this
class ExampleMailer < ApplicationMailer
def hello(user)
# something...
end
end
- Specify a non-existent User as an argument and execute the mail sending process.
ExampleMailer.hello(User.new(id: -1)).deliver_later
ActiveJob::DeserializationErroroccurs due to non-existent User and mail sending fails.
Expected behavior
Reported in Rollbar
Actual behavior
Not reported in Rollbar
Possible Causes
However, I noticed that Rollbar is not notified about ActiveJob::DeserializationError.
https://github.com/rollbar/rollbar-gem/pull/1146 We believe this fix is the cause.
This fix is intended to prevent double reporting of exceptions generated inside ActionMailer.
The following is controlled for ActionMailer.
# When included in ActionMailer, the handler is called twice.
# This detects the execution that has the expected state.
if defined?(ActionMailer::Base) && self.class.ancestors.include?(ActionMailer::Base)
Rollbar.error(exception, job_data)
# This detects other supported integrations.
elsif defined?(arguments)
Rollbar.error(exception, job_data)
end
In the case of ActiveJob::DeserializationError, self is the Mailer class itself, so self.class.ancestors.include?(ActionMailer::Base) #=> false is determined.
No arguments are defined for the ActionMailer class itself.
The result does not seem to be reported in Rollbar.
This PullRequest is also helpful. https://github.com/rails/rails/pull/25018
Workaround
If you rescue_from ActiveJob::DeserializationError in the Mailer class, you can notify Rollbar as expected.
class ApplicationMailer < ActionMailer::Base
rescue_from ActiveJob::DeserializationError do |exception|
Rollbar.error(exception)
end
end