2012-10-02 11 views
12

Die DelayedJob-Dokumentation erwähnt Hooks, einschließlich eines Fehler-Hooks, jedoch nur im Zusammenhang mit benutzerdefinierten Job-Subclasses.Wie man Delayed_Job benachrichtigen Airbrake, wenn ein ActionMailer in einen Fehler läuft?

This similar question (ohne Antworten) sagt, dass das Hinzufügen des gleichen Hooks zur Mailerklasse nicht funktioniert hat.

Was ist der Trick?

Update:

Im Allgemeinen möchte ich zu sehen, wie Haken, um Arbeitsplätze hinzuzufügen, die die object.delay.action() Syntax ausgelöst verwenden, wo ich keine offensichtliche Verbindung zu einer ____Job-Klasse.

+1

aktualisiert und einfachere Antwort hier: http://stackoverflow.com/questions/11766368/error-reporting-when-sending-emails-with-delayed-job/17029430#17029430 – Subhas

Antwort

20

Ich suchte nur nach einer Lösung für dieses Problem, und ich fand this gist.

Ich weiß nicht woher es kommt (fand es bei Google), aber gut, es scheint den Job ziemlich gut zu machen, ist ziemlich einfach und scheint einem DelayedJobs Plugin-System zu folgen, von dem ich nicht einmal wusste ...

Hier ist eine leicht verbesserte einem Teile der früheren Affen Patch Code verwendet:

# 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 

es wird der Fehler auf die Nachricht und Nutzlast hinzufügen, so dass es in Airbrake verfügbar ist.

+0

Ich kannte dieses Plugin-System auch nicht. Ich werde es mir ansehen. Wenn dies in meinem System funktioniert, wechsle ich die akzeptierte Antwort bald auf Ihre. –

+1

Ich nehme an es funktioniert;) Danke! – rchampourlier

+9

Ich mag diesen Ansatz wirklich. Ich konnte keine Version finden, die als Schmuckstück veröffentlicht wurde. Als Dankeschön für das Teilen habe ich es als Schmuckstück verpackt, damit andere es einfach benutzen können. Wenn Sie Schreibzugriff haben möchten, lassen Sie es mich bitte wissen! https://github.com/benjaminoakes/delayed-plugins-airbrake –

1

Die beste Methode wäre die Verwendung von Global Hooks. Jemanden proposed dies im Jahr 2011, aber sieht nicht so aus, als wären sie bereits implementiert worden.

In der Zwischenzeit arbeitet diese an Affen-Patch Dinge:

# 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

Wegen der Art und Weise Airbrake zeigt Parameter an, ich würde empfehlen "job.inspect" nicht zu senden, sondern stattdessen einen Hash zu übergeben. Parsen Sie zuerst den Inhalt des fehlgeschlagenen Jobs: 'failed_job = YAML.load (job.handler)'.Parsen Sie dann seine Instanzparameter in einen Hash, den Sie an die ': Parameter' von airbrake übergeben können:' failed_job.instance_variables.inject ({}) {| hsh, v | hsh [v.to_s.gsub (/ [^ \ w] /, '')] = fehlgeschlagener_job.instance_variable_get (v); hsh} ' – iainbeeston

+1

Sie möchten vielleicht auch den Klassennamen des Jobs in die': Parameter 'mit einschließen:': class => failed_job.class.name' – iainbeeston

1

die einfachste Art und Weise Wahrscheinlich delayed_job zu bekommen durch eine Benachrichtigung an Airbrake zu senden, wenn der Auftrag auf delayed_job Affen Patch schlägt fehl. Auf diese Weise können Sie sich in die Interna von delayed_job einklinken und sie leicht modifizieren, um Airbrake zu warnen, wenn etwas schief geht.

Leider hängt es genau davon ab, welche Version von delayed_job Sie verwenden und welche Version von Airbrake Sie verwenden. Es hängt vielleicht auch davon ab, wo genau Sie sich innerhalb der delayed_job-Verarbeitung in das System einklinken wollen.

Aber wahrscheinlich das einfachste Beispiel, das ich gesehen habe, um zu tun, was Sie wollen, ist Affe-Patch die handle_failed_job-Methode, wie gesehen here. Beachten Sie jedoch, dass in diesem Beispiel das alte Hoptoad-System für die Warnmeldung verwendet wird. Wenn Sie also ein modernes Airbrake-Juwel verwenden, müssen Sie den Code ändern, der die tatsächliche Benachrichtigung wie beschrieben here ausführt.

+0

THANKS für die Erinnerung an mich. Ich stieß schließlich auf die gleiche Affe-Patch-Lösung. Code oben abgeschnitten. –

2

Es gibt ein DJ-Honigbad-Juwel. Der Edelstein wird natürlich aktiv gepflegt, was es viel besser macht als die Verwendung eines Affenpflasters. Zugegeben, als der Affenfleck herauskam, gab es kein Juwel dafür.

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

+0

Danke, Die Frage war für Airbrake, aber das ist eine ähnliche, gute Antwort. (Es gibt jetzt auch ein Airbrake Juwel). https://github.com/benjaminoakes/delayed-plugins-airbrake –

+1

Du hast Recht @JordanFeldstein die Frage war für Airbrake. Lustigerweise habe ich den gleichen Hack für Honeybadger benutzt und es hat ziemlich gut funktioniert. Ich denke, Airbrake und Honeybadger haben APIs, die auf die gleichen Aufrufe reagieren (sehr gute Sache) – lsaffie

+0

Dieses Plugin ist jetzt für die neueste Version von Honeybadger veraltet. –