2009-08-14 16 views
5

que han sido felizmente utilizando el lenguaje DelayedJob:¿Cómo integro Hoptoad con DelayedJob y DaemonSpawn?

foo.send_later(:bar) 

Este llama a la barra de método en el objeto foo en el proceso DelayedJob.

Y he estado usando DaemonSpawn para iniciar el proceso DelayedJob en mi servidor.

Pero ... si foo lanza una excepción, Hoptoad no la atrapa.

¿Esto es un error en cualquiera de estos paquetes ... o necesito cambiar alguna configuración ... o tengo que insertar algún manejo de excepciones en DS o DJ que llame al notificador Hoptoad?


En respuesta al primer comentario a continuación.

class DelayedJobWorker < DaemonSpawn::Base 
def start(args) 
    ENV['RAILS_ENV'] ||= args.first || 'development' 
    Dir.chdir RAILS_ROOT 
    require File.join('config', 'environment') 

    Delayed::Worker.new.start 
end 

Respuesta

0

Sólo tirarlo por ahí - el demonio debe exigir que el entorno de los carriles que está trabajando. Debería tener el siguiente aspecto:

RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production' 
require File.join('config', 'environment') 

De esta forma puede especificar el entorno en el que se llama a Daemon.

Dado que se ejecuta con retraso, es probable que Daemon lo haga (necesita activerecord), pero tal vez solo requiera un activerecord mínimo para hacer que la función delayed_job sea feliz sin raíles.

+0

Esa es una buena respuesta, pero DJ hace que cuando se inicia.DJ se inicia desde script/delayed_job y contiene este código: clase DelayedJobWorker

1

Hoptoad utiliza el método de gancho Rails rescue_action_in_public para interceptar excepciones y registrarlas. Este método solo se ejecuta cuando la solicitud es enviada por un controlador Rails. Por esta razón, Hoptoad no tiene conocimiento de ninguna excepción generada, por ejemplo, por tareas de rake o el script/runner de rails.

Si desea que Hoptoad rastree su excepción, debe integrarla manualmente. Debe ser bastante sencillo. El fragmento de código siguiente muestra cómo se invoca hoptoad

def rescue_action_in_public_with_hoptoad exception 
    notify_hoptoad(exception) unless ignore?(exception) || ignore_user_agent? 
    rescue_action_in_public_without_hoptoad(exception) 
end 

basta con incluir la biblioteca hoptoad en su entorno y llamar notify_hoptoad(exception) debería funcionar. Asegúrese de que su entorno proporcione la misma API de un controlador Rails o Hoptoad podría quejarse.

3

Mira la fuente de Delayed :: Trabajo ... hay un fragmento como:

# This is a good hook if you need to report job processing errors in additional or different ways 
def log_exception(error) 
    logger.error "* [JOB] #{name} failed with #{error.class.name}: #{error.message} - #{attempts} failed attempts" 
    logger.error(error) 
end 

Yo no lo he probado, pero creo que se podría hacer algo como:

class Delayed::Job 
    def log_exception_with_hoptoad(error) 
    log_exception_without_hoptoad(error) 
    HoptoadNotifier.notify(error) 
    end 

    alias_method_chain :log_exception, :hoptoad 
end 
5

Trate monkeypatching retardada :: Trabajador # handle_failed_job:

# lib/delayed_job_airbrake.rb 

module Delayed 
    class Worker 

    protected 

    def handle_failed_job_with_airbrake(job, error) 
     say "Delayed job failed -- logging to Airbrake" 
     HoptoadNotifier.notify(error) 
     handle_failed_job_without_airbrake(job, error) 
    end 

    alias_method_chain :handle_failed_job, :airbrake 

    end 
end 

Esto funcionó para mí.

(3.0.10 en una aplicación Rails usando delayed_job 2.1.4 y 2.4.11 hoptoad_notifier) ​​

+0

¡Gracias por especificar las versiones! –

+1

¿Dónde se define 'handle_failed_job_without_airbrake'? Algo nuevo en esto e intentando entender este parche. Ya tenemos este código, pero lo estoy modificando porque estamos actualizando desde hoptoad_notifier-2.4.11 a airbrake_notifier-3.0.9 – Bradley

+2

Se crea mediante metaprogramación en alias_method_chain. Cuando dice "alias_method_chain: handle_failed_job,: airbrake", alias_method_chain esencialmente cambia el nombre de "handle_failed_job" a "handle_failed_job_without_airbrake" y cambia el nombre de "handle_failed_job_with_airbrake" a handle_failed_job. Esto le permite ajustar la implementación original y hacer las cosas antes o después. Eche un vistazo al código si tiene curiosidad: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/aliasing.rb – bonkydog

Cuestiones relacionadas