5

Airbrake にエラーが通知されるのは、再試行回数がなくなったときだけにしたいのですが、それを実装する方法が思い浮かびません...

sidekiq_retries_exhausted フックを追加してエラーを AirBrake に送信することはできますが、実際の失敗をキャッチする唯一の方法は、エラーを飲み込むミドルウェアを追加することですが、エラーがなければジョブは成功としてマークされます。 ...その後、再試行はありません..

それが理にかなっていることを願っています!

4

4 に答える 4

4

リストの先頭に挿入された 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-30T15:39:43.070 に答える
3

ここに示すように(私のコードではありません):

    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
于 2013-10-30T14:27:16.510 に答える
2

私はまったく同じことに遭遇し、それを 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

出来上がり!

于 2015-08-25T18:53:24.303 に答える