Ruby カスタム計測

New Relic Ruby エージェントは、多くのメトリクスを自動収集します。API を通して、アプリケーションから追加の情報を収集することもできます。トランザクショントレースの詳細に大きな「アプリケーションコード」のセグメントが表示される場合は、カスタム計測によって、アプリケーションで何が起こっているのかを知るためのより詳細な情報を収集することができます。

警告: 多すぎるメトリクスの収集は、アプリケーションと New Relic のパフォーマンスに影響を与えます。データの問題を回避するには、カスタム計測によって収集されるユニークなメトリクスの合計数を、2000以下に保ってください。

メソッドトレーサー

カスタム計測をキャプチャする最も簡単な方法は、特定のメソッドへの呼び出しをトレースすることです。
以下のようにメソッドをトレースすると、そのメソッドの呼び出し毎にトランザクショントレースに追加のノードが挿入されます。それは、トランザクションのどこで時間がかかっているかについてのより詳しい情報を提供します。

メソッドトレーサーは、どのクラスのメソッドにも配置できます。エイリアスメソッドチェーンを使って、ターゲットメソッドの実行時に自分自身を挿入し、そのパフォーマンスのカスタム計測を収集します。

クラス定義のトレース

メソッドトレーサーは、ターゲットとするメソッドが定義済みの場合のみ、クラス定義内で使用できます。

require 'new_relic/agent/method_tracer'
class Foo
  include ::NewRelic::Agent::MethodTracer

  def generate_image
    ...
  end

  add_method_tracer :generate_image, 'Custom/generate_image'
end  

クラスメソッドを計測するには、シングルトンクラスにメソッドトレーサーを追加します。

require 'new_relic/agent/method_tracer'
class Foo
  def self.generate_image
     ...
  end

  class << self
    include ::NewRelic::Agent::MethodTracer

    add_method_tracer :generate_image, 'Custom/generate_image'
  end
end

add_method_tracer は、オプションとして、メトリック名とハッシュを取ります。詳しくは、New Relic RubyDoc における add_method_tracer をご覧ください。

初期化のトレース

Railsにおける計測を追加する一般的な方法は、初期化子と「モンキーパッチ」計装ディレクティブを作成することです。

例えば、MyCache#get というメソッドトレーサーを追加する方法は以下のようになります。

  1. MyCache クラスはメソッドトレーサーを追加する前にロードされていることを確認します。
  2. config/initializers/rpm_instrumentation.rb という名前のファイルに以下の行を追加します。
require 'new_relic/agent/method_tracer'

MyCache.class_eval do
  include ::NewRelic::Agent::MethodTracer

  add_method_tracer :get
end  

コードブロックのトレース

あるメソッドが非常に複雑であり、全体の時間をトレースするのが困難なことがあります。以下のケースでは、トレーサーを使用してコードブロックをラップすることができます。以下のようにトレース用のコードをブロックとして、trace_execution_scoped 呼び出し時に渡せます。

extend ::NewRelic::Agent::MethodTracer

def slow_action
  self.class.trace_execution_scoped(['Custom/slow_action/beginning_work']) do
    # do stuff and report execution time with a custom metric name
  end

  # more stuff, whose time will be "blamed" to slow_action
end  

詳しくは、New Relic RubyDoc の add_method_tracer をご覧ください。

トランザクションの名前付け

計測されたトランザクションは、アプリケーションのスループット及び全体のレスポンスタイムの決定に使用されます。メソッド名やクラス名は、New Relic へ報告されるトランザクション名として使われます。詳しくは、トランザクショントレースの表示をご覧ください。

通常、エージェントは自動的にトランザクション名を選択します。実行中にトランザクション名を変更したい場合は、NewRelic::Agent.set_transaction_name とそれに対応する NewRelic::Agent.get_transaction_nameを使います。

特定の条件に従ってトランザクションを分けたい場合に便利です。たとえば、Rails でレスポンスのフォーマットによってトランザクション名を変えたい場合などです。

class UsersController
  def index
    @users = User.all
    respond_to do |format|
      format.html
      format.json do 
        NewRelic::Agent.set_transaction_name('Users/index.json')
        render :json => @users
      end
      format.xml do 
        NewRelic::Agent.set_transaction_name('Users/index.xml')
        render :xml => @users
      end
    end
  end
end  

トランザクション名の変更は、ビジネスに基づいて分割することもできます。たとえば、以下ように 「お得意顧客」と「そうでもない顧客」コードようにトランザクションを分けることもできます。

class UsersController

  before_filter :segment_new_relic_by_customer_size

  def segment_new_relic_by_customer_size
    new_relic_name = NewRelic::Agent.get_transaction_name
    if current_user.big_customer?
      NewRelic::Agent.set_transaction_name("#{new_relic_name} - big customer")
    else
      NewRelic::Agent.set_transaction_name("#{new_relic_name} - small customer")
    end
  end

end  

トランザクションのエントリーポイントのトレース

通常、エージェントは、アプリケーション内でトランザクションを識別することができますが、サポートされているフレームワークを使用していない場合やエージェントが自動的に記録しないトランザクションを記録したい場合は、トランザクションのエントリポイントとするメソッドを定義できます。

class Controller
  include NewRelic::Agent::Instrumentation::ControllerInstrumentation

  def transaction
    # execute a transaction
  end
  add_transaction_tracer :transaction
end  

Web以外のトランザクションの計測

メソッドレベルのトレースと同様に、Web トランザクションと同じレベルのトランザクションやエラーの詳細を持つバックグランド処理などの Web 以外のトランザクションも計測できます。詳しくは、Ruby バックグランド処理やデーモンの監視をご覧ください。

さらに詳しい情報

追加のドキュメントリソースは次のとおりです。