我希望Airbrake只在重试耗尽时才能收到错误通知,但我似乎想不出实现它的方法……
我可以添加一个sidekiq_retries_exhausted钩子来将错误发送到AirBrake,但我认为捕获实际故障的唯一方法是添加一个接受错误的中间件,但是如果没有错误,作业将被标记为成功……那么将永远不会有任何重试..
希望这是有意义的!
发布于 2013-10-30 23:39:43
我设法用一个插入在列表开头的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如果这是最后一次尝试,抛出一个异常,它会让它冒泡(到空气制动),否则它不会。这不会影响失败记录,因为它发生在链的后面。
发布于 2013-10-30 22:27:17
如here所示(不是我的代码):
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发布于 2015-08-26 02:53:24
我遇到了完全相同的事情,并想把它放在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瞧!
https://stackoverflow.com/questions/19682594
复制相似问题