class Bugsnag::Resque

Constants

FRAMEWORK_ATTRIBUTES

Public Class Methods

add_failure_backend() click to toggle source

Sets up the Resque failure backend.

# File lib/bugsnag/integrations/resque.rb, line 20
def self.add_failure_backend
  return if ::Resque::Failure.backend == self

  # Ensure resque is using a "Multiple" failure backend
  unless ::Resque::Failure.backend <= ::Resque::Failure::Multiple
    original_backend = ::Resque::Failure.backend
    ::Resque::Failure.backend = ::Resque::Failure::Multiple
    ::Resque::Failure.backend.classes ||= []
    ::Resque::Failure.backend.classes << original_backend
  end

  # Add Bugsnag failure backend
  unless ::Resque::Failure.backend.classes.include?(self)
    ::Resque::Failure.backend.classes << self
  end
end
configure(&block) click to toggle source

Callthrough to Bugsnag configuration.

# File lib/bugsnag/integrations/resque.rb, line 13
def self.configure(&block)
  add_failure_backend
  Bugsnag.configure(&block)
end

Public Instance Methods

save() click to toggle source

Notifies Bugsnag of a raised exception.

# File lib/bugsnag/integrations/resque.rb, line 39
def save
  Bugsnag.notify(exception, true) do |report|
    report.severity = "error"
    report.severity_reason = {
      :type => Bugsnag::Report::UNHANDLED_EXCEPTION_MIDDLEWARE,
      :attributes => FRAMEWORK_ATTRIBUTES
    }

    metadata = payload
    class_name = metadata['class']

    # when using Active Job the payload "class" will always be the Resque
    # "JobWrapper", so we need to unwrap the actual class name
    if class_name == "ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper"
      unwrapped_class_name = metadata['args'][0]['job_class'] rescue nil

      if unwrapped_class_name
        class_name = unwrapped_class_name
        metadata['wrapped'] ||= unwrapped_class_name
      end
    end

    context = "#{class_name}@#{queue}"
    report.meta_data.merge!({ context: context, payload: metadata })
    report.automatic_context = context
  end
end