12

DelayedJob のドキュメントでは、エラー フックを含むフックについて言及されていますが、カスタム ジョブ サブクラスのコンテキストでのみ言及されています。

この同様の質問(回答なし) は、メーラー クラスに同じフックを追加しても機能しなかったと述べています。

トリックは何ですか?

アップデート:

一般に、構文を使用してトリガーされるジョブにフックを追加する方法を確認したいと思いますが、クラスobject.delay.action()への明らかなリンクはありません。____Job

4

4 に答える 4

20

私もこの問題の解決策を探していたところ、この要点を見つけました。

どこから来たのかはわかりませんが(Googleで見つけました)、まあ、うまく機能しているようで、非常にシンプルで、私が知らなかったDelayedJobのプラグインシステムに従っているようです...

以下は、以前のモンキー パッチ コードの一部を使用して少し改良したものです。

# https://gist.github.com/2223758
# modified

module Delayed
  module Plugins
    class Airbrake < Plugin
      module Notify
        def error(job, error)
          ::Airbrake.notify_or_ignore(
            :error_class   => error.class.name,
            :error_message => "#{error.class.name}: #{error.message}",
            :parameters    => {
              :failed_job => job.inspect,
            }
          )
          super if defined?(super)
        end
      end

      callbacks do |lifecycle|
        lifecycle.before(:invoke_job) do |job|
          payload = job.payload_object
          payload = payload.object if payload.is_a? Delayed::PerformableMethod
          payload.extend Notify
        end
      end
    end
  end
end

Delayed::Worker.plugins << Delayed::Plugins::Airbrake

エラーのメッセージとペイロードを追加して、Airbrake で使用できるようにします。

于 2013-01-05T13:16:53.683 に答える
2

DJ-honeybadger の宝石があります。もちろん、gem は積極的にメンテナンスされているため、モンキー パッチを使用するよりもはるかに優れています。確かに、モンキー パッチが出たとき、これを行うための gem はありませんでした。

https://github.com/honeybadger-io/delayed_job_honeybadger

于 2014-02-21T00:58:06.873 に答える
1

最善の方法は、グローバル フックを使用することです。誰かが 2011 年にこれを提案しましたが、まだ実装されていないようです。

当面の間、これはモンキー パッチに適用されます。

# Patch delayed job to report runtime errors to Airbrake
module Delayed
  class Worker

    protected

    def handle_failed_job_with_airbrake(job, error)
      ::Airbrake.notify(
        :error_class   => error.class.name,
        :error_message => "#{error.class.name}: #{error.message}",
        :parameters    => {
          :failed_job => job.inspect,
        }
      )

      handle_failed_job_without_airbrake(job, error)
    end

    alias_method_chain :handle_failed_job, :airbrake

  end
end
于 2012-11-19T18:04:01.263 に答える
1

おそらく、ジョブが失敗したときに、delayed_job にアラートを介して Airbrake に送信させる最も簡単な方法は、delayed_job にモンキー パッチを適用することです。これにより、delayed_job の内部にフックし、少し変更して、何か問題が発生したときに Airbrake に警告することができます。

残念ながら、これを行う正確な方法は、使用しているdelayed_jobのバージョンと、使用しているAirbrakeのバージョンによって異なります。また、おそらく、delayed_job 処理内でシステムにフックしたい正確な場所にも依存します。

ただし、おそらく、あなたが望むことを行う方法について私が見た中で最も簡単な例は、ここに見られるように、handle_failed_job メソッドにモンキー パッチを適用することです。ただし、この例ではアラートに古い Hoptoad システムを使用しているため、最新の Airbrake gem を使用している場合は、実際の通知を行うコードをhereのように変更する必要があります。

于 2012-12-12T17:09:43.323 に答える