2012-09-19 24 views
7

Tenemos una aplicación que ejecuta los trabajadores resque en Heroku. Instalamos el complemento New Relic y, de acuerdo con el docs, New Relic Agent debe autoinstruir a los trabajadores de resque. Sin embargo, no vemos salida en la pestaña "Tareas secundarias" en el panel New Relic.¿Cómo supervisar a los trabajadores de resque en New Relic cuando se ejecuta en Heroku?

De acuerdo con el mismo docs, no tocamos el archivo newrelic.yml. Tampoco estamos seguros de lo que está mal ni cómo depurar esto de manera efectiva. ¿Que necesitamos hacer?

+0

En los registros de sus trabajadores de Resque, ¿ve el agente newrelic conectado? – jakeonrails

Respuesta

11

resultó que nuestro problema fue causado por tener nuestra propia costumbre Resque.before_fork y Resque.after_fork manipuladores.

La gema de RPM de NewRelic configurará automáticamente los ganchos con Resque.before_fork y Resque.after_fork para establecer un canal de comunicación para los trabajadores. Como limitación de Resque, solo ejecuta el último bloque/Proc asignado a los ganchos before_fork y after_fork. Por lo tanto, si tiene sus propios ganchos custom_fork/after_fork, * debe * configurar manualmente el canal de comunicación del agente, p. en un archivo de configuración/inicializadores/custom_resque.rb:

Resque.before_fork do |job| 
    NewRelic::Agent.register_report_channel(job.object_id) 

    # extra custom stuff here 
end 

Resque.after_fork do |job| 
    NewRelic::Agent.after_fork(:report_to_channel => job.object_id) 

    # extra custom stuff here 
end 

Este código se toma directamente del archivo de la gema RPM gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

actualización de errores RPM 27/12/2012: Después de implementar la técnica anterior, descubrimos que la gema RPM pierde identificadores de archivo cuando se usa en modo bifurcado (por ejemplo, Resque). Observamos mensajes de error del tipo ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''. Después de una gran cantidad de búsquedas descubrimos que estas son causadas cuando ActiveRecord intenta abrir una conexión de base de datos y no puede porque la cantidad de descriptores de archivos está agotada. New Relic confirmó que hay un error en el agente al probar el plan de explicación. Esto ocurre cuando se ejecutan muchos trabajos de Resque que se conectan a la base de datos.

actualización 01/28/2013 Bug: Después de mucho rascarse la cabeza nos dimos cuenta de que este error se debe a una interacción no soportada con la gema resque-lonely_job que utiliza before_perform gancho de Resque que pueden detener un trabajo Resque con una excepción Resque::Job::DontPerform. El cliente RPM no se limpia correctamente en esta situación y filtra los descriptores de archivos. New Relic ha sido informado y está trabajando en una solución.

Actualización de error 4/10/2013: Ha solucionado el problema. Estamos usando 3.6.0.78 y maneja este caso. ¡No más filtraciones de descriptores de archivos! Gracias Nueva Reliquia.

+3

Trabajo para New Relic, y esto es completamente correcto. Actualizaremos la documentación para aclarar esto en el futuro. Gracias por el trabajo para encontrar esto. – jasonrclark

+3

Tenemos un documento que describe los enlaces before_fork/after_fork aquí: https://newrelic.com/docs/ruby/resque-instrumentation En cuanto a la fuga del descriptor de archivo, en realidad no está relacionado con la funcionalidad del plan de explicación, y solo sucede bajo ciertas condiciones, pero creo que ahora lo entendemos y estamos trabajando en una solución. – grumbler

+1

Solo una nota sobre la actualización del error 1/28/2013: hemos estado en contacto con el soporte de New Relic sobre esto y dicen que llevará un tiempo hasta que tengan una gema más nueva que solucione el problema. Mientras tanto, puedes resolver el problema pagando en monopatín cualquier lugar que genere un 'Resque :: Job :: DontPerform' para llamar a' NewRelic :: Agent.shutdown' justo antes de que se produzca la excepción. –

4

Estaba teniendo el mismo problema porque el agente de New Relic no comenzaba en mis trabajadores de Resque. Así que al día mi tarea resque:setup rastrillo para start the agent manually:

task "resque:setup" => :environment do 
    if ENV['NEW_RELIC_APP_NAME'] 
    NewRelic::Agent.manual_start :app_name => ENV['NEW_RELIC_APP_NAME'] 
    end 
end 
+0

¿Funciona esto en Heroku? –

+0

Sí, si instala el complemento New Relic Heroku, la variable 'ENV ['NEW_RELIC_APP_NAME']' se debe configurar automáticamente. – trliner

+0

¡Trabajó para mí, gracias! – Dakuan

1

Probamos @trliner sugerencia, pero que se deja de recibir este error:

rake aborted! 
undefined local variable or method `establish_connection' for ActiveRecord::Base:Class 

Hay solución más fácil, sólo tiene que añadir env NEWRELIC_ENABLE a su instancia y heroku todo debería funcionar:

heroku config:set NEWRELIC_ENABLE=true 
+0

Es extraño que mi respuesta no haya funcionado para usted, pero creo que de todos modos me gusta su solución. Por curiosidad, ¿en qué pila de Heroku estás? – trliner

+0

Estoy usando Cedar – shem

+0

Acepté demasiado pronto. Eso no funcionó. El agente de New Relic también resiste automáticamente el instrumento. Vemos eventos enviados cuando señalamos las máquinas de desarrollo con las mismas credenciales de NR que la instancia de Heroku. Sin embargo, una vez que se implementa el código, no enviará eventos ... –

Cuestiones relacionadas