我们有一个应用程序在Heroku上运行resque worker。我们已经安装了New Relic插件,根据docs,New Relic Agent应该自动修复resque工作人员。但是,我们在New Relic仪表板上的“后台作业”选项卡上看不到任何输出。
根据相同的docs,我们没有触及newrelic.yml
文件。我们既不确定什么是错的,也不知道如何有效地调试它。我们需要做什么?
答案 0 :(得分:11)
事实证明,我们的问题是由拥有自己的自定义Resque.before_fork
和Resque.after_fork
处理程序引起的。
NewRelic的RPM gem将自动设置与Resque.before_fork
和Resque.after_fork
的挂钩,以便为工作人员建立通信渠道。作为Resque的限制,它仅运行最后分配的块/ Proc到before_fork和after_fork挂钩。因此,如果您有自己的自定义before_fork / after_fork挂钩,则*必须*手动设置代理的通信通道,例如在config / initializers / custom_resque.rb文件中:
Resque.before_fork do |job|
NewRelic::Agent.register_report_channel(job.object_id)
# extra custom stuff here
end
Resque.after_fork do |job|
NewRelic::Agent.after_fork(:report_to_channel => job.object_id)
# extra custom stuff here
end
此代码直接取自RPM gem的文件gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb
RPM错误更新12/27/2012:在部署上述技术后,我们发现RPM gem在分叉模式下使用时会泄漏文件句柄(例如Resque)。我们观察到ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''
种类的错误消息。经过大量挖掘后,我们发现这些是在ActiveRecord尝试打开数据库连接时引起的,因为文件描述符的数量已经耗尽。 New Relic确认在对解释计划进行抽样时代理中存在错误。当运行大量连接到数据库的Resque作业时会发生这种情况。
错误更新2013年1月28日:经过多次讨论后,我们发现此错误是由与使用Resque before_perform
的{{3}} gem无法支持的互动造成的可能会因Resque::Job::DontPerform
异常而停止Resque作业的挂钩。在这种情况下,RPM客户端无法正常清理并泄漏文件描述符。 New Relic已被告知并正在努力修复。
错误更新4/10/2013:此问题已修复。我们使用3.6.0.78并处理这种情况。没有更多的文件描述符泄漏!谢谢New Relic。
答案 1 :(得分:4)
我遇到了同样的问题,因为New Relic代理没有在我的Resque工作人员中启动。所以我将resque:setup
rake任务更新为start the agent manually:
task "resque:setup" => :environment do
if ENV['NEW_RELIC_APP_NAME']
NewRelic::Agent.manual_start :app_name => ENV['NEW_RELIC_APP_NAME']
end
end
答案 2 :(得分:1)
尝试了@trliner建议,但我一直收到这个错误:
rake aborted!
undefined local variable or method `establish_connection' for ActiveRecord::Base:Class
有更简单的解决方案,只需将NEWRELIC_ENABLE env添加到您的heroku实例中,一切都应该有效:
heroku config:set NEWRELIC_ENABLE=true