We are using delayed_job for background jobs and didn’t see a built-in option to send email notifications when a job failed. Since we were already using exception_notification to email application exceptions, we thought it would be nice to integrate that.

With some code from here and here, we put together the initializer below and created a email template in app/views/exception_notifier/_delayed_job.text.erb per the instructions.

We have this running in production now. Each of our Delayed Jobs are set up as classes and use the failure hook. We are now receiving email notifications of job failures and it helps us resolve them quickly!

# Chain delayed job's handle_failed_job method to do exception notification
Delayed::Worker.class_eval do
  def handle_failed_job_with_notification(job, error)
    handle_failed_job_without_notification(job, error)

    # only actually send mail in production
    if Rails.env.production?
      # rescue if ExceptionNotifier fails for some reason
      begin
        env = {}
        env['exception_notifier.options'] = {
          :sections => %w(backtrace delayed_job),
          :email_prefix => '[Delayed Job ERROR] ',
          :exception_recipients => %w(engineering@yourcompany.com),
          :sender_address => %(postmaster@yourcompany.com)
        }
        env['exception_notifier.exception_data'] = {:job => job}
        ::ExceptionNotifier::Notifier.exception_notification(env, error).deliver

      rescue Exception => e
        Rails.logger.error "ExceptionNotifier failed: #{e.class.name}: #{e.message}"

        e.backtrace.each do |f|
          Rails.logger.error "  #{f}"
        end

        Rails.logger.flush
      end
    end
  end

  alias_method_chain :handle_failed_job, :notification
end