Следы транзакций NewRelic в Ruby Gem
Я разрабатываю камень Ruby, который хотел бы добавить к монитору NewRelic. Драгоценный камень используется в script, который запускается как демон и контролируется bluepill
. Я пошел "" Мониторинг фоновых процессов и демонов Ruby", чтобы начать.
Я подтвердил, что gem устанавливает соединение с NewRelic по мере того, как приложение появляется на моем портале там, однако нет следов транзакций или каких-либо показателей, вызывающих вызываемый код.
Здесь "точка входа" моего драгоценного камня, когда я пытался вручную запустить агент вокруг метода вызова:
require 'fms/parser/version'
require 'fms/parser/core'
require 'fms/parser/env'
require 'mongoid'
ENV['NRCONFIG'] ||= File.dirname(__FILE__) + '/../newrelic.yml'
require 'newrelic_rpm'
module Fms
module Parser
def self.prepare_parse(filename)
::NewRelic::Agent.manual_start
Mongoid.load!("#{File.dirname(__FILE__)}/../mongoid.yml", :development)
Core.prepare_parse(filename)
::NewRelic::Agent.shutdown
end
end
end
Я также попытался добавить это в модуль:
class << self
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
add_transaction_tracer :prepare_parse, :category => :task
end
Я не совсем уверен, что еще я могу сделать. Я подтвердил, что агент способен связываться с сервером, а трассировки транзакций включены. На вкладке фонового приложения ничего не отображается.
Это самая полезная информация, которую я получил из журнала агента:
[12/23/13 21:21:03 +0000 apivm (7819)] INFO : Environment: development
[12/23/13 21:21:03 +0000 apivm (7819)] INFO : No known dispatcher detected.
[12/23/13 21:21:03 +0000 apivm (7819)] INFO : Application: MY-APP
[12/23/13 21:21:03 +0000 apivm (7819)] INFO : Installing Net instrumentation
[12/23/13 21:21:03 +0000 apivm (7819)] INFO : Finished instrumentation
[12/23/13 21:21:04 +0000 apivm (7819)] INFO : Reporting to: https://rpm.newrelic.com/[MASKED_ACCOUNT_NUMBER]
[12/23/13 22:12:06 +0000 apivm (7819)] INFO : Starting the New Relic agent in "development" environment.
[12/23/13 22:12:06 +0000 apivm (7819)] INFO : To prevent agent startup add a NEWRELIC_ENABLE=false environment variable or modify the "development" section of your newrelic.yml.
[12/23/13 22:12:06 +0000 apivm (7819)] INFO : Reading configuration from /var/lib/gems/1.9.1/gems/fms-parser-0.0.6/lib/fms/../newrelic.yml
[12/23/13 22:12:06 +0000 apivm (7819)] INFO : Starting Agent shutdown
Единственное, что действительно касается здесь: "Неизвестный диспетчер обнаружен".
Я пытаюсь сделать это?
Ответы
Ответ 1
Я работаю в New Relic и хочу добавить некоторые последние сведения о последней версии newrelic_rpm
gem. TrinitronX находится на правильном пути, но, к сожалению, этот пример кода и запись в блоге основаны на очень старой версии драгоценного камня, и внутренности значительно изменились с тех пор. Хорошей новостью является то, что более новые версии агента должны сделать это проще.
Чтобы начать, я должен сказать, что я предполагаю, что ваш процесс длится долгое время как демон и повторяет вызовы prepare_parse
.
Вообще говоря, явные вызовы manual_start
и shutdown
, которые вы вставили в свой метод prepare_parse
, не должны быть необходимы, за исключением нескольких особых случаев (некоторые рейк-задачи и интерактивные сеансы). Агент New Relic автоматически запустится, как только это будет необходимо. Вы можете увидеть подробности о том, когда агент Ruby автоматически запустится и как будет управлять этим поведением здесь:
Для мониторинга фоновых задач, подобных этому, есть концептуально два уровня инструментария, которые вы можете захотеть: трассировщики транзакций и трассировщики методов. У вас уже есть трассировщик транзакций, но вы также можете добавить меток методов вокруг основных фрагментов работы, которые происходят в вашем методе prepare_parse
. Это даст вам лучшую видимость того, что происходит в каждом вызове prepare_parse
. Здесь вы можете найти информацию о добавлении меток методов:
С тем, что вы вызываете add_transaction_tracer
, ваши вызовы на prepare_parse
должны отображаться как транзакции на вкладке "Фоновые задачи" в новом реляционном интерфейсе.
Одно из предостережений здесь может заключаться в том, что вы используете это как демон. Агент Ruby использует фоновый поток для асинхронной связи с серверами New Relic. Поскольку потоки не копируются между вызовами на fork()
, это означает, что вам иногда придется вручную перезапустить агент после fork()
(обратите внимание, что Ruby Process.daemon
использует fork
внизу, поэтому он также включается). Независимо от того, требуется ли это, зависит от относительного времени запроса newrelic_rpm
и вызова fork
/daemon
(если newrelic_rpm
не требуется, пока после вызова fork
/daemon
, вы должны быть хорошими, иначе см. ниже).
Есть два решения проблемы с fork:
-
Вручную вызовите NewRelic::Agent.after_fork
из раздвоенного ребенка сразу после fork.
-
Если вы используете newrelic_rpm 3.7.1 или новее, есть экспериментальная опция автоматического повторного запуска фонового потока, который вы можете включить в вашем файле newrelic.yml, установив restart_thread_in_children: true
. В настоящее время это отключено по умолчанию, но может стать поведением по умолчанию в будущих версиях агента.
Если у вас все еще есть проблемы, файл newrelic_agent.log лучше всего подходит для отладки. Вы хотите увеличить количество слов, установив log_level: debug
в ваш файл newrelic.yml, чтобы получить более подробный вывод.
Ответ 2
Для отладки этой проблемы попробуйте следующий код:
require 'fms/parser/version'
require 'fms/parser/core'
require 'fms/parser/env'
require 'mongoid'
ENV['NRCONFIG'] ||= File.dirname(__FILE__) + '/../newrelic.yml'
# Make sure NewRelic has correct log file path
ENV['NEW_RELIC_LOG'] ||= File.dirname(__FILE__) + '/../log/newrelic_agent.log'
require 'newrelic_rpm'
::NewRelic::Agent.manual_start
# For debug purposes: output some dots until we're connected to NewRelic
until NewRelic::Agent.connected? do
print '.'
sleep 1
end
module Fms
module Parser
class << self
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
add_transaction_tracer :prepare_parse, :category => :task
end
def self.prepare_parse(filename)
Mongoid.load!("#{File.dirname(__FILE__)}/../mongoid.yml", :development)
Core.prepare_parse(filename)
# Force the agent to prepare data before we shutdown
::NewRelic::Agent.load_data
# NOTE: Ideally you'd want to shut down the agent just before the process exits... not every time you call Fms::Parser#prepare_parse
::NewRelic::Agent.shutdown(:force_send => true)
end
end
end
У меня такое чувство, что это, вероятно, связано с запуском вашего кода драгоценного камня в демонизированном процессе, который запускает bluepill. В идеале мы хотели бы запустить агент NewRelic в процессе, как только процесс демона будет раздвоен, как мы можем получить. Положив его после того, как ваша библиотека потребует, нужно сделать это, когда требуется файл.
Мы также, скорее всего, хотим остановить агент NewRelic непосредственно перед тем, как процесс фоновой задачи выйдет, а не каждый раз, когда вызывается метод Fms::Parser#prepare_parse
. Однако для наших целей это позволит получить достаточную информацию об отладке для продолжения, чтобы вы могли убедиться, что задача связывается с New Relic при первом запуске. Мы также можем попробовать использовать :force_send => true
, чтобы обеспечить отправку данных.
Ссылки: