Как контролировать спасателей в New Relic при работе на Heroku?

У нас есть приложение, которое запускает спасателей на Heroku. Мы установили надстройку New Relic и, согласно docs Агент New Relic должен автоматически активировать Resque Workers. Однако мы не видим никаких результатов на вкладке «Фоновые задания» на панели управления New Relic.

Согласно тем же документам, мы не трогали файл newrelic.yml. Мы не уверены, что не так, и как это эффективно отладить. Что нам нужно сделать?


person Wolfram Arnold    schedule 19.09.2012    source источник
comment
В журналах для ваших работников Resque вы видите подключение агента newrelic?   -  person jakeonrails    schedule 21.09.2012


Ответы (3)


Оказалось, что наша проблема была вызвана наличием собственных пользовательских обработчиков Resque.before_fork и Resque.after_fork.

Гем NewRelic RPM автоматически установит хуки с Resque.before_fork и Resque.after_fork, чтобы установить канал связи для рабочих. Как ограничение Resque, он запускает только последний назначенный блок/Proc для перехватчиков before_fork и after_fork. Итак, если у вас есть свои собственные хуки before_fork/after_fork, вы *должны* настроить канал связи агента вручную, например в файле config/initializers/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

Этот код взят непосредственно из файла гема RPM gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

Обновление об ошибке RPM от 27 декабря 2012 г. После развертывания описанной выше методики мы обнаружили, что гем RPM пропускает дескрипторы файлов при использовании в разветвленном режиме (например, Resque). Мы наблюдали сообщения об ошибках вида ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''. После долгих поисков мы обнаружили, что это вызвано тем, что ActiveRecord пытается открыть соединение с базой данных и не может, потому что количество файловых дескрипторов исчерпано. New Relic подтвердила наличие ошибки в агенте при выборке плана объяснения. Это происходит, когда выполняется много заданий Resque, которые подключаются к БД.

Обновление ошибки от 28 января 2013 г. После долгих размышлений мы обнаружили, что эта ошибка была вызвана неподдерживаемым взаимодействием с resque-lonely_job, который использует хук Resque before_perform, который может остановить задание Resque с исключением Resque::Job::DontPerform. Клиент RPM не выполняет очистку должным образом в этой ситуации и приводит к утечке файловых дескрипторов. New Relic была проинформирована и работает над исправлением.

Обновление от 10 апреля 2013 г. исправлено. Мы используем 3.6.0.78, и он обрабатывает этот случай. Больше никаких утечек файловых дескрипторов! Спасибо Новой Реликвии.

person Wolfram Arnold    schedule 18.10.2012
comment
Я работаю в New Relic, и это совершенно правильно. Мы будем обновлять документацию, чтобы сделать это более понятным в будущем. Спасибо за работу по поиску этого. - person jasonrclark; 27.10.2012
comment
У нас есть документ, описывающий соединения before_fork/after_fork здесь: newrelic.com/docs/ruby /resque-instrumentation Что касается утечки файлового дескриптора — на самом деле она не связана с функциональностью плана объяснения и происходит только при определенных условиях, но я думаю, что теперь мы это понимаем и работаем над исправлением. - person grumbler; 09.01.2013
comment
Просто примечание об обновлении ошибки от 28 января 2013 г.: мы связались со службой поддержки New Relic по этому поводу, и они сказали, что потребуется некоторое время, пока у них не будет нового драгоценного камня, который устраняет проблему. Тем временем вы можете обойти эту проблему, исправив любое место, которое вызывает Resque::Job::DontPerform для вызова NewRelic::Agent.shutdown прямо перед тем, как возникнет исключение. - person Liron Yahdav; 31.01.2013
comment
Дальнейшее обновление ошибки: теперь мы исправили проблему с resque-lonely_job, начиная с версии агента 3.6.0. - person grumbler; 09.04.2013
comment
Я могу это подтвердить; последнее обновление драгоценного камня New Relic исправляет это. Спасибо New Relic за отзывчивость! - person Wolfram Arnold; 11.04.2013

У меня была та же проблема, потому что агент New Relic не запускался в моих работниках Resque. Поэтому я обновил задачу resque:setup rake на запустите агент вручную:

task "resque:setup" => :environment do
  if ENV['NEW_RELIC_APP_NAME']
    NewRelic::Agent.manual_start :app_name => ENV['NEW_RELIC_APP_NAME']
  end
end  
person trliner    schedule 02.10.2012
comment
Да, если вы устанавливаете надстройку New Relic Heroku, переменная ENV['NEW_RELIC_APP_NAME'] должна быть установлена ​​автоматически. - person trliner; 05.10.2012

Пробовал предложение @trliner, но я продолжал получать эту ошибку:

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

Есть более простое решение, просто добавьте NEWRELIC_ENABLE env в свой экземпляр heroku, и все должно работать:

heroku config:set NEWRELIC_ENABLE=true
person shem    schedule 07.10.2012
comment
Странно, что мой ответ не сработал для вас, но я думаю, что ваше решение мне все равно больше нравится. Из любопытства, какой у вас стек Heroku? - person trliner; 08.10.2012
comment
Я согласился слишком рано. Это не сработало. Агент New Relic также спасает автоинструменты. Мы видим, что события отправляются, когда мы указываем компьютерам разработчиков те же учетные данные NR, что и экземпляр Heroku. Однако после развертывания кода он не будет отправлять события... - person Wolfram Arnold; 18.10.2012
comment
это решение сработало для меня, но у меня не было никаких вещей before_fork или after_fork - person djburdick; 01.02.2013