構成ベースの Java トレース SDK
コンフィギュレーションベースのJava Trace SDKは、スパンとスパンが持つべきタグの宣言的な指定を可能にし、アプリケーションの特定のメソッドを実行することでスパンを作成します。
表現力は @Span アノテーションと SpanSupport.annotate() の機能に匹敵します。
カスタムトレースを実装する前に、 トレースのベストプラクティスをお読みください。
概要
構成ベースの SDK は、アプリケーションの変更に対して不安定です。 クラス名やメソッド名を変更すると、突然コンフィギュレーションが一致しなくなり、トレースデータが失われることがあります。 可能な限り、コード変更に対する耐性がはるかに高く、目標達成に役立つ機能がより多く備わった Java Trace SDK を使用することをお勧めします。
構成
設定ベースのJava Trace SDKを使用するには、 Java Trace SDKの有効化で説明するように、Java Trace SDKを有効にする必要があります。
注:
コンフィギュレーションベースの Java Trace SDK のコンフィギュレーションへの変更は、Instana エージェントによって自動的に取り込まれます。 変更された構成を使用するには、既にインスツルメントされているアプリケーションを再始動する必要があります。
設定ベースの Java Trace SDK は、Java Trace Sensor バージョン
1.2.351以降で利用可能です。
フォーマット
以下のリストは、構成の一般的なフォーマットを示しています。
# Java Tracing
com.instana.plugin.javatrace:
instrumentation:
sdk:
targets:
- match:
type: 'interface'|'class'|'baseclass'
name: '<type-name>'
method: '<method-name>'
[argumentTypes:
- '<argument-type-index0>'
- '<argument-type-indexn>']
[returnType: '<return-type-name>']
span:
name: '<span-name>'
[type: '<span-type>']
[stackDepth: <depth>]
[tags:
- kind: 'argument'
name: 'name'
index: 0
- kind: 'return'
name: 'name'
- kind: 'constant'
name: 'name'
value: 'constant-value']
targets キー内に複数のターゲットを定義できます。各ターゲットでは、作成するスパンを 1 つ指定します。 1 つの target の match オブジェクトは、インスツルメンテーションの適用先のメソッドを指定します。 span オブジェクトは、スパンの作成方法を指定します。これには、スパンの名前 (call.name フィルターの無制限分析などで使用される) および設定するタグが含まれます。
インスツルメントするメソッドの突き合わせ
このオブジェクトは、インスツルメンテーションを実行するコード・ポイントを記述します。
type: インスツルメントするコードのタイプ。サポートされる値は以下のとおりです。class: 具象クラスと一致interface: インターフェースを実装するすべてのクラスと一致baseclass: 基本クラスを拡張するすべてのクラスと一致
name:マッチさせるクラス、インターフェイス、ベース・クラスの完全修飾名 入れ子になったクラスについては、a.b.c.OutsideClass$NestedClassという表記が期待されるmethod: 呼び出しの記録対象とする特定のクラス、インターフェース、または基本クラスのメソッドの名前argumentTypes: 突き合わせるメソッドの完全修飾引数タイプのリスト (オプション)- 欠落している場合、引数は突き合わされず、インスツルメンテーションはすべてのメソッドに適用されるため、過負荷となることがあります。
- 存在する場合、すべての引数は、指定されたタイプと順番に一致する必要があります。そうでない場合は、メソッドの突き合わせは行われません。
returnType: 突き合わせるメソッドの完全修飾された戻りの型 (オプション)- 欠落している場合、戻りの型は考慮されません。
- 存在する場合、戻りの型が指定されたタイプと一致する必要があります。そうでない場合は、メソッドの突き合わせは行われません。
スパンの形式の指定
このオブジェクトは、match で記述したメソッドが呼び出された場合に作成されるスパンのプロパティーを記述します。
name:スパン名type: スパン・タイプ (オプション)。サポートされる値は以下のとおりです。ENTRY。外部システムからの「着信」呼び出しを示すために使用されます。INTERMEDIATE。「関心対象の」メソッドへの内部呼び出しのキャプチャーに使用されます (デフォルト)。EXIT。外部システムへの「発信」呼び出しを示すために使用されます。
stackDepth: メソッド呼び出しでキャプチャーするスタック・フレームの数 (オプション)。デフォルトは0です。tags: キャプチャーするタグ/注釈のリストとその値の取得方法 (オプション)。サポートされる値は以下のとおりです。constant、定数値をキャプチャーします。kind:constantname: 作成するタグの名前value: 作成するタグの定数値
return、メソッド呼び出しの戻り値をキャプチャーします。kind:returnname: 作成するタグの名前。値は、戻りオブジェクトの値です。
argument、メソッド呼び出しの特定の引数値をキャプチャーします。kind:argumentname: 作成するタグの名前index: タグの値としてキャプチャーする引数の 0 ベースのインデックス
null または Optional.empty の場合、定義されたタグは追加されません。 タグが欠落しているスパンは、 is not present 演算子を call.tag フィルターと組み合わせて使用して、 無制限分析 で検索できます。エラーのあるスパン
Throwableがインスツルメンテーションされたメソッドの外部に伝搬されると、スパンには自動的にエラーのマークが付けられ、Throwable#getMessage()の値がエラー・メッセージとして設定されます。このエラー・メッセージは、call.error.messageタグを使用して 無制限分析 で検索できます。
SDK設定の確認
- コンフィギュレーションが正常に解析されたことを確認する。 エージェントのログで、以下のようなメッセージを探してください:
Parsed configuration file /instana-agent/etc/instana/configuration.yaml - インストルメンテーションが適用されたことを確認する。 解析後、エージェントはSDKインスツルメンテーションを実行したことを示すメッセージをログに記録します:
... Spent XX ms and XXX KiB of Metaspace for instrumentation [sdk] ... - SDKスパンのトレースログを有効にし、検証する。 スパンが実際に作成されていることを検証するには、以下のYAMLを追加してトレースロギングを有効にします:
com.instana.plugin.javatrace: instrumentation: log: type: trace file: /tmp/trace.log
インスツルメンテーションがアクティブになり、インスツルメンテーションされたコードが実行されると、SDKスパンが表示されるはずです。 トレースログのフォーマット例:
-|EN|052d6bf37f16034c7:0:52d6bf37f16034c7|sdk:sdk.quarkus-hello|*com.instana.agent.instrumentation.sdk.SdkPlugin:start:789:SdkPlugin.java
例
以下のスニペットは、バッチ・ジョブを処理するアプリケーションをトレースする方法の構成例を示しています。
com.instana.plugin.javatrace:
instrumentation:
sdk:
targets:
- match:
type: class
name: com.instana.java.sdk.BatchApplication
method: processBatch
span:
name: Job
type: ENTRY
stackDepth: 2
tags:
- kind: constant
name: endpoint
value: BatchJob
- kind: argument
name: batch.job
index: 0
- match:
type: class
name: com.instana.java.sdk.BatchApplication
method: updateDatabase
span:
name: DatabaseCall
type: EXIT
stackDepth: 2
tags:
- kind: constant
name: db.connection_string
value: jdbc:mysql://127.0.0.1:3306/jobs
- kind: argument
name: db.statement
index: 0
最初に、クラス com.instana.java.sdk.BatchApplication 内のメソッド processBatch がインスツルメントされて、Job という名前のエントリー・スパン、定数値 BatchJob を持つ注釈 endpoint、および値として最初の引数を持つ注釈 batch.job が作成されます。
さらに、バッチ処理中の発信 DB 呼び出し (つまり、同じクラス内のメソッド updateDatabase の呼び出し) で、DatabaseCall という名前のエグジット・スパン、定数値 jdbc:mysql://127.0.0.1:3306/jobs を持つ注釈 db.connection_string、およびメソッド呼び出しの最初の引数を持つ注釈db.statement が作成されます。
processBatch を使用して新規バッチを処理すると、新しいトレースが開始され、updateDatabase による後続の DB 更新がその中に子スパンとしてリストされます。 無制限分析と同様、すべての Instana 機能は、Instana AutoTrace で作成されたトレースに同じように使用できます。
制限
構成ベースの Java トレース SDK には、以下の制約事項が適用されます。
- コンストラクターのインスツルメントはサポートされていません。
- あるメソッドでスパンを開始して別のメソッドでそれを閉じることはサポートされていません。このため、構成ベースの SDK には
@Span.Start注釈および@Span.End注釈に相当するものはありません。 tagを明示的に作成せずにすべての引数または戻り値をキャプチャーする処理はサポートされていません。- 引数リストで、重要でない引数や残りの引数のプレースホルダーを指定することはサポートされていない。
- クラスやメソッドの名前パターンの指定はサポートされていません。
- スパンを作成する前にトレース・コンテキストを復元することはサポートされていません。つまり、構成ベースの SDK には、
SpanSupport.inheritNext()に相当する機能はありません。