rollbar / rollbar-gem

Exception tracking and logging from Ruby to Rollbar
https://docs.rollbar.com/docs/ruby
MIT License
448 stars 280 forks source link

`ActiveJob::DeserializationError` is not reported in ActionMailer #1164

Open tmimura39 opened 2 months ago

tmimura39 commented 2 months ago

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

  1. Prepare a Mailer class like this

    class ExampleMailer < ApplicationMailer
    def hello(user)
    # something...
    end
    end
  2. Specify a non-existent User as an argument and execute the mail sending process.

ExampleMailer.hello(User.new(id: -1)).deliver_later
  1. 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.

# 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
linear[bot] commented 2 months ago

SDK-389 `ActiveJob::DeserializationError` is not reported in ActionMailer