sidekiq_retries_exhausted
is a Sidekiq hook that you can use to do something after Sidekiq has used up all of its retries but the job still failed. It's a good way to make sure you send a failure notification or log an error that might be causing the job to fail instead of it just failing silently.
In the worker, you can set a specific number of retries if you want with sidekiq_options retry: <some_number>
. The default is 25 times.
Here are a couple of examples but there are ton of ways to configure this which can be found in the documentation.
# Retry 3 times before giving up
sidekiq_options retry: 3
# Don't retry at all
sidekiq_options retry: false
If the job has used up (exhausted) all of its retries, Sidekiq moves it to the "Dead set" and it will eventually get discarded.
Sidekiq will call the sidekiq_retries_exhausted
hook right before moving the job to the dead set if you define it in the worker. sidekiq_retries_exhausted
takes a block and receives the queued message as an argument so you can use it to compose a log message. See below for an example:
class MyWorker
include Sidekiq::Worker
sidekiq_options retry: 3
sidekiq_retries_exhausted do |msg, exception|
# example with using Rails' logger
Rails.logger.warn("Failed #{msg['class']} with #{msg['args']}: #{msg['error_message']}", error: exception)
end
def perform(my_arguments)
# do some work
end
end
This hook is worker specific, so you would define sidekiq_retries_exhausted
for each worker you need. There is also a way to send a job "death" notice for all workers globally by adding some configuration in the initializer (in Rails that would be the config/initializers/sidekiq.rb
file).
Sidekiq.configure_server do |config|
# other config stuff...
config.death_handlers << ->(job, ex) do
Rails.logger.error "Uh oh, #{job['class']} #{job["jid"]} just died with error #{ex.message}."
end
end
Top comments (0)