DelayedJob文檔提到了掛鉤,包括錯誤掛鉤,但僅限於自定義作業子類的上下文中。如何在ActionMailer遇到錯誤時使Delayed_Job通知Airbrake?
This similar question(沒有答案)表示向郵件程序類添加相同的鉤子不起作用。
訣竅是什麼?
更新:
在一般情況下,我想看看如何掛鉤添加到正在使用的object.delay.action()
語法,在這裏我沒有看到一個明顯的鏈接到一個____Job
類引發的就業機會。
DelayedJob文檔提到了掛鉤,包括錯誤掛鉤,但僅限於自定義作業子類的上下文中。如何在ActionMailer遇到錯誤時使Delayed_Job通知Airbrake?
This similar question(沒有答案)表示向郵件程序類添加相同的鉤子不起作用。
訣竅是什麼?
更新:
在一般情況下,我想看看如何掛鉤添加到正在使用的object.delay.action()
語法,在這裏我沒有看到一個明顯的鏈接到一個____Job
類引發的就業機會。
我只是在尋找這個問題的解決方案,我發現了this gist。
我不知道它來自哪裏(在谷歌上找到它),但是,它似乎很好地完成了這項工作,非常簡單,並且似乎遵循了我還沒有意識到的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
,使其在空中剎車的可用它會增加錯誤的信息和有效載荷。
我還沒有意識到這個插件系統。我會看一看。如果這在我的系統中有效,我會很快將接受的答案交給你。 –
我假設它的工作;)謝謝! – rchampourlier
我非常喜歡這種方法。我找不到作爲寶石發佈的版本,所以感謝分享這個版本,我將它打包成其他人可以輕鬆使用的寶石。如果你想寫訪問等,請讓我知道! https://github.com/benjaminoakes/delayed-plugins-airbrake –
最好的方法是使用Global Hooks。有人在2011年的這個proposed,但看起來不像他們已經實施。
在此同時,這個工程到猴子補丁的事情:
# 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
因爲路Airbrake顯示參數,我建議不要發送'job.inspect',而是傳遞散列。首先解析失敗作業的內容:'failed_job = YAML.load(job.handler)'。然後將它的實例參數解析爲散列,您可以將它傳遞給airbrake的':parameters':'failed_job.instance_variables.inject({}){| hsh,v | hsh [v.to_s.gsub(/ [^ \ w] /,'')] = failed_job.instance_variable_get(v); hsh}' – iainbeeston
你也可能想在':parameters'中加入作業的類名:':class => failed_job.class.name' – iainbeeston
可能獲得的delayed_job通過報警時,作業失敗是猴子補丁的delayed_job發送給空中剎車的最簡單方法。這可以讓你掛鉤進入delayed_job的內部,稍微修改它以在發生問題時提醒Airbrake。
不幸的是,如何做到這一點將取決於您使用的是哪個版本的delayed_job,以及您正在使用哪個版本的Airbrake;它也將取決於您想要掛入系統的delayed_job處理的確切位置。
但是,可能我見過的最簡單的例子是如何做到你想做的就是對handle_failed_job方法進行猴補丁,如here所示。但請注意,此示例使用舊的Hoptoad系統進行警報,因此如果您使用的是現代Airbrake Gem,則需要更改實際通知的代碼,如here所述。
謝謝提醒我。我最終遇到了同樣的猴子補丁解決方案。上面的代碼被剪掉了。 –
有一個DJ-honeybadger寶石。寶石當然是積極維護的,這比使用猴子補丁更好。當然,當猴子補丁出來時,沒有寶石可以做到這一點。
謝謝,問題是Airbrake,但這是一個類似的,很好的答案。 (現在還有一個Airbrake寶石)。 https://github.com/benjaminoakes/delayed-plugins-airbrake –
你是對的@JordanFeldstein問題在於Airbrake。有趣的是,我使用了相同的黑客攻擊手段,它工作得很好。我想Airbrake和Honeybadger都有API響應相同的調用(非常好) – lsaffie
現在,這個插件已被棄用,用於最新版本的Honeybadger。 – 2014-07-31 22:02:16
更新和更簡單的答案在這裏:http://stackoverflow.com/questions/11766368/error-reporting-when-sending-emails-with-delayed-job/17029430#17029430 – Subhas