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

Wol*_*old 7 heroku resque newrelic

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

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

Wol*_*old 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
Run Code Online (Sandbox Code Playgroud)

此代码直接取自RPM gem的文件 gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

RPM bug更新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-lonely_job gem 的不支持的交互引起的,该gem使用Resque的before_perform钩子,可能会停止Resque作业并发生Resque::Job::DontPerform异常.在这种情况下,RPM客户端无法正常清理并泄漏文件描述符.New Relic已被告知并正在努力修复.

错误更新4/10/2013:这已得到修复.我们使用3.6.0.78并处理这种情况.没有更多的文件描述符泄漏!谢谢New Relic.

  • 我为New Relic工作,这是完全正确的.我们将更新文档,以便将来更清楚.感谢您找到这个的工作. (3认同)
  • 我们在这里有一个描述before_fork/after_fork挂钩的文档:https://newrelic.com/docs/ruby/resque-instrumentation关于文件描述符泄漏 - 它实际上与解释计划功能无关,并且只在某些情况下发生条件,但我认为我们现在理解它并正在努力修复. (3认同)