Airbrake にエラーが通知されるのは、再試行回数がなくなったときだけにしたいのですが、それを実装する方法が思い浮かびません...
sidekiq_retries_exhausted フックを追加してエラーを AirBrake に送信することはできますが、実際の失敗をキャッチする唯一の方法は、エラーを飲み込むミドルウェアを追加することですが、エラーがなければジョブは成功としてマークされます。 ...その後、再試行はありません..
それが理にかなっていることを願っています!
Airbrake にエラーが通知されるのは、再試行回数がなくなったときだけにしたいのですが、それを実装する方法が思い浮かびません...
sidekiq_retries_exhausted フックを追加してエラーを AirBrake に送信することはできますが、実際の失敗をキャッチする唯一の方法は、エラーを飲み込むミドルウェアを追加することですが、エラーがなければジョブは成功としてマークされます。 ...その後、再試行はありません..
それが理にかなっていることを願っています!
リストの先頭に挿入された Sidekiq ミドルウェアを使用して、これを実装することができました。
class RaiseOnRetriesExtinguishedMiddleware
include Sidekiq::Util
def call(worker, msg, queue)
yield
rescue Exception => e
bubble_exception(msg, e)
end
private
def bubble_exception(msg, e)
max_retries = msg['retries'] || Sidekiq::Middleware::Server::RetryJobs::DEFAULT_MAX_RETRY_ATTEMPTS
retry_count = msg['retry_count'] || 0
last_try = !msg['retry'] || retry_count == max_retries - 1
raise e if last_try
end
def retry_middleware
@retry_middleware ||= Sidekiq::Middleware::Server::RetryJobs.new
end
end
最後の試行で例外がスローされた場合、(エアブレーキに) バブルアップさせます。これは、チェーンの後半で発生するため、失敗の記録には影響しません。
ここに示すように(私のコードではありません):
Airbrake.configure do |config|
config.api_key = '...'
config.ignore_by_filter do |exception_data|
exception_data[:parameters] &&
exception_data[:parameters]['retry_count'].to_i > 0
end
end
私はまったく同じことに遭遇し、それを AirBrake から遠ざけたいと思いました。これが私がやったことです。これは読みやすくシンプルです。
class TaskWorker
include Sidekiq::Worker
class RetryLaterNotAnError < RuntimeError
end
def perform task_id
task = Task.find(task_id)
task.do_cool_stuff
if task.finished?
@log.debug "Nothing to do for task #{task_id}"
return false
else
raise RetryLaterNotAnError, task_id
end
end
end
そして、Airbrake にそれを無視させるには:
Airbrake.configure do |config|
config.ignore << 'RetryLaterNotAnError'
end
出来上がり!