2012-10-02 10 views
12

Los documentos de DelayedJob mencionan los ganchos, incluido un enlace de error, pero solo en el contexto de las subclases de trabajo personalizadas.¿Cómo hacer que Delayed_Job notifique a Airbrake cuando un ActionMailer se encuentra con un error?

This similar question (sin respuestas) dice que agregar el mismo enganche a la clase de correo no funcionaba.

¿Cuál es el truco?

Actualización:

En general, me gustaría ver cómo añadir ganchos para puestos de trabajo que se activan mediante la sintaxis object.delay.action(), donde no veo un vínculo evidente a una clase ____Job.

+1

Actualizado y respuesta más simple aquí: http://stackoverflow.com/questions/11766368/error-reporting-when-sending-emails-with-delayed-job/17029430#17029430 – Subhas

Respuesta

20

Estaba buscando una solución a este problema también, y encontré this gist.

No sé de dónde viene (lo encontré en Google), pero bueno, parece hacer el trabajo bastante bien, es bastante simple, y parece seguir el sistema de complementos de DelayedJob del que ni siquiera era consciente ...

Aquí es una ligera mejora el uso de partes de código anterior mono-patch:

# 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 

que se sumará mensaje y la carga útil del error, de modo que esté disponible en Airbrake.

+0

Tampoco conocía este sistema de complementos. Le daré un vistazo. Si esto funciona en mi sistema, pronto cambiaré la respuesta aceptada a la tuya. –

+1

Supongo que funciona;) ¡Gracias! – rchampourlier

+9

Me gusta mucho este enfoque. No pude encontrar una versión lanzada como una joya, así que en agradecimiento por compartir esto, lo empaqué como una joya para que otros lo usen fácilmente. Si desea acceso de escritura, etc., ¡por favor hágamelo saber! https://github.com/benjaminoakes/delayed-plugins-airbrake –

1

El mejor método sería utilizar Global Hooks. Alguien proposed esto en 2011, pero no parece que se hayan implementado todavía.

Por el momento, esto funciona de arreglar las cosas mono:

# 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

Debido a la forma Airbrake muestra los parámetros, recomiendo no enviar 'job.inspect', sino pasar un hash. Primero analiza el contenido del trabajo fallido: 'failed_job = YAML.load (job.handler)'.A continuación, analice sus parámetros de instancia en un hash, que puede pasar a '' parameters' for airbrake: 'failed_job.instance_variables.inject ({}) {| hsh, v | hsh [v.to_s.gsub (/ [^ \ w] /, '')] = failed_job.instance_variable_get (v); hsh} ' – iainbeeston

+1

Es posible que también desee incluir el nombre de clase del trabajo en': parameters' también: ': class => failed_job.class.name' – iainbeeston

1

Probablemente la forma más sencilla de obtener delayed_job a enviar a través de una alerta a Airbrake cuando el trabajo no es delayed_job mono-parche. Esto le permite engancharse en el interior del delayed_job y modificarlo ligeramente para alertar a Airbrake cuando algo va mal.

Lamentablemente, exactamente cómo hacer esto dependerá de la versión de demora_job que esté utilizando y de la versión de Airbrake que esté utilizando; también dependerá, tal vez, exactamente de en qué parte del procesamiento de retraso de trabajo desea enganchar en el sistema.

Sin embargo, probablemente el ejemplo más simple que he visto de cómo hacer lo que desea es aplicar el parche de mono al método handle_failed_job, como se ve en here. Sin embargo, tenga en cuenta que este ejemplo utiliza el antiguo sistema Hoptoad para las alertas, por lo que si está utilizando una gema Airbrake moderna, tendrá que cambiar el código que hace que la notificación real sea como se describe en here.

+0

Gracias por recordarme. Finalmente me encontré con la misma solución de parche de mono. Código recortado arriba. –

2

Hay una joya DJ-honeybadger. La gema, por supuesto, se mantiene activamente, lo que lo hace mucho mejor que usar un parche de mono. Por supuesto, cuando salió el parche de mono, no había gema para hacer esto.

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

+0

Gracias, la pregunta era por Airbrake, pero esta es una respuesta similar, buena. (También hay una gema Airbrake, ahora). https://github.com/benjaminoakes/delayed-plugins-airbrake –

+1

Tienes razón @JordanFeldstein, la pregunta era por Airbrake. Curiosamente usé el mismo truco para honeybadger y funcionó bastante bien. Supongo que Airbrake y Honeybadger tienen API que responden a las mismas llamadas (muy buena cosa) – lsaffie

+0

Este complemento ya no está disponible para la última versión de Honeybadger. –

Cuestiones relacionadas