【问题标题】:How to monitor resque workers in New Relic when running on Heroku?在 Heroku 上运行时如何监控 New Relic 中的 resque worker?
【发布时间】:2012-09-12 07:02:19
【问题描述】:

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

根据同一个docs,我们没有触及newrelic.yml文件。我们既不确定出了什么问题,也不确定如何有效地调试它。我们需要做什么?

【问题讨论】:

  • 在您的 Resque 工作人员的日志中,您是否看到 newrelic 代理正在连接?

标签: heroku resque newrelic


【解决方案1】:

事实证明,我们的问题是由我们自己的自定义 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 挂钩的 resque-lonely_job gem 的不受支持的交互引起的,可能会停止带有 Resque::Job::DontPerform 异常的 Resque 作业。在这种情况下,RPM 客户端无法正确清理并泄漏文件描述符。 New Relic 已收到通知并正在修复。

2013 年 4 月 10 日错误更新:此问题已得到修复。我们使用的是 3.6.0.78,它可以处理这种情况。不再有文件描述符泄漏!谢谢新遗物。

【讨论】:

  • 我为 New Relic 工作,这是完全正确的。我们将在未来更新文档以使其更加清晰。感谢您为找到这个所做的工作。
  • 我们这里有一个描述 before_fork / after_fork 挂钩的文档:newrelic.com/docs/ruby/resque-instrumentation 关于文件描述符泄漏 - 它实际上与解释计划功能无关,仅在某些条件下发生,但我认为我们现在了解它并正在努力解决问题。
  • 只是关于 2013 年 1 月 28 日错误更新的说明:我们已经就此问题与 New Relic 支持人员联系,他们说需要一些时间才能找到更新的 gem 来修复问题。同时,您可以通过在引发异常之前对引发Resque::Job::DontPerform 的任何地方进行monkeypatching 以调用NewRelic::Agent.shutdown 来解决此问题。
  • 进一步的错误更新:我们现在已经修复了 resque-lonely_job 的问题,从代理版本 3.6.0 开始。
  • 我可以确认; New Relic gem 的最新更新解决了这个问题。感谢 New Relic 对此做出回应!
【解决方案2】:

尝试了@trliner 的建议,但我一直收到此错误:

rake aborted!
undefined local variable or method `establish_connection' for ActiveRecord::Base:Class

有更简单的解决方案,只需将 NEWRELIC_ENABLE env 添加到您的 heroku 实例中,一切都会正常:

heroku config:set NEWRELIC_ENABLE=true

【讨论】:

  • 奇怪的是我的回答对你不起作用,但我认为我更喜欢你的解决方案。出于好奇,你在哪个 Heroku 堆栈上?
  • 我接受得太早了。那没有成功。 New Relic 代理还可以自动检测 resque。当我们将开发机器指向与 Heroku 实例相同的 NR 凭据时,我们会看到发送的事件。然而,一旦代码被部署,它就不会发送事件......
  • 这个解决方案对我有用,但我没有任何 before_fork 或 after_fork 的东西
【解决方案3】:

我遇到了同样的问题,因为 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  

【讨论】:

  • 是的,如果您安装 New Relic Heroku 插件,应该会自动为您设置 ENV['NEW_RELIC_APP_NAME'] 变量。
猜你喜欢
  • 2019-12-01
  • 2012-12-29
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2014-09-17
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多