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