当社のRubyエージェントは、いくつかの一般的なバックグラウンド・ジョブ・フレームワークを自動的に計測します。また、任意のバックグラウンドタスクをトレースするようにカスタマイズすることもできます。バックグラウンドジョブからのデータは、 トランザクション ページ APMでは、 非ウェブトランザクション として表示されます。
対応フレームワーク
最近の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 page as Non-web transactions に表示することができます。 Non-web transactions を、サポートされていないフレームワークを使用しながら監視するには、カスタムインスツルメンテーションを追加する必要があります。
例として、バックグラウンドジョブはSalesOrganization#find_new_leads
というタスクを定期的に実行します。
ControllerInstrumentation
モジュールを追加します。メソッド定義の下にある
add_transaction_tracer
ディレクティブを使用します:category => :task
を追加して、このトレースが非Webトランザクションであることをエージェントに通知します。require 'newrelic_rpm'class SalesOrganizationinclude::NewRelic::Agent::Instrumentation::ControllerInstrumentationdef find_new_leads...endadd_transaction_tracer: find_new_leads,: category =>: taskend文字列を
:category
に渡すことができますが、文字列がOtherTransaction/
で始まる場合にのみ、値はAPMトランザクションページに表示されます。
カスタムバックグラウンドメソッドの監視
Ruby エージェント API を使用すると、特定のメソッドを指定して、 非ウェブ・トランザクション をトレースすることができます。これにより、実行速度の遅いジョブのトレースを収集し、キャプチャしたエラーをトランザクションに関連付けることができます。
クラスメソッドをインストルメント化するには、クラスsingleton
を使用します。
例として、バックグラウンドジョブはSalesOrganization#find_new_leads
というタスクを定期的に実行します。
メソッド定義の下に
ControllerInstrumentation
モジュールを追加します。add_transaction_tracer
ディレクティブを使用する:category => :task
を追加して、このトレースが非Webトランザクションであることをエージェントに通知します。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)
注:ほとんどの構成オプションは、手動開始に渡すことができます。
require 'new_relic/agent'
を使用するにはエージェントのコードが必要であり、手動で起動するまでエージェントが実行されないようにします。
プロセスがエージェントのハーベストサイクルよりも短い場合は、キューに入れられたすべてのデータが確実に送信されるように、 ::NewRelic::Agent.shutdown
を使用してエージェントを手動でシャットダウンする必要があります。
バックグラウンドプロセスのためのnewrelic.ymlの設定
newrelic.yml の設定は、バックグラウンドアプリケーションのコンテキストに依存します。
別のアプリケーション名で報告する
既存の New Relic Web アプリケーションのコンテキストで実行されるジョブを、APM UI において 異なるアプリケーション名 で表示させることができます。
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