Ruby Gem中的NewRelic事务跟踪

时间:2013-12-20 05:28:49

标签: ruby newrelic

我正在开发一个Ruby gem,我想将NewRelic监视添加到。 gem用作脚本,作为守护程序运行并由bluepill监视。我跟着“Monitoring Ruby background processes and daemons”开始了。

我确认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

这里唯一真正关注的是“没有发现已知的调度员”。

我正在尝试做什么?

2 个答案:

答案 0 :(得分:20)

我在New Relic工作,想要添加一些有关newrelic_rpm gem最新版本的最新详细信息。 TrinitronX走在正确的轨道上,但不幸的是,代码示例和博客文章基于宝石的一个非常旧的版本,并且内部已经发生了重大变化。好消息是,更新版本的代理应该使这更简单。

首先,我应该说我假设您的进程作为守护进程长时间保持活动状态,并重复调用prepare_parse

一般来说,您必须在manual_start方法中插入明确的shutdownprepare_parse调用 - 除了少数特殊情况(某些rake任务和交互式会话) 。 New Relic代理将在需要时立即自动启动。您可以在此处查看有关Ruby代理何时自动启动以及如何控制此行为的详细信息:

对于监视此类后台任务,概念上可能需要两个级别的检测:事务跟踪器和方法跟踪器。您已经有一个事务跟踪器,但您可能还希望在prepare_parse方法中发生的主要工作块周围添加方法跟踪器。这样做可以让您更好地了解每个prepare_parse调用中发生的情况。您可以在此处找到有关添加方法跟踪器的详细信息:

根据您拨打add_transaction_tracer的方式,您对prepare_parse的调用应显示为New Relic UI中“后台任务”标签上的交易。

这里的一个警告可能是你将它作为一个守护进程运行。 Ruby代理使用后台线程与New Relic服务器进行异步通信。由于线程不会在fork()的调用中被复制,这意味着您有时必须在fork()之后手动重新启动代理(请注意,Ruby的Process.daemon使用下面的fork ,所以也包括在内)。是否有必要取决于newrelic_rpm要求的相对时间以及对fork / daemon的调用(如果在通话之后不需要newrelic_rpmfork / daemon,你应该很好,否则见下文。

fork问题有两种解决方案:

  1. 在分叉后立即从分叉的孩子手动拨打NewRelic::Agent.after_fork

  2. 如果您使用的是newrelic_rpm 3.7.1或更高版本,则可以通过设置restart_thread_in_children: true自动重新启动可在newrelic.yml文件中启用的后台线程的实验选项。此时默认情况下处于关闭状态,但可能会成为代理的未来版本中的默认行为。

  3. 如果您仍然遇到问题,newrelic_agent.log文件是调试内容的最佳选择。您需要通过在newrelic.yml文件中设置log_level: debug来增加详细程度,以获得更详细的输出。

答案 1 :(得分: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启动的守护进程中运行gem代码有关。理想情况下,我们希望在守护程序进程分叉后立即在进程内启动NewRelic代理程序。将文件放在库需要之后,应该在需要文件时执行此操作。

我们也很可能希望在后台任务进程退出之前停止NewRelic代理,而不是每次调用Fms::Parser#prepare_parse方法时都停止。但是,出于我们的目的,这应该让您获得足够的调试信息以便继续,这样您就可以确保任务在第一次运行时联系New Relic。我们也可以尝试使用:force_send => true来确保我们发送数据。

参考文献: