DelayedJob文档提到了钩子,包括一个错误钩子,但仅限于自定义Job子类的上下文中。
This similar question(没有答案)说添加相同的钩子到邮件程序类不起作用。
诀窍是什么?
更新:
一般情况下,我想看看如何为使用object.delay.action()
语法触发的作业添加挂钩,我没有看到____Job
类的明显链接。
答案 0 :(得分:20)
我也在寻找这个问题的解决方案,我找到了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
它将添加错误的消息和有效负载,以便它可以在Airbrake中使用。
答案 1 :(得分:2)
有DJ-honeybadger宝石。宝石当然是积极维护的,这比使用猴子补丁更好。当然,当猴子补丁出来时,没有宝石可以做到这一点。
答案 2 :(得分:1)
最好的方法是使用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
答案 3 :(得分:1)
当作业失败时,让delayed_job通过警报发送给Airbrake的最简单方法可能就是修补delayed_job。这允许您挂钩到delayed_job的内部,并稍微修改它以在出现问题时提醒Airbrake。
不幸的是,具体如何操作将取决于您使用的delayed_job版本以及您正在使用的Airbrake版本;它也可能取决于您想要挂钩到系统的delayed_job处理的确切位置。
然而,我所看到的关于如何做你想做的最简单的例子可能是修补handle_failed_job方法,如here所示。请注意,此示例使用旧的Hoptoad系统进行警报,因此如果您使用的是现代Airbrake gem,则需要将实际通知的代码更改为here所述。