DelayedJob のドキュメントでは、エラー フックを含むフックについて言及されていますが、カスタム ジョブ サブクラスのコンテキストでのみ言及されています。
この同様の質問(回答なし) は、メーラー クラスに同じフックを追加しても機能しなかったと述べています。
トリックは何ですか?
アップデート:
一般に、構文を使用してトリガーされるジョブにフックを追加する方法を確認したいと思いますが、クラスobject.delay.action()への明らかなリンクはありません。____Job
DelayedJob のドキュメントでは、エラー フックを含むフックについて言及されていますが、カスタム ジョブ サブクラスのコンテキストでのみ言及されています。
この同様の質問(回答なし) は、メーラー クラスに同じフックを追加しても機能しなかったと述べています。
トリックは何ですか?
アップデート:
一般に、構文を使用してトリガーされるジョブにフックを追加する方法を確認したいと思いますが、クラスobject.delay.action()への明らかなリンクはありません。____Job
私もこの問題の解決策を探していたところ、この要点を見つけました。
どこから来たのかはわかりませんが(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 で使用できるようにします。
DJ-honeybadger の宝石があります。もちろん、gem は積極的にメンテナンスされているため、モンキー パッチを使用するよりもはるかに優れています。確かに、モンキー パッチが出たとき、これを行うための gem はありませんでした。
最善の方法は、グローバル フックを使用することです。誰かが 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
おそらく、ジョブが失敗したときに、delayed_job にアラートを介して Airbrake に送信させる最も簡単な方法は、delayed_job にモンキー パッチを適用することです。これにより、delayed_job の内部にフックし、少し変更して、何か問題が発生したときに Airbrake に警告することができます。
残念ながら、これを行う正確な方法は、使用しているdelayed_jobのバージョンと、使用しているAirbrakeのバージョンによって異なります。また、おそらく、delayed_job 処理内でシステムにフックしたい正確な場所にも依存します。
ただし、おそらく、あなたが望むことを行う方法について私が見た中で最も簡単な例は、ここに見られるように、handle_failed_job メソッドにモンキー パッチを適用することです。ただし、この例ではアラートに古い Hoptoad システムを使用しているため、最新の Airbrake gem を使用している場合は、実際の通知を行うコードをhereのように変更する必要があります。