Skip to content

ActiveJob::DeserializationError is not reported in ActionMailer #1164

@tmimura39

Description

@tmimura39

I use ActionMailer.

Since we are using ActionMailer, Rollbar::ActiveJob is automatically applied.

ActionMailer::Base.send(:include, Rollbar::ActiveJob)

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
  1. 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.
#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.
rails/rails#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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions