• EnglishEspañol日本語한국어Português
  • ログイン今すぐ開始

この機械翻訳は、参考として提供されています。

英語版と翻訳版に矛盾がある場合は、英語版が優先されます。詳細については、このページを参照してください。

問題を作成する

リスケのインストルメント

New Relic の Ruby エージェントは、Web アプリケーション自体に加えて、Resque のジョブをインストルメントすることができます。

職務上の主張を汲み取る

Rubyエージェントバージョン3.6.9以降では、 オプションで、 Rubyを設定して、Resque ジョブ引数をトレースでキャプチャし、エラーをトレースすることもできます。 これは、失敗したジョブを再現しようとする場合に特に役立ちます。 ジョブ引数に機密情報が含まれている場合に備えて、この機能はデフォルトでオフになっています。 この機能を有効にするには、エージェントのバージョンに応じてnewrelic.ymlを編集します。

  • newrelic_rpm 3.12.0 以降の場合: attributes.include: job.resque.args.*
  • newrelic_rpm 3.6.9 ~ 3.11.X の場合: resque.capture_params: true

この機能は、HTTP リクエスト パラメータがトランザクション トレースでキャプチャされ、Web リクエストのエラーがトレースされるかどうかを制御する、一般的なcapture_params最上位設定とは異なります。これら 2 つの設定は個別に構成できます。

Resqueバージョン1.23.1以上

Resque 1.23.1以降を使用している場合、New RelicのResqueインスツルメンテーションを動作させるために、通常のエージェントのインストール手順以外にコードを変更する必要はありません。

Exception: Resque の古いバージョンを実行していたときに、Resque before_first_forkbefore_fork 、またはafter_forkフックからNewRelic::Agentメソッドへの呼び出しが残っている場合は、Resque 1.23.1 以降にアップグレードした後で、それらの呼び出しを必ずremoveしてください。

代替フォーキングモード

resque-multi-job-forksまたはresque-jobs-per-fork gem は、個別のジョブごとにフォークするのではなく、ジョブのバッチごとに 1 回フォークするように、Resque のフォーク動作を変更します。同様に、Resque でのフォークを完全に無効にするために、 FORK_PER_JOB環境変数をfalseに設定できます。

アプリケーションでこれらの代替フォーク モードのいずれかを使用する場合は、Ruby エージェントversion 3.9.7 or higherを実行していることを確認してください。 以前のバージョンの Ruby エージェントは、これらの代替フォーク モードで正しく動作しません。 3.9.7 以降にアップグレードする場合は、エージェントがこれらの環境で動作するように、以前使用していた可能性のあるmanual_startafter_forkなどのNewRelic::Agentメソッドへの直接呼び出しを必ず削除してください。

旧Resqueバージョン(< 1.23.1)

New Relic の Ruby エージェントは、Resque のバージョンが 1.23.1 よりも古い場合でも使用することができます。ただし、New Relic では、最良の結果を得るために Resque 1.23.1 以上にアップグレードすることを推奨しています。

多くのアプリケーションは、Resque ジョブの存続期間中の重要なポイントでカスタム コードを挿入するために、Resque によって公開されるフック ( before_forkafter_forkなど) を使用します。New Relic Ruby エージェントも、インストルメンテーションを配置できるようにするためにこれらのフックを使用する必要があります。

Resque 1.23.1以前のバージョンでは、フックを複数回定義することができず、最後に定義されたものが優先されます。Resque のバージョン>= 1.23.1 (フックを複数回定義しても互いに上書きされない) にアップグレードできない場合は、必要な New Relic コードを追加することで、カスタムの Resque フックを修正することができます。以下はその例です。

Example: Modifying custom Resque hooks

カスタムコードを持たないフックについては、定義を省略することができます。この場合は、エージェントによって自動的にインストールされます。

Resque.before_first_fork do
# ... your custom hook code ...
NewRelic::Agent.manual_start(:dispatcher => :resque,
:sync_startup => true,
:start_channel_listener => true)
end
Resque.before_fork do |job|
# ... your custom hook code ...
NewRelic::Agent.register_report_channel(job.object_id)
end
Resque.after_fork do |job|
# ... your custom hook code ...
NewRelic::Agent.after_fork(:report_to_channel => job.object_id,
:report_instance_busy => false)
end

デッドロック・ジョブ

一部のお客様(特にジョブのスループットが非常に高いお客様)から、Rubyエージェントを有効にしたResqueのワーカープロセスで断続的なデッドロックが報告されています。このようなデッドロックは、RubyエージェントがNew Relicサーバーにデータを送信するために使用するバックグラウンドスレッドと、Resqueのフォーク動作との間の相互作用がうまくいかないことが原因です。

これらの問題を解決するには、以下のいずれかのオプションを使用します。

  • Resque プロセスの生成時にFORK_PER_JOB環境変数をfalseに設定して、Resque のフォーク動作を無効にします。
  • Ruby の標準ライブラリのresolv-replaceライブラリを使用して、Ruby のネイティブ DNS 解決コードを純粋な Ruby バージョンに置き換えます。

Ruby エージェントは、Resque マスタープロセス内のバックグラウンドスレッドを使用して、New Relic コレクターにデータを送信します。環境によっては、このスレッドが DNS 解決時 (New Relic コレクターのホスト名を解決するとき) にネイティブロックを取得します。

メインの Resque マスター プロセスのメイン スレッドが fork を呼び出して子プロセスを作成している間に、このネイティブ ロックがバックグラウンド スレッドによって保持されている場合、フォークされた子プロセス内で保持されているとしてマークされます。ただし、 fork呼び出しスレッドをコピーするだけであるため、ネイティブ ロックを保持していたバックグラウンド スレッドは子プロセスに存在せず、ネイティブ ロックが解放されることはありません。子プロセスが DNS 解決を実行しようとすると、同じネイティブ ロックとデッドロックを取得しようとします。このGithub の問題を回避するには、Ruby のデフォルトの DNS 解決パスの代わりにresolv-replaceを使用します。

Copyright © 2024 New Relic株式会社。

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.