Следы транзакций 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, чтобы обеспечить отправку данных.

Ссылки: