我希望 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),否则不会。这不会影响故障记录,因为故障记录会在链中稍后发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)