2012-10-02 44 views
12

DelayedJob文檔提到了掛鉤,包括錯誤掛鉤,但僅限於自定義作業子類的上下文中。如何在ActionMailer遇到錯誤時使Delayed_Job通知Airbrake?

This similar question(沒有答案)表示向郵件程序類添加相同的鉤子不起作用。

訣竅是什麼?

更新:

在一般情況下,我想看看如何掛鉤添加到正在使用的object.delay.action()語法,在這裏我沒有看到一個明顯的鏈接到一個____Job類引發的就業機會。

+1

更新和更簡單的答案在這裏:http://stackoverflow.com/questions/11766368/error-reporting-when-sending-emails-with-delayed-job/17029430#17029430 – Subhas

回答

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 

,使其在空中剎車的可用它會增加錯誤的信息和有效載荷。

+0

我還沒有意識到這個插件系統。我會看一看。如果這在我的系統中有效,我會很快將接受的答案交給你。 –

+1

我假設它的工作;)謝謝! – rchampourlier

+9

我非常喜歡這種方法。我找不到作爲寶石發佈的版本,所以感謝分享這個版本,我將它打包成其他人可以輕鬆使用的寶石。如果你想寫訪問等,請讓我知道! https://github.com/benjaminoakes/delayed-plugins-airbrake –

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 
+1

因爲路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

+1

你也可能想在':parameters'中加入作業的類名:':class => failed_job.class.name' – iainbeeston

1

可能獲得的delayed_job通過報警時,作業失敗是猴子補丁的delayed_job發送給空中剎車的最簡單方法。這可以讓你掛鉤進入delayed_job的內部,稍微修改它以在發生問題時提醒Airbrake。

不幸的是,如何做到這一點將取決於您使用的是哪個版本的delayed_job,以及您正在使用哪個版本的Airbrake;它也將取決於您想要掛入系統的delayed_job處理的確切位置。

但是,可能我見過的最簡單的例子是如何做到你想做的就是對handle_failed_job方法進行猴補丁,如here所示。但請注意,此示例使用舊的Hoptoad系統進行警報,因此如果您使用的是現代Airbrake Gem,則需要更改實際通知的代碼,如here所述。

+0

謝謝提醒我。我最終遇到了同樣的猴子補丁解決方案。上面的代碼被剪掉了。 –

2

有一個DJ-honeybadger寶石。寶石當然是積極維護的,這比使用猴子補丁更好。當然,當猴子補丁出來時,沒有寶石可以做到這一點。

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

+0

謝謝,問題是Airbrake,但這是一個類似的,很好的答案。 (現在還有一個Airbrake寶石)。 https://github.com/benjaminoakes/delayed-plugins-airbrake –

+1

你是對的@JordanFeldstein問題在於Airbrake。有趣的是,我使用了相同的黑客攻擊手段,它工作得很好。我想Airbrake和Honeybadger都有API響應相同的調用(非常好) – lsaffie

+0

現在,這個插件已被棄用,用於最新版本的Honeybadger。 – 2014-07-31 22:02:16

相關問題