我正在开发一个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
这里唯一真正关注的是“没有发现已知的调度员”。
我正在尝试做什么?
答案 0 :(得分:20)
我在New Relic工作,想要添加一些有关newrelic_rpm
gem最新版本的最新详细信息。 TrinitronX走在正确的轨道上,但不幸的是,代码示例和博客文章基于宝石的一个非常旧的版本,并且内部已经发生了重大变化。好消息是,更新版本的代理应该使这更简单。
首先,我应该说我假设您的进程作为守护进程长时间保持活动状态,并重复调用prepare_parse
。
一般来说,您必须在manual_start
方法中插入明确的shutdown
和prepare_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_rpm
到fork
/ daemon
,你应该很好,否则见下文。
fork问题有两种解决方案:
在分叉后立即从分叉的孩子手动拨打NewRelic::Agent.after_fork
。
如果您使用的是newrelic_rpm 3.7.1或更高版本,则可以通过设置restart_thread_in_children: true
自动重新启动可在newrelic.yml文件中启用的后台线程的实验选项。此时默认情况下处于关闭状态,但可能会成为代理的未来版本中的默认行为。
如果您仍然遇到问题,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
来确保我们发送数据。