如何在Heroku上运行时监视New Relic中的resque工作者?

时间:2012-09-19 22:19:01

标签: heroku resque newrelic

我们有一个应用程序在Heroku上运行resque worker。我们已经安装了New Relic插件,根据docs,New Relic Agent应该自动修复resque工作人员。但是,我们在New Relic仪表板上的“后台作业”选项卡上看不到任何输出。

根据相同的docs,我们没有触及newrelic.yml文件。我们既不确定什么是错的,也不知道如何有效地调试它。我们需要做什么?

3 个答案:

答案 0 :(得分:11)

事实证明,我们的问题是由拥有自己的自定义Resque.before_forkResque.after_fork处理程序引起的。

NewRelic的RPM gem将自动设置与Resque.before_forkResque.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