.NET カスタム計測

New Relic は、Web ブラウザのトランザクションとバックグラウンドタスクの情報を収集し、レポートします。通常、使い始めるには、コードを変更する必要はなく、すぐに必要な情報を収集、レポートします。New Relic がお使いのフレームワークをサポートしていない場合は、カスタム計測を追加する必要があります。

New Relic カスタム計測を実現するために、メソッドトレーサーを使用しています。メソッドトレーサーは、任意のクラスのメソッドに配置可能なソフトウェアプローブです。New Relic の .NET エージェントは、拡張ディレクトリ内のすべての XML ファイルからトレース対象のメソッドを定義している計測ディレクティブをロードします。そして、CoreInstrumentation.xml は、エージェントの組み込み計測セットを定義します。

警告: 多すぎるメトリック収集は、アプリケーションと New Relic 両方のパフォーマンスに影響を与えます。そのような問題を回避するために、2000でカスタム計測経由で利用するユニークなメトリクスの合計数は、2000 以下に維持してください。

カスタム計測の追加

拡張機能ファイルでは、instrumentation 要素にあるトレーサーファクトリーの数を定義します。各トレーサーファクトリーには、一致に必要な、アセンブリ名、クラス名、メソッド名を定義する match 要素が含まれています。以下の手順に従って、新しくカスタム計測を定義します。

  1. 拡張ディレクトリに、新規に .xml ファイルを作成します。.NET エージェントは、instrumentation セットを定義するために、拡張ディレクトリにある全 xml ファイルを読み込みます。
  2. Visual Studio のような XML 対応エディタを使用して、カスタム計測ファイルを編集し、計測に必要なメソッドを指定します。CoreInstrumentation.xml にあるトレーサーの定義例として、以下のサンプルを使用してください。

    メモ: Do not modify CoreInstrumentation.xml は編集しないこと。これは、エージェントがアップグレードした際に上書きされます。

  3. (拡張ディレクトリにある)extension.xsd を利用して、作成した .xml 計測ファイルを検証します。
  4. アプリケーションのホストプロセスを再起動します。お使いのアプリが、IIS でホストされている場合は、IIS も再起動してください。それ以外の場合は、(例えば、WFC サービスの)ホストプロセスやアプリケーションを再起動します。

トランザクションを計測対象外にする

カスタム計測ファイルを利用してレポートされるトランザクションを停止させることができます。計測対象外のメソッドが呼び出されると、エージェントは、親トランザクションの全体を計測対象外とします。これは IgnoreTransaction() を呼び出すのと同じです。これを行うには、カスタム計測の追加手順に従って、NewRelic.Agent.Core.Tracer.Factories.IgnoreTransactionTracerFactory という名前の tracerFactory を追加します。

    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.IgnoreTransactionTracerFactory">
      <match assemblyName="System.Web.Extensions" className="System.Web.Handlers.ScriptResourceHandler">
        <exactMethodMatcher methodName="Throw404" />
      </match>
    </tracerFactory>

MyInstrumentation.xml の例

以下は、二つのメソッドを計測し、一つのメソッドを無視している例です。

  • Instrument: CustomInstrumentDemo.Controllers.FirstController.FirstExample()
  • Instrument: CustomInstrumentDemo.Controllers.SecondController.SecondExample()
  • Ignore: CustomInstrumentDemo.Controllers.SecondController.ThirdExample()

このカスタム計測スキーマを実装するには、以下のカスタム計測ファイルを使用します(MyInstrumentation.xml)。

カスタム計測ファイルの例
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
  <instrumentation>
    <!-- instrument CustomInstrumentDemo.Controllers.FirstController.FirstExample and creates metric named Custom/Foo1 -->
    <tracerFactory metricName="Custom/Foo1">
      <match assemblyName="CustomInstrumentDemo" className="CustomInstrumentDemo.Controllers.FirstController">
        <exactMethodMatcher methodName="FirstExample" />        
      </match>
    </tracerFactory>
     <!-- instrument CustomInstrumentDemo.Controllers.SecondController.SecondExample -->
    <tracerFactory>
      <match assemblyName="CustomInstrumentDemo" className="CustomInstrumentDemo.Controllers.SecondController">
        <exactMethodMatcher methodName="SecondExample" />
      </match>
    </tracerFactory>
    <!-- ignore CustomInstrumentDemo.Controllers.SecondController.ThirdExample -->
    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.IgnoreTransactionTracerFactory">
      <match assemblyName="CustomInstrumentDemo" className="CustomInstrumentDemo.Controllers.SecondController">
        <exactMethodMatcher methodName="ThirdExample" />
      </match>
    </tracerFactory>
  </instrumentation>
