Sha256: a729414d21ea83361e84435388de60fd8ab70bc55c3fcf49e2f7a50e892dd750

Contents?: true

Size: 1.68 KB

Versions: 8

Compression:

Stored size: 1.68 KB

Contents

require 'time'
require 'sidekiq'

module Raven
  class Sidekiq
    ACTIVEJOB_RESERVED_PREFIX = "_aj_".freeze

    def call(ex, context)
      context = filter_context(context)
      Raven.capture_exception(
        ex,
        :message => ex.message,
        :extra => { :sidekiq => context },
        :culprit => culprit_from_context(context)
      )
    ensure
      Context.clear!
      BreadcrumbBuffer.clear!
    end

    private

    # Once an ActiveJob is queued, ActiveRecord references get serialized into
    # some internal reserved keys, such as _aj_globalid.
    #
    # The problem is, if this job in turn gets queued back into ActiveJob with
    # these magic reserved keys, ActiveJob will throw up and error. We want to
    # capture these and mutate the keys so we can sanely report it.
    def filter_context(context)
      case context
      when Array
        context.map { |arg| filter_context(arg) }
      when Hash
        Hash[context.map { |key, value| filter_context_hash(key, value) }]
      else
        context
      end
    end

    def filter_context_hash(key, value)
      (key = key[3..-1]) if key [0..3] == ACTIVEJOB_RESERVED_PREFIX
      [key, filter_context(value)]
    end

    # this will change in the future:
    # https://github.com/mperham/sidekiq/pull/3161
    def culprit_from_context(context)
      classname = (context["class"] || (context["job"] && context["job"]["class"]))
      if classname
        "Sidekiq/#{classname}"
      elsif context["event"]
        "Sidekiq/#{context['event']}"
      else
        "Sidekiq"
      end
    end
  end
end

if Sidekiq::VERSION > '3'
  Sidekiq.configure_server do |config|
    config.error_handlers << Raven::Sidekiq.new
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
sentry-raven-2.3.1 lib/raven/integrations/sidekiq.rb
sentry-raven-2.3.0 lib/raven/integrations/sidekiq.rb
sentry-raven-2.2.0 lib/raven/integrations/sidekiq.rb
sentry-raven-2.1.4 lib/raven/integrations/sidekiq.rb
sentry-raven-2.1.3 lib/raven/integrations/sidekiq.rb
sentry-raven-2.1.2 lib/raven/integrations/sidekiq.rb
sentry-raven-2.1.1 lib/raven/integrations/sidekiq.rb
sentry-raven-2.1.0 lib/raven/integrations/sidekiq.rb