New RelicのJavaエージェントは、カスタムインストゥルメンテーションに複数のオプションを提供しています。こうしたオプションの1つとして、JavaエージェントAPIの@Trace
、@TraceLambda
または@TraceByReturnType
アノテーションをご利用のアプリケーションコードに追加できます。このドキュメントでは、アノテーションの利用方法を解説しています。
重要
アノテーションを利用するには、ソースコードを修正する必要があります。ソースコードの修正を希望しない、またはできない場合は、カスタムインストゥルメンテーションでその他のインストゥルメンテーションオプションを参照してください。
アノテーションはデフォルトで有効になっています
デフォルトでは、構成設定enable_custom_tracing
のJavaエージェントはtrue
に設定されています。これは、@Traceアノテーションを機能させる上で必須の設定です。
この設定は、デフォルトではnewrelic.yml
に含まれていません。アノテーションを無効にする場合は、enable_custom_tracing: false
(2つのスペースで始まる)をnewrelic.yml
のcommon
セクションで設定します。
@Trace
@Trace
でメソッドにアノテーションを付けると、Javaエージェントにそのメソッドの測定が必要であることを伝えます。
メソッドの呼び出しをカスタムトレースとして追加するには、メソッドに@Trace
アノテーションを追加します。これらのすべてのアノテーションを含むものとして、classpathにnewrelic-api.jar
が表示されることを確認してください。
import com.newrelic.api.agent.Trace;
...
@Trace public void run() { // background task }
新規トランザクションを作成する
トランザクションが表示されず、新規トランザクションを開始したい場合は、@Trace
アノテーションにdispatcher=true
を含めます。
@Trace (dispatcher=true)public void run() { // background task}
トランザクションに詳細を追加する
トランザクショントレースにインストゥルメントされていない時間のブロックが大量にあり、トレース内により多くのメソッドを含めたい場合は、パラメーターなしで@Trace
アノテーションを使用できます。
@Traceprotected void methodWithinTransaction() { // work}
トランザクションをWebリクエストに変換する
JavaエージェントAPIコールを使用してウェブブラウザトランザクションとしてバックグラウンドタスクレポートを作成するには、@Trace(dispatcher=true)
でアノテーションを付けたメソッドで、次のコールを実行します。
NewRelic.setRequestAndResponse(Request request, Response response)
この引数は、newrelic-api.jar
のRequest
およびResponse
のインタフェースの実装です。
重要
Request
およびResponse
オブジェクトが既に存在している場合でも、このAPIコールを追加する必要があります。
独自の@Traceアノテーションクラスを定義する
独自の@Trace
アノテーションクラスを定義する場合、newrelic-api.jar
との依存関係はありません。クラスを定義するには:
package com.test;
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)
public @interface Trace { public static final String NULL = ""; String metricName() default NULL; boolean dispatcher() default false; String tracerFactoryName() default NULL;}
次に、エージェントを設定して、このアノテーションをnewrelic.yml
のcommon
セクションで使用します。
class_transformer: trace_annotation_class_name: com.test.Trace
@Traceのプロパティ
@Trace
アノテーションは、以下のプロパティに対応しています。
@TraceLambda
この機能はデフォルトでは無効になっており、明示的に有効にして(例:-Dnewrelic.config.instrumentation.trace_lambda.enabled=true
)アノテーションを有効にします。同等の環境変数はNEW_RELIC_INSTRUMENTATION_TRACE_LAMBDA_ENABLED
です。
トランザクショントレースにインストゥルメントされていない時間のブロックが大量にあり、トレース内にラムダ式を含める場合は、パラメーターなしで@TraceLambda
アノテーションを使用できます。
import com.newrelic.api.agent.TraceLambda;
@TraceLambdaclass ClassContainingLambdaExpressions() { // work}
ラムダ式は、コンパイル後にクラスを含む静的メソッドになります。デフォルトで、アノテーションパターンに一致する@TraceLambda
アノテーションでマークされたクラス内の静的メソッドは、@Trace
アノテーションでマークされます。
@TraceLambdaのプロパティ
@TraceLambda
アノテーションは、以下のプロパティに対応しています。
@TraceByReturnType
トレース内に特定の戻り値の型のメソッドを含めるには、@TraceByReturnType
アノテーションを使用して、戻り値の型をプロパティとして渡すクラスをマークします。アノテーション付きクラスのメソッドは、指定された戻り値の型の1つに一致し、@Trace
アノテーションでマークされます。
@TraceByReturnType(traceReturnTypes={Integer.class, String.class})class ClassContainingMethods() { // ...}
@TraceByReturnTypeのプロパティ
@TraceByReturnType
アノテーションは、以下のプロパティに対応しています。
パフォーマンスに関する考慮事項
JavaエージェントがJVMに存在する場合、アノテーション付きメソッドにコードを投入します。パフォーマンスヒットは、データベースまたはウェブサービスコールなどの重い操作ではほとんど影響はありませんが、アクセサと呼ばれる1秒に数千回など、頻繁に呼び出されるメソッドでは顕著です。
注意
すべてのメソッドをインストゥルメントしないでください。パフォーマンスが低下し、メトリクスのグループ化問題につながる可能性があります。
追加API機能
JavaエージェントAPIとその機能の詳細については、JavaエージェントAPI入門を参照してください。