7

Heroku で resque ワーカーを実行するアプリがあります。New Relic アドオンをインストールしました。ドキュメントによると、New Relic Agent はレスキュー ワーカーを自動計測する必要があります。ただし、New Relic ダッシュボードの [バックグラウンド ジョブ] タブに出力が表示されません。

同じdocsによると、ファイルには触れていませんnewrelic.yml。何が問題なのか、これを効果的にデバッグする方法がわかりません。私たちは何をする必要がありますか?

4

3 に答える 3

11

Resque.before_fork私たちの問題は、私たち自身のカスタムとResque.after_forkハンドラーを持っていることが原因であることが判明しました。

NewRelicのRPMgemは、ワーカーResque.before_forkとのフックを自動的にセットアップしResque.after_fork、ワーカーの通信チャネルを確立します。Resqueの制限として、before_forkフックとafter_forkフックに最後に割り当てられたブロック/Procのみを実行します。したがって、独自のカスタム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

このコードは、RPMGemのファイルから直接取得されますgems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

RPMバグアップデート2012/12/27:上記の手法を展開した後、フォークモード(Resqueなど)で使用すると、RPMGemがファイルハンドルをリークすることがわかりました。この種のエラーメッセージが表示されましたActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''。多くの調査の結果、これらはActiveRecordがデータベース接続を開こうとしたときに発生し、ファイル記述子の数が不足しているために開くことができないことがわかりました。New Relicは、Explain Planをサンプリングするときに、エージェントにバグがあることを確認しました。これは、DBに接続する多くのResqueジョブが実行されるときに発生します。

バグ更新2013年1月28日:多くの頭を悩ませた後、このバグは、例外を除いてResqueジョブを停止する可能性のあるResqueのフックを使用するresque-lonely_jobgemとのサポートされていない相互作用が原因であることがわかりました。この状況では、RPMクライアントは適切にクリーンアップされず、ファイル記述子がリークします。New Relicに通知され、修正に取り組んでいます。before_performResque::Job::DontPerform

バグアップデート2013年4月10日:これは修正されました。3.6.0.78を使用しており、このケースを処理します。これ以上のファイル記述子のリークはありません!NewRelicに感謝します。

于 2012-10-18T21:41:43.003 に答える
4

New RelicエージェントがResqueワーカー内で起動していなかったため、同じ問題が発生していました。そこで、resque:setuprakeタスクを更新して、エージェントを手動で開始しました

task "resque:setup" => :environment do
  if ENV['NEW_RELIC_APP_NAME']
    NewRelic::Agent.manual_start :app_name => ENV['NEW_RELIC_APP_NAME']
  end
end  
于 2012-10-02T03:09:49.223 に答える
1

@trliner の提案を試しましたが、このエラーが発生し続けました:

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

HEROKU インスタンスに NEWRELIC_ENABLE env を追加するだけで、すべてが機能するはずです。

heroku config:set NEWRELIC_ENABLE=true
于 2012-10-07T12:49:55.900 に答える