15

Tengo una aplicación de rieles simple con algunos controles y algunas tareas de rake. Un cron configuró un par de tareas con whenever gem.Notificador de excepción de rieles en tareas de rastreo

Uno de mi tarea se ejecuta todos los días y en algún momento se plantea una excepción y por defecto que reciben esta advertencia por cron

rake aborted! 
undefined method `parameterize' for nil:NilClass 

Tasks: TOP => mailboxes:clean_processed 
(See full trace by running task with --trace) 

quiero depurar lo que está sucediendo y por esta razón por la que acaba de instalar este exception notification joya con esta línea en mi Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier' 

y configurado en mi archivo application.rb con

# enable exception notification 
config.middleware.use ExceptionNotifier, 
         :email_prefix => "[MyAppName] ", 
         :sender_address => %{"notifier" <[email protected]>}, 
         :exception_recipients => %w{[email protected]} 

Dado que esta joya es un middleware de rack, solo funciona para solicitudes web y no para tareas de rake. Me gustaría habilitarlo también para tareas de rake y encontré this gist que hacen el trabajo.

Funciona, sin embargo no es SECO, tengo que repetir la configuración joya en ese método y también tengo que cambiar todas mis tareas rastrillo para encerrar sus declaraciones en un bloque como en

exception_notify { actual_task_code } 

¿Hay alguna mejor forma de resolver esto?

P.S. Si necesito cambiar la notificación, la gema no sería un problema porque agregué solo algunas líneas de código a mi proyecto.

P.P.S. Sé que también puedo cambiar la línea de rastreo en el crontab para agregar una opción --trace, pero no me gusta esa solución, porque el notificador de excepciones es una mejor solución que también ayuda en el código web.

Actualización Acabo de enterarme esta pregunta relacionada: exception_notification for delayed_job pero ambas respuestas usan un truco similar.

Voy a tratar con un servicio en línea como Airbrake (anteriormente conocido como hoptoad) o excepcional, pero ambos se pagan los servicios ...

Actualización 2: He probado el Airbrake App, muy buena aplicación, pero sufre por el mismo problema, todavía tengo que hackear el Rakefile para notificar excepciones de las tareas de rake. Sin embargo, el truco es menos seco porque solo necesita este código:

# notify exceptions 
def exception_notify 
    yield 
rescue Exception => exception 
    HoptoadNotifier.notify exception 
    raise exception 
end 

No es necesario repetir ningún parámetro de configuración. Creo que no puedo hacer nada mejor que esto para recibir notificaciones de excepciones en las tareas de rake.

Respuesta

5

Airbrake joya patches Rake para permitir el rescate, por lo que ya se hace lo que yo estoy pidiendo ...

+0

Para habilitar el registro de errores de Rake, deberá agregar la línea '' 'config.rescue_rake_exceptions = true''' a' '' conifg/initializers/airbrake.rb'''. – KurtPreston

1

Gracias por esta sugerencia; funciona bien para mí ya que solo tengo una tarea cron en este momento.

se seque para arriba, usted podría dar vuelta la configuración en constantes, tal vez a través APP_CONFIG: https://github.com/cjbottaro/app_config

Además, se podría extender cualquier clase se encarga de task :... do para envolver todo en exception_notify { }.

+1

Estoy interesado en la última pista, podría expandir un poco? – Fabio

+0

Deberá investigar cómo funcionan las tareas de rake, más profundamente en el marco de Rails. Yo tampoco sé los detalles. Pero podrías ampliar los clasificados para hacer lo que quieras. –

13

Crear un archivo task.rb en config/inicializadores, que los parches mono Rake :: Tarea # ejecutar para incluir el funcionalidad de exception_notify:

module Rake 
    class Task 
    alias :orig_execute :execute 
    def execute(args=nil) 
     orig_execute(args) 
    rescue Exception => exception 
     # Exception notification stuff 
    end 
    end 
end 

Probado con Rails 3.0.12, Rake 0.9.2.2.

+1

Tenga en cuenta que debe requerir "rake/task", o la consola de Rails ya no se ejecutará debido a un NameError. –

Cuestiones relacionadas