lib/raven/integrations/sidekiq.rb in sentry-raven-2.0.2 vs lib/raven/integrations/sidekiq.rb in sentry-raven-2.1.0

- old
+ new

@@ -1,58 +1,64 @@ require 'time' require 'sidekiq' module Raven class Sidekiq - def call(_worker, msg, _queue) - started_at = Time.now - yield - rescue Exception => ex - Raven.capture_exception(ex, :extra => { :sidekiq => msg }, - :time_spent => Time.now - started_at) - raise + 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 - end -end -if Sidekiq::VERSION < '3' - # old behavior - ::Sidekiq.configure_server do |config| - config.server_middleware do |chain| - chain.add ::Raven::Sidekiq + 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 - end -else - Sidekiq.configure_server do |config| - config.error_handlers << proc do |ex, context| - Raven.capture_exception(ex, :extra => { - :sidekiq => filter_context(context) - }) + + def filter_context_hash(key, value) + (key = key[3..-1]) if key [0..3] == ACTIVEJOB_RESERVED_PREFIX + [key, filter_context(value)] end - end -end -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 + # 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 -def filter_context_hash(key, value) - # Strip any `_aj` prefixes from keys. - # These keys come from an internal serialized object from ActiveJob. - # Internally, there are a subset of keys that ActiveJob references, but - # these are declared as private, and I don't think it's wise - # to keep chasing what this list is. But they all use a common prefix, so - # we want to strip this becuase ActiveJob will complain. - # e.g.: _aj_globalid -> _globalid - (key = key[3..-1]) if key [0..3] == "_aj_" - [key, filter_context(value)] +if Sidekiq::VERSION > '3' + Sidekiq.configure_server do |config| + config.error_handlers << Raven::Sidekiq.new + end end