Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 如何将同一代码中的New Relic数据报告回不同的应用程序名称?_Ruby On Rails 3_Heroku_Eventmachine_Newrelic - Fatal编程技术网

Ruby on rails 3 如何将同一代码中的New Relic数据报告回不同的应用程序名称?

Ruby on rails 3 如何将同一代码中的New Relic数据报告回不同的应用程序名称?,ruby-on-rails-3,heroku,eventmachine,newrelic,Ruby On Rails 3,Heroku,Eventmachine,Newrelic,我们有一个Rails web应用程序堆栈,其中包含一些在单独进程(Heroku实例)中运行EventMachine的代码。它们共享公共代码和类,将它们分开是没有意义的 我想以不同的应用程序名称向New Relic报告数据,这样实例统计数据(CPU、内存)就不会全部平均起来,因为EventMachine进程的使用特性与web进程非常不同 理想情况下,我希望EventMachine进程在newrelic.yml文件中选择不同的配置节 我尝试调用NewRelic::Control.instance.i

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

我想以不同的应用程序名称向New Relic报告数据,这样实例统计数据(CPU、内存)就不会全部平均起来,因为EventMachine进程的使用特性与web进程非常不同

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

我尝试调用
NewRelic::Control.instance.init\u插件(:agent\u enabled=>true,:env=>em process')
以使用不同的环境重新初始化。那没用

我还尝试关闭并重新启动代理:
::NewRelic::agent.shutdown

::NewRelic::Agent.manual_start(env:'connector')
但我在日志中看到:
此代理从父进程10878连接--未发送关机
--这也不起作用


如何做到这一点?

我从New Relic的Ben Weintraub那里得到了一个非常有用的答案

最好的选择是通过在
Gemfile
中设置
require:false
,不自动请求并通过bundler自动启动代理:

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进程

谢谢你,本

TLDR:

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

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

详情:

诀窍是确保在运行
NewRelic\u rpm.start\u插件之前设置
NewRelic::Control.instance.env
(启动代理并读取
env
值)。无法放入初始值设定项文件的原因是,
config/initializers
中的文件在所有Railtie初始值设定项运行后加载

使用这种方法,您不需要在Gemfile中的newrelic_rpm gem上禁用auto require,也不需要创建新的初始值设定项文件,因此它更干净一些

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

NewRelic::Agent.manual_start(args) if ENV['NEWRELIC_ENABLE']
但是当未设置
NEWRELIC\u ENABLE
时,我们遇到了异常,如
undefined method'add\u method\u tracer'
,因为调用
NEWRELIC::Agent.manual\u start
使这些检测方法可用

结果是,当在
Gemfile
中设置
require:false
时,newrelic\u rpm gem的设计没有表现良好