我正在开发一个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_start
和shutdown
调用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问题有两种解决方案:
NewRelic::Agent.after_fork
在分叉之后,从分叉的孩子手动打电话.
如果您正在使用newrelic_rpm 3.7.1或更高版本,则可以通过设置自动重新启动可在newrelic.yml文件中启用的后台线程的实验选项restart_thread_in_children: true
.此时默认情况下处于关闭状态,但可能会成为代理的未来版本中的默认行为.
如果您仍然遇到问题,newrelic_agent.log文件是调试内容的最佳选择.您需要通过设置log_level: debug
newrelic.yml文件来增加详细程度,以获得更详细的输出.
要调试此问题,请尝试以下代码:
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
来确保我们发送数据。
归档时间: |
|
查看次数: |
1141 次 |
最近记录: |