当ActionMailer遇到错误时,如何让Delayed_Job通知Airbrake?

时间:2012-10-02 01:28:47

标签: ruby-on-rails-3 actionmailer delayed-job

DelayedJob文档提到了钩子,包括一个错误钩子,但仅限于自定义Job子类的上下文中。

This similar question(没有答案)说添加相同的钩子到邮件程序类不起作用。

诀窍是什么?

更新:

一般情况下,我想看看如何为使用object.delay.action()语法触发的作业添加挂钩,我没有看到____Job类的明显链接。

4 个答案:

答案 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宝石。宝石当然是积极维护的,这比使用猴子补丁更好。当然,当猴子补丁出来时,没有宝石可以做到这一点。

https://github.com/honeybadger-io/delayed_job_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所述。