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.
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#L46This 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
Specify a non-existent User as an argument and execute the mail sending process.
ActiveJob::DeserializationError
occurs 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.
In the case of
ActiveJob::DeserializationError
,self
is the Mailer class itself, soself.class.ancestors.include?(ActionMailer::Base) #=> false
is determined. Noarguments
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.