lib/sidekiq/expected_failures/middleware.rb in sidekiq-expected_failures-0.0.1 vs lib/sidekiq/expected_failures/middleware.rb in sidekiq-expected_failures-0.2.0
- old
+ new
@@ -1,38 +1,50 @@
module Sidekiq
module ExpectedFailures
class Middleware
include Sidekiq::Util
+ attr_reader :handled_exceptions
+
def call(worker, msg, queue)
- exceptions = worker.class.get_sidekiq_options['expected_failures'].to_a
+ setup_exceptions(worker)
yield
- rescue *exceptions => e
+ rescue *handled_exceptions.keys => ex
data = {
failed_at: Time.now.strftime("%Y/%m/%d %H:%M:%S %Z"),
args: msg['args'],
- exception: e.class.to_s,
- error: e.message,
+ exception: ex.class.to_s,
+ error: ex.message,
worker: msg['class'],
processor: "#{hostname}:#{process_id}-#{Thread.current.object_id}",
queue: queue
}
- log_exception(data)
+ log_exception(data, ex, msg)
end
private
- def log_exception(data)
- Sidekiq.redis do |conn|
+ def setup_exceptions(worker)
+ @handled_exceptions = worker.class.get_sidekiq_options['expected_failures'] || Sidekiq.expected_failures
+ end
+
+ def exception_intervals(ex)
+ [handled_exceptions[ex.class]].flatten.compact
+ end
+
+ def log_exception(data, ex, msg)
+ result = Sidekiq.redis do |conn|
conn.multi do |m|
m.lpush("expected:#{today}", Sidekiq.dump_json(data))
m.sadd("expected:dates", today)
m.hincrby("expected:count", data[:exception], 1)
end
end
+
+ handle_exception(ex, msg) if exception_intervals(ex).include?(result[0])
end
def today
Date.today.to_s
end