Ruby Gem中的NewRelic事务跟踪

ran*_*its 11 ruby newrelic

我正在开发一个Ruby gem,我想将NewRelic监视添加到.gem用作作为守护程序运行并由其监视的脚本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
Run Code Online (Sandbox Code Playgroud)

我也尝试将其添加到模块中:

   class << self
      include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
      add_transaction_tracer :prepare_parse, :category => :task
    end
Run Code Online (Sandbox Code Playgroud)

我不完全确定我还能做些什么.我确认代理能够与服务器通信并启用事务跟踪.后台应用程序选项卡中也没有显示任何内容.

这是迄今为止我从代理日志中获得的最有用的信息:

[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
Run Code Online (Sandbox Code Playgroud)

这里唯一真正关注的是"没有发现已知的调度员".

我正在尝试做什么?

小智 20

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

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

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

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

有了您呼叫的方式add_transaction_tracer,你的电话到prepare_parse应该显示为在New Relic的UI中的"后台任务"选项卡上的交易.

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

fork问题有两种解决方案:

  1. NewRelic::Agent.after_fork在分叉之后,从分叉的孩子手动打电话.

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

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


Tri*_*onX 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
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这可能与在 bluepill 启动的守护进程中运行 gem 的代码有关。理想情况下,我们希望在守护进程分叉后立即在进程中启动 NewRelic 代理。将其放在库的需求之后应该在需要该文件时执行此操作。

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

参考:

  • 我在新遗迹工作。这篇博文和信息相当过时 - 如果@randombits 使用的是去年的代理版本,它将无法工作。一位同事即将发布更新的答案。 (4认同)