New Relic が監視している Java アプリケーションの場合、 カスタム インストルメンテーション 方法のひとつとして、インストルメント化したいメソッドやクラスをリスト化した XML ファイルを使用する方法があります。このドキュメントでは、XML インストルメンテーションファイルの例を示します。詳しくは、 XML による Java インストルメンテーション をご覧ください。
UIでのXMLファイルの編集
New Relic UI から XML ファイルを直接編集するには、 one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentationに移動します。 ここから次のことができます:
- サンプルXMLファイルのダウンロード
- 既存のXMLファイルを選択して編集します。
- 楽器の履歴を検索します。
XMLファイル形式
XMLファイル形式には、ルートノードとチャイルドノードがあります。
注意
すべてのメソッドをインストルメント化しないでください。これは、 メトリックグループ化の問題につながる可能性があります。.
XMLファイルのルートノードはextension
です。それは3つの異なる属性を持つことができます:
価値 | 定義 |
---|---|
| XML拡張機能を識別するための、ユニークかつ記述的な名前。 |
| 拡張機能がJavaエージェントによって読み取られるかどうかを識別します。デフォルトは |
| 拡張機能のバージョンです。同じ名前のエクステンションが2つある場合は、バージョンの高いエクステンションのみが使用されます。 |
instrumentation
ノードはextension
の子です。 1つの属性を持つことができます: metricPrefix
。これは、 nameTransaction
ノードが指定されていない場合にメトリック名に使用されるプレフィックスです。デフォルトはCUSTOM
です。
pointcut
はinstrumentation
の子ノードであり、いくつかの属性を持つことができます。また、 pointcut
には複数の異なる子ノードを含めることができます。
価値 | 定義 |
---|---|
| このポイントカットに到達したときに、まだトランザクションが進行していなければ、トランザクションが開始されます。すでに進行中のトランザクションがある場合は、そのトランザクションが継続されます。新しいトランザクションは作成されません。 |
| メトリックに使用する名前の形式。存在しない場合、これはデフォルトでクラス名の後にメソッド名が続きます。 |
|
|
|
|
| トランザクションのタイプを設定します。可能な値は、 |
pointcut
には、いくつかの異なる子ノードを含めることができます。
価値 | 定義 |
---|---|
| この要素が存在する場合、エージェントは、このポイントカットでインスツルメンテーションされたクラス名とメソッドを使用してトランザクションに名前を付けます。 |
| 大文字小文字を区別した、パッケージ名を含むアノテーションクラスのフルネーム。このアノテーションでマークされているすべてのメソッドがマッチします。 |
| パッケージ名を含む、一致するクラスの大文字と小文字を区別する名前。このノードをメソッドノードとペアリングします。このノードがポイントカットに存在する場合、
|
| 実装クラスが一致するパッケージ名を含む、大文字と小文字を区別するインターフェースの名前。このノードをメソッドノードとペアリングします。このノードがポイントカットに存在する場合、
|
| インストルメントするクラスのメソッド。このノードを |
| バイトコードで使用される形式(たとえば、 そのクラスのオブジェクトを返すすべてのメソッドがマッチします。 |
| ラムダをマッチさせるかどうかを示すブール値。
|
method
ノードには複数の子を含めることができます。詳細と例については、 Javaカスタムインストルメンテーションのトラブルシューティングを参照してください。
価値 | 定義 |
---|---|
| 一致するメソッドの正確な大文字小文字を区別する名前。 メソッド
|
| 順番に指定されたメソッドのパラメータータイプ。 メソッド
|
| 一致させる戻り値のタイプを示すクラスの大文字と小文字を区別する名前です。このクラス・タイプを返すすべてのメソッドが照合されます。 |
例
ここでは、サンプルクラスと、そのクラスをインストルメント化するためのXMLファイルを紹介します。
package test;
import java.util.HashMap;import java.util.Map;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;
public class SampleTester {
private String configName; private Map<String, Long> maxSampleTimes;
public SampleTester(String pConfigName) { configName = pConfigName; maxSampleTimes = new HashMap<>(); }
public void checkSample(String name, long[] times) { if (times != null) { maxSampleTimes.put(name, getFirst(times)); } else { maxSampleTimes.put(name, (long) getFirst()); } }
private Long getFirst(long[] times) { return times[0]; }
private int getFirst() { return 0; }
public void printMaxRepeat(final long max) throws Exception { Runnable myRunnable = new Runnable() { public void run() { try { printMax(max); } catch (Exception e) { e.printStackTrace(); } } };
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); scheduledExecutor.scheduleWithFixedDelay(myRunnable, 0, 10000, TimeUnit.MILLISECONDS); }
private void printMax(long max) { System.out.println("max is " + max); }}
<?xml version="1.0" encoding="UTF-8"?><extension xmlns="https://newrelic.com/docs/java/xsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="newrelic-extension extension.xsd" name="customExtension" version="1.0">
<instrumentation metricPrefix="EXAMPLE"> <pointcut transactionStartPoint="true">
<!--class name is preceded by package name--> <className>test.SampleTester</className> <method> <name>checkSample</name> <parameters> <type attributeName="sampleName">java.lang.String</type> <type>long[]</type> </parameters> </method> <!--two methods with the same name but different signatures can share one node--> <method> <name>getFirst</name> </method> <method> <name>run</name> </method> </pointcut>
<pointcut transactionStartPoint="false" ignoreTransaction="false" excludeFromTransactionTrace="false" metricNameFormat="SampleTester/methods">
<className>test.SampleTester</className> <method> <name>printMaxRepeat</name> </method> <method> <name>printMax</name> </method> </pointcut>
</instrumentation></extension>
XMLファイルの最初のブロックは、拡張子の名前とバージョンを指定します。 XML拡張子はデフォルトのenabled
であるため、その属性は指定されていません。
2番目のブロックは、インストルメントする必要があるSampleClass
のメソッドを指定します。トランザクションはブロックの開始時に開始されます。サンプルクラスには、名前( getFirst
)を共有しているが署名が異なる2つのメソッドがあることに注意してください。これらは、単一のメソッドノードで計測されます。 parameters
ノードを削除することにより、同じ名前のすべてのメソッドを1つのメソッドノードで照合できます。
3番目のブロックでは、指定されたメソッドでトランザクションが開始されていません。これは、トランザクションがrun
ですでに開始されているためです。トランザクションは無視されず、トランザクショントレースに含まれます。