</extension>

以下のコードには、カスタム計測ファイルで指定した三つのメソッドが含まれています。

計測対象のメソッドの例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Threading;

namespace CustomInstrumentDemo.Controllers
{

    public class FirstController : Controller
    {
    
        public ActionResult Foo1()
        {
            ViewBag.Message = "Your Sample Page";

            FirstExample();
            
            return View();
        }

        public void FirstExample()
        {
            int firstVar = 1;
 
            for (int i = 0; i <= 500; i++)
                {
                    firstVar *= 5;
                    Thread.Sleep(50);
                } 

        }
    }

    public class SecondController : Controller
    {

        public ActionResult Foo2()
        {
            ViewBag.Message = "This view will include detailed information on the SecondExample method";

            SecondExample();

            return view;
        }

        public ActionResult Foo3()
        {
            ViewBag.Message = "This view will be ignored because of the includsion of the ThirdExample method";

            ThirdExample();
        }

        public void SecondExample()
        {
            int secondVar = 2;

            using (var connection = new SqlConnection(ConnectionStrings["MsSqlConnection"].ConnectionString))
            {
                connection.Open();
                using (var command = new SqlCommand("SELECT * FROM table", connection))
                using (var reader = command.ExecuteReader())
                {
                    reader.Read();
                }
            }

        }

        public void ThirdExample()
        {
            try
            {
                var ImNotABool = "43";
                bool.Parse(ImNotABool);
            }
            catch (Exception ex)
            {
                NewRelic.Api.Agent.NewRelic.NoticeError(ex);
            }

        }
    }
}

メトリクスの名前付け

トレーサーから生成されたメトリクスには、マッチしたメソッドのクラス名とメソッド名を使用して名前が付けられます。

metricName 属性でこの名前を上書きできます。metricName の最初は Custom/とします。(例: metricName="Custom/OrderSubmissions")


<!-- instruments MyCompany.Order.Submit() and creates a metric named Custom/OrderSubmissions -->
  <tracerFactory metricName="Custom/OrderSubmissions">
  <match assemblyName="MyCompany" className="MyCompany.Order">
    <exactMethodMatcher methodName="Submit" />
  </match
</tracerFactory>

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

エージェントは、最優先の命名権でトランザクションにあるトレーサーを使用しトランザクションに名前を付けます。Web トランザクションは、トランザクションの実行中に呼び出されたトレーサーに応じて、HTTPハンドラ、asp 名、MVC コントローラ名、Web サービス名を使用して名前を付けることができます。トランザクションに明示的に名前を付けるトレーサーを持たないバックグラウンドトランザクションは、一つのトランザクション名に集約されます。transactionNamingPriority 属性を使うと、トレーサートランザクションの命名優先権を与えるように、エージェントに指示できます。

有効な値は 1〜7 です。7 は、1〜6 よりも優先されます。 metricName 属性の先頭は、Custom/ とする必要があります。(例:metricName="Custom/instance"


<!-- instructs the agent to create a metric for MyControllerBase.Execute and to name the transaction using this tracer's metric name -->
<tracerFactory metricName="Custom/instance" transactionNamingPriority="7">
  <match assemblyName="MyCompany" className="MyCompany.MyControllerBase">
    <exactMethodMatcher methodName="Execute" />
  </match>
</tracerFactory>

トラブルシューティング

.NET エージェントは、メソッドを書き換えるとき、NewRelic.Profiler.####.log (#### は、計測対象の PID です)にログメッセージを書き込みます。これは、カスタム計測が読み込まれており、適切なメソッドで計測されていることを確認するのに役立ちます。

メモ: カスタム計測では、tracerFactory 要素の name 属性を使用しないようにしてください。詳しくは、エージェントのディレクトリにある extension.xsd スキーマファイルを確認してください。

さらに詳しい情報

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