私たちのRubyエージェントは、いくつかの一般的なバックグラウンドジョブフレームワークを自動的にインストゥルメントしました。 バックグラウンド タスクをトレースするようにカスタマイズすることもできます。 バックグラウンド ジョブからのデータは、APM のTransactionsページにNon-web transactionsとして表示されます。
対応フレームワーク
最近のRubyエージェントでは、以下のバックグラウンド・ジョブ・フレームワークがデフォルトでサポートされています。
- Resque instrumentation (Ruby agent 3.4.0)
- Sidekiq instrumentation (Ruby agent 3.6.0)
- Delayed::Job instrumentation (Ruby agent 2.10)
重要
JRuby ユーザーは、CPU メトリクスに問題があるかもしれません。
これらのフレームワークを使用している場合、バックグラウンドジョブの監視には通常、追加の設定は必要ありません。
カスタムバックグラウンドジョブの監視
APM Transactions ページに Non-web transactions として表示されるカスタム バックグラウンド ジョブを計算できます。 サポートされていないフレームワークを使用しながらモニターNon-web transactionsするには、カスタムインストゥルメンテーションを追加する必要があります。
例として、バックグラウンドジョブはSalesOrganization#find_new_leads
というタスクを定期的に実行します。
ControllerInstrumentation
モジュールを追加します。add_transaction_tracer
ディレクティブbelowメソッド定義を使用する:category => :task
を追加して、このトレースがNon-web transactionであることをエージェントに伝えます。require 'newrelic_rpm'class SalesOrganizationinclude::NewRelic::Agent::Instrumentation::ControllerInstrumentationdef find_new_leads...endadd_transaction_tracer :find_new_leads, :category => :taskend:category
に文字列を渡すことはできますが、文字列がOtherTransaction/
で始まる場合にのみ、値が APM Transactionsページに表示されます。
カスタムバックグラウンドメソッドの監視
RubyエージェントAPIを使用すると、Non-web transactionsをトレースするための特定のメソッドを指定できます。 これにより、実行速度が遅いジョブのトレースが収集され、キャプチャされたエラーがトランザクションに関連付けられます。
クラスメソッドをインストルメント化するには、クラスsingleton
を使用します。
例として、バックグラウンドジョブはSalesOrganization#find_new_leads
というタスクを定期的に実行します。
ControllerInstrumentation
モジュールbelowメソッド定義を追加します。add_transaction_tracer
ディレクティブを使用する:category => :task
を追加して、このトレースがNon-web transactionであることをエージェントに伝えます。require 'newrelic_rpm'class SalesOrganizationdef self.find_new_leads...endclass << selfinclude::NewRelic::Agent::Instrumentation::ControllerInstrumentationadd_transaction_tracer :find_new_leads, :category => :taskendend詳しくは、 Ruby custom metrics をご覧ください。
短期間のプロセスを監視する
エージェントがバックエンド サーバーに接続する前に、プロセスが実行されていないことを確認してください。これを行うには、Ruby エージェントがデフォルトの非同期動作ではなく、同期的に New Relic に接続するようにします。
まず、Gemfileで、 newrelic_rpm
gemインストールの最後にrequire: false
を追加します。
gem 'newrelic_rpm', require: false
次に、 manual_start
を呼び出し、 :sync_startup => true
オプションを渡します。
require 'new_relic/agent'NewRelic::Agent.manual_start(:sync_startup => true)
Note: ほとんどの設定オプションは手動起動に渡すことができます。
require 'new_relic/agent'
を使用するにはエージェントのコードが必要であり、手動で起動するまでエージェントが実行されないようにします。
プロセスがエージェントのハーベストサイクルよりも短い場合は、キューに入れられたすべてのデータが確実に送信されるように、 ::NewRelic::Agent.shutdown
を使用してエージェントを手動でシャットダウンする必要があります。
バックグラウンドプロセスのためのnewrelic.ymlの設定
newrelic.ymlの構成は、バックグラウンド アプリケーションのコンテキストによって異なります。
別のアプリケーション名で報告する
既存の New Relic Web アプリケーションのコンテキストで実行されるジョブを、APM UI において 異なるアプリケーション名 で表示させることができます。
ワーカー コードでは、Begin before
newrelic_rpm
が必要です。バックグラウンド ワーカー プロセスの開始時に、バックグラウンド ジョブに使用するアプリケーション名を
NEW_RELIC_APP_NAME
環境変数に設定します。これにより、newrelic.yml
のapp_name
設定がオーバーライドされます。bash$NEW_RELIC_APP_NAME="My Background Jobs"$./bin/my_background_worker.rb
エージェントの起動を確認する
Rubyエージェントは、ブラックリストに登録された実行可能ファイル名、rakeタスク名、または定数を検出しない限り、ほとんどの場合、 require 'newrelic_rpm'
になるとすぐに自動的に起動します。これにより、一般的なレーキタスクやインタラクティブなコンソールセッション中に起動するのを防ぎます。
詳しくは、 controlling agent startupに関するドキュメントをご覧ください。
モニタースクリプト
エージェントの起動手順は、デーモンでバックグラウンドジョブを実行するときに適用されます。スクリプトが単一のバックグラウンドタスクを実行して終了する場合は、スクリプトの終了時に::NewRelic::Agent.shutdown
を使用してエージェントを手動でシャットダウンします。これにより、NewRelicコレクターがデータを確実に受信します。例えば:
require 'newrelic_rpm'
class SalesOrganization include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation def find_new_leads ... end add_transaction_tracer :find_new_leads, :category => :taskend
SalesOrganization.new.find_new_leads::NewRelic::Agent.shutdown