22
33require "sentry/sidekiq/retry_policy"
44require "sentry/sidekiq/context_filter"
5+ require "sentry/sidekiq/active_job_support/job_extension"
56
67module Sentry
78 module Sidekiq
89 class JobExtension < Sentry ::JobExtensions ::Extension
10+ prepend ActiveJobSupport ::JobExtension
11+
912 SPAN_ORIGIN = "auto.queue.sidekiq"
1013 SIDEKIQ_NAME = "Sidekiq"
11- ACTIVE_JOB_ADAPTER = "ActiveJob::QueueAdapters::SidekiqAdapter"
12- SIDEKIQ_JOB_KEY = "_sentry_sidekiq_job"
1314 ENQUEUED_AT_IN_MILLISECONDS = ::Gem ::Version . new ( ::Sidekiq ::VERSION ) >= ::Gem ::Version . new ( "8.0.0" )
1415
1516 def initialize ( retry_policy : RetryPolicy . build )
@@ -18,23 +19,7 @@ def initialize(retry_policy: RetryPolicy.build)
1819 end
1920
2021 def handles? ( job )
21- sidekiq_job? ( job ) || active_job? ( job )
22- end
23-
24- def performed_by_active_job? ( sidekiq_job )
25- !!sidekiq_job [ "wrapped" ] && active_job_owns_adapter?
26- end
27-
28- def active_job_args ( sidekiq_job , scope :)
29- payload , *arguments = sidekiq_job [ "args" ]
30- return sidekiq_job [ "args" ] unless payload . is_a? ( Hash )
31-
32- sentry_data = ( payload [ "_sentry" ] || { } ) . merge ( "delivery_queue" => sidekiq_job [ "queue" ] )
33- sentry_data [ "execution_scope_id" ] = scope . object_id
34- [ payload . merge (
35- SIDEKIQ_JOB_KEY => sidekiq_job ,
36- "_sentry" => sentry_data
37- ) , *arguments ]
22+ sidekiq_job? ( job )
3823 end
3924
4025 def error_context_transaction_name ( context )
@@ -45,28 +30,25 @@ def error_context_transaction_name(context)
4530 end
4631
4732 def scope_data ( job :)
48- sidekiq_job = sidekiq_job_for ( job )
49- return { } unless sidekiq_job
33+ return { } unless sidekiq_job? ( job )
5034
5135 data = {
52- contexts : { sidekiq : ContextFilter . new ( sidekiq_job ) . filtered } ,
53- tags : { queue : sidekiq_job [ "queue" ] , jid : sidekiq_job [ "jid" ] } . merge ( job_tags ( sidekiq_job ) )
36+ contexts : { sidekiq : ContextFilter . new ( job ) . filtered } ,
37+ tags : { queue : job [ "queue" ] , jid : job [ "jid" ] } . merge ( job_tags ( job ) )
5438 }
55- user = sidekiq_job [ "sentry_user" ]
39+ user = job [ "sentry_user" ]
5640 data [ :user ] = user if user . is_a? ( Hash )
5741 data
5842 end
5943
6044 def messaging_data ( job :)
61- sidekiq_job = sidekiq_job_for ( job )
62- return { } unless sidekiq_job
45+ return { } unless sidekiq_job? ( job )
6346
6447 {
6548 system : name ,
66- message_id : sidekiq_job [ "jid" ] ,
67- destination : sidekiq_job [ "queue" ] ,
68- receive_latency : receive_latency ( sidekiq_job ) ,
69- body_size : active_job? ( job ) ? body_size ( sidekiq_job ) : nil
49+ message_id : job [ "jid" ] ,
50+ destination : job [ "queue" ] ,
51+ receive_latency : receive_latency ( job )
7052 } . compact
7153 end
7254
@@ -75,10 +57,9 @@ def consumer_messaging_data(job)
7557 end
7658
7759 def retry_info ( job :)
78- sidekiq_job = sidekiq_job_for ( job )
79- return unless sidekiq_job
60+ return unless sidekiq_job? ( job )
8061
81- { count : @retry_policy . retry_count ( sidekiq_job ) || 0 , will_retry : @retry_policy . will_retry? ( sidekiq_job ) }
62+ { count : @retry_policy . retry_count ( job ) || 0 , will_retry : @retry_policy . will_retry? ( job ) }
8263 end
8364
8465 def inject_trace_headers ( job :, payload :, headers :)
@@ -89,33 +70,20 @@ def inject_trace_headers(job:, payload:, headers:)
8970 end
9071
9172 def extract_trace_headers ( job :, payload :)
92- sidekiq_job = sidekiq_job_for_payload ( payload )
93- return unless sidekiq_job
73+ return unless sidekiq_job? ( payload )
9474
95- sidekiq_job [ "trace_propagation_headers" ] || { }
75+ payload [ "trace_propagation_headers" ] || { }
9676 end
9777
9878 def transaction_name ( job :)
99- name = active_job? ( job ) ? job . class . name : job_class ( job )
79+ name = job_class ( job )
10080 "#{ SIDEKIQ_NAME } /#{ name } " if name
10181 end
10282
103- def span_origin ( job :)
104- SPAN_ORIGIN if active_job? ( job )
105- end
106-
107- def integration ( job :)
108- Sentry ::Sidekiq if active_job? ( job )
109- end
110-
11183 def producer ( job :)
11284 @producer ||= Sentry ::JobExtensions ::Producer ::Delegated . new
11385 end
11486
115- def report_retried_exception? ( job :, exception :)
116- false if active_job? ( job )
117- end
118-
11987 private
12088
12189 def sidekiq_job? ( job )
@@ -126,40 +94,6 @@ def job_class(job)
12694 job [ "wrapped" ] || job [ "class" ] if job . is_a? ( Hash )
12795 end
12896
129- def active_job? ( job )
130- return false unless defined? ( ::ActiveJob ::Base ) && job . is_a? ( ::ActiveJob ::Base )
131-
132- job . class . queue_adapter . class . name == ACTIVE_JOB_ADAPTER
133- end
134-
135- def active_job_owns_adapter?
136- return false unless defined? ( ::Sentry ::Rails ::ActiveJobExtensions )
137- return false unless ::Sentry ::Rails . respond_to? ( :active_job_owns_adapter? )
138-
139- ::Sentry ::Rails . active_job_owns_adapter? ( ACTIVE_JOB_ADAPTER )
140- end
141-
142- def sidekiq_job_for ( job )
143- sidekiq_job? ( job ) ? job : handed_over_sidekiq_job ( job )
144- end
145-
146- def handed_over_sidekiq_job ( job )
147- return unless active_job? ( job ) && job . respond_to? ( :_sentry_job_data )
148-
149- sidekiq_job_in ( job . _sentry_job_data )
150- end
151-
152- def sidekiq_job_for_payload ( payload )
153- sidekiq_job? ( payload ) ? payload : sidekiq_job_in ( payload )
154- end
155-
156- def sidekiq_job_in ( active_job_payload )
157- return unless active_job_payload . is_a? ( Hash )
158-
159- sidekiq_job = active_job_payload [ SIDEKIQ_JOB_KEY ]
160- sidekiq_job if sidekiq_job? ( sidekiq_job )
161- end
162-
16397 def job_tags ( job )
16498 Array ( job [ "tags" ] ) . each_with_object ( { } ) { |name , tags_hash | tags_hash [ :"sidekiq.#{ name } " ] = true }
16599 end
0 commit comments