2

我们有一个 Rails Web 应用程序堆栈,其中包含一些在单独的进程(Heroku 实例)中运行 EventMachine 的代码。它们共享公共代码和类,将它们分开是没有意义的。

我想以单独的应用程序名称将数据报告给 New Relic,以便实例统计信息(CPU、内存)不会全部平均在一起,因为 EventMachine 进程的使用特性与 Web 进程有很大不同。

理想情况下,我希望 EventMachine 进程在newrelic.yml文件中选择不同的配置节。

我试过打电话NewRelic::Control.instance.init_plugin(:agent_enabled => true, :env => 'em-process')用不同的环境重新初始化。那没有用。

我也尝试关闭并重新启动代理:::NewRelic::Agent.shutdown
::NewRelic::Agent.manual_start(env: 'connector')但我在日志中看到了这一点:This agent connected from parent process 10878--not sending shutdown——这也不起作用。

如何才能做到这一点?

4

2 回答 2

2

TLDR:

environment.rb一种更简洁的方法是在调用之前将以下行添加到您的文件中YourApp::Application.initialize!

NewRelic::Control.instance.env = 'em-process' if ($0 =~ /em-process/)

细节:

诀窍是确保NewRelic::Control.instance.envnewrelic_rpm.start_pluginRailtie 初始化程序运行(启动代理并读取该env值)之前设置。这不能进入初始化程序文件的原因是config/initializers所有 Railtie 初始化程序运行后加载的文件。

使用这种方法,您不需要禁用 Gemfile 中 newrelic_rpm gem 的自动要求,也不需要创建新的初始化文件,因此它更简洁一些。

同样在我们的案例中,这种方法更好,因为我们不希望 New Relic 代理在 Rails 控制台或迁移中运行,所以我们agent_enabled: false在我们的文件中,当我们想要启用代理时newrelic.yml,我们显式设置环境变量(仅当我们的进程NEWRELIC_ENABLE=true在 Heroku 上运行)。当我们采用这种config/initializers/new_relic.rb方法时,它会导致代理在 Rails 控制台中启动,并在本地和 Heroku 上进行迁移,这是我们不想要的。我们尝试将manual_start调用更改为:

NewRelic::Agent.manual_start(args) if ENV['NEWRELIC_ENABLE']

但是后来我们遇到了一些异常,比如undefined method 'add_method_tracer'whenNEWRELIC_ENABLE没有设置,因为是对这些检测方法的调用才NewRelic::Agent.manual_start使这些检测方法可用。

结果是 newrelic_rpm gemrequire: falseGemfile.

于 2013-07-29T23:16:31.253 回答
0

我从 New Relic 的 Ben Weintraub 那里得到了非常有帮助的回答。

最好的选择是不通过捆绑程序自动要求和自动启动代理,方法是require: false在以下设置Gemfile

gem 'newrelic_rpm', '~> 3.6.5.130', require: false

然后添加一个初始化文件,例如config/initializers/new_relic.rb

require 'newrelic_rpm'

args = {}
args[:env] = 'em-process' if ($0 =~ /em-process/)  # start in em-process environment if script name includes the word 'em-process'
NewRelic::Agent.manual_start(args)

这假定 EventMachine 进程的启动脚本的名称包括字符串em-process

谢谢本!

于 2013-07-16T22:41:35.373 回答