/
sidekiq.rb
78 lines (64 loc) · 2.92 KB
/
sidekiq.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
require 'honeybadger/plugin'
require 'honeybadger/ruby'
module Honeybadger
module Plugins
module Sidekiq
class Middleware
def call(_worker, _msg, _queue)
Honeybadger.clear!
yield
end
end
Plugin.register do
requirement { defined?(::Sidekiq) }
execution do
::Sidekiq.configure_server do |sidekiq|
sidekiq.server_middleware do |chain|
chain.prepend Middleware
end
end
if defined?(::Sidekiq::VERSION) && ::Sidekiq::VERSION > '3'
::Sidekiq.configure_server do |sidekiq|
sidekiq_default_configuration = (::Sidekiq::VERSION > '7') ?
::Sidekiq.default_configuration : Class.new
sidekiq.error_handlers << lambda { |ex, sidekiq_params, sidekiq_config = sidekiq_default_configuration|
params = sidekiq_params.dup
if defined?(::Sidekiq::Config)
if params[:_config].is_a?(::Sidekiq::Config) # Sidekiq > 6 and < 7.1.5
params[:_config] = params[:_config].instance_variable_get(:@options)
else # Sidekiq >= 7.1.5
params[:_config] = sidekiq_config.instance_variable_get(:@options)
end
end
job = params[:job] || params
job_retry = job['retry'.freeze]
if (threshold = config[:'sidekiq.attempt_threshold'].to_i) > 0 && job_retry
# We calculate the job attempts to determine the need to
# skip. Sidekiq's first job execution will have nil for the
# 'retry_count' job key. The first retry will have 0 set for
# the 'retry_count' key, incrementing on each execution
# afterwards.
retry_count = job['retry_count'.freeze]
attempt = retry_count ? retry_count + 1 : 0
max_retries = (::Sidekiq::VERSION > '7') ?
::Sidekiq.default_configuration[:max_retries] : sidekiq.options[:max_retries]
# Ensure we account for modified max_retries setting
default_max_retry_attempts = defined?(::Sidekiq::JobRetry::DEFAULT_MAX_RETRY_ATTEMPTS) ? ::Sidekiq::JobRetry::DEFAULT_MAX_RETRY_ATTEMPTS : 25
retry_limit = job_retry == true ? (max_retries || default_max_retry_attempts) : job_retry.to_i
limit = [retry_limit, threshold].min
return if attempt < limit
end
opts = { parameters: params }
if config[:'sidekiq.use_component']
opts[:component] = job['wrapped'.freeze] || job['class'.freeze]
opts[:action] = 'perform' if opts[:component]
end
Honeybadger.notify(ex, opts)
}
end
end
end
end
end
end
end