Ruby のバックグラウンドプロセスとデーモンの監視

New Relic の Rubyエージェントは、一般的なバックグラウンドジョブフレームワークを使っている場合、自動的に計測を行います。また、あらゆるバックグラウンドタスクをトレースするようにカスタマイズもできます。バックグラウンドジョブのデータは、Transactions ページに表示されます。そこで、トランザクションタイプとして Non-web transactions [Web 以外のトランザクション]を選択すると、バックグラウンドジョブのトランザクショントレースやエラー表示されます。

サポート対象のフレームワーク

以下のバックグラウンドジョブフレームワークは、Ruby エージェントのあるバージョン以降ではデフォルトでサポートされています。

上記のフレームワークを使用している場合は、バックグラウンドジョブの監視に特別な設定は必要はありません。

独自のバックグラウンドジョブの監視

Ruby エージェントは独自のバックグラウンドジョブを計測して、Transactions ページNon-web transactions として表示されます。サポート対象外のバックグラウンドジョブフレームワークを使っている場合に、Web 以外のトランザクションを監視するには、カスタム計測をジョブに追加する必要があります。

追加の設定なしで、エージェントはバックグラウンドジョブの CPU 使用率、メモリ、(ActiveRecord などがサポートされている ORM の)データベースアクティビティに関するメトリクスを取得します。

注: JRuby ユーザーの場合は、CPU メトリクスに問題が発生する可能性があります。詳しくは、JRuby 上の New Relic [英語]をご覧ください。

Ruby エージェント API を使うと、特定のメソッドに対して、Web トランザクションのようにトレースできます。これにより、実行速度の遅いジョブのトレースが収集され、キャプチャされたエラーがトランザクションに関連付けられます。

例: バックグラウンドジョブは SalesOrganization#find_new_leads というタスクを定期的に実行するとします。このバックグラウンドタスクを監視するには ControllerInstrumentation モジュールをインクルードし、メソッド定義の下に add_transaction_tracer ディレクティブを使用します。

require 'newrelic_rpm'

class SalesOrganization
  include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
  def find_new_leads
    ...
  end
  add_transaction_tracer :find_new_leads, :category => :task
end

:category => :task オプションを指定すると、(トランザクションタイプとして Non-web を選択したという意味になり) Transactions ページにトレースを表示するように Ruby エージェントに指示します。このオプションを指定しない場合は、Web トランザクションとしてレポートされます。:category に文字列を渡すこともできますが、文字列が 'OtherTransaction/' で始まる場合、値は Transactions ページでのみ表示されます。

クラスメソッドを計測するには、singleton を使います。

require 'newrelic_rpm'

class SalesOrganization
  def self.find_new_leads
    ...
  end
  class << self
     include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
     add_transaction_tracer :find_new_leads, :category => :task
  end
end

カスタムメトリクスのトレースに関する詳しい情報は、Ruby のカスタムメトリクスをご覧ください。

newrelic.yml の設定

バックグラウンドアプリが、Ruby エージェントを実行中の Rails アプリでない場合は、newrelic.yml ファイルをバックグラウンドジョブを起動するディレクトリ、もしくは configサブディレクトリにコピーします。そのファイルにライセンスキーが含まれていることを確認しておいてください。

バックグラウンドジョブが、New Relic が監視中の既存の Web アプリのコンテキストで実行中の場合、エージェントは自動的に既存のnewrelic.yml ファイルを使います。

アプリケーションの Rails 環境を起動するバックグラウンドジョブは、RAILS_ENV 環境変数を使って、newrelic.yml ファイルのどのセクションから読み込むかを決定します。Rails コンテキストで実行されていないバックグラウンドジョブの場合は、NEW_RELIC_ENV 環境変数をチェックし、読み込む設定ファイルのセクションを決定します。見つからない場合は、RUBY_ENVRAILS_ENVRACK_ENV 環境変数の順に遡り、見つかったものを使います。これらの環境変数がすべて未設定の場合は、development がデフォルトとして使われます。

代替のアプリケーション名の送信

バックグラウンドジョブが、既存の New Relic Web アプリケーションのコンテキスト上で実行されており、New Relic UI 上でそれとは別のアプリケーション名として表示したい場合は、バックグラウンドのワーカープロセス開始時に、バックグラウンドジョブで使いたいアプリ名をNEW_RELIC_APP_NAME 環境変数に設定します。

この環境変数は、newrelic.yml ファイルの app_name 設定を上書きします。ワーカーコードでnewrelic_rpm が必要になるに、この環境変数を設定しておく必要があります。

例:

$ NEW_RELIC_APP_NAME="My Background Jobs" ./bin/my_background_worker.rb

詳しくは、アプリケーションの命名をご覧ください。

エージェントの起動を確認

ブラックリストに載せられた実行ファイル名、rake タスク名、定数を検出しない限り、require 'newrelic_rpm' すると、すぐにほとんどのコンテキストで、Ruby エージェントは自動的に起動します。一般的な rake タスク、対話型コンソールセッションなどで、起動しないようにするためです。詳しくは、エージェントの起動の制御をご覧ください。

注: Rails を利用せずに実行されているスタンドアロンのスクリプトでは、通常 require 'newrelic_rpm' すると、すぐにエージェントを起動します。主な作業の開始前に、フォークやデーモン化するスクリプトがある場合は、初期設定が完了するまで require コールを延期することをお勧めします。

daemons gem を使って、バックグラウンドタスクを開始すると、エージェントは起動に失敗し、ログも出力されません。これは、deamons gem が、あなたが用意したバックグラウンドコードを実行する前に、作業ディレクトリを / に変更します。一方、エージェントはホストプロセスの現在の作業ディレクトリを基準に、設定ファイルとログファイルへのパスを解決しようとするためです。

エージェント設定ファイルとログファイルの場所を環境変数に設定すると、この状況でもエージェントを起動できるようになります。

ENV['NRCONFIG'] ||= File.dirname(__FILE__) + '/../../config/newrelic.yml'
ENV['NEW_RELIC_LOG'] ||= File.dirname(__FILE__) + '/../../log/newrelic_agent.log'

監視スクリプト

上記の手順は、デーモン内でバックグラウンドジョブを実行する場合に適用されます。スクリプトが、1つのバックグラウンドタスクを実行して終了する場合、スクリプトの終了時に、手動でエージェントをシャットダウンする必要があります。そうすることで、データが確実にサーバーに送信されます。

例:

require 'newrelic_rpm'

class SalesOrganization
  include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
  def find_new_leads
    ...
  end
  add_transaction_tracer :find_new_leads, :category => :task
end

SalesOrganization.find_new_leads
::NewRelic::Agent.shutdown

関連情報

関連する情報は以下のとおりです。