構成ベースの 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 つの targetmatch オブジェクトは、インスツルメンテーションの適用先のメソッドを指定します。 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: constant
      • name: 作成するタグの名前
      • value: 作成するタグの定数値
    • return、メソッド呼び出しの戻り値をキャプチャーします。
      • kind: return
      • name: 作成するタグの名前。値は、戻りオブジェクトの値です。
    • argument、メソッド呼び出しの特定の引数値をキャプチャーします。
      • kind: argument
      • name: 作成するタグの名前
      • index: タグの値としてキャプチャーする引数の 0 ベースのインデックス
注: キャプチャされた値が null または Optional.empty の場合、定義されたタグは追加されません。 タグが欠落しているスパンは、 is not present 演算子を call.tag フィルターと組み合わせて使用して、 無制限分析 で検索できます。

エラーのあるスパン

Throwableがインスツルメンテーションされたメソッドの外部に伝搬されると、スパンには自動的にエラーのマークが付けられ、Throwable#getMessage()の値がエラー・メッセージとして設定されます。このエラー・メッセージは、call.error.messageタグを使用して 無制限分析 で検索できます。

SDK設定の確認

  1. コンフィギュレーションが正常に解析されたことを確認する。 エージェントのログで、以下のようなメッセージを探してください:
    Parsed configuration file /instana-agent/etc/instana/configuration.yaml 
  2. インストルメンテーションが適用されたことを確認する。 解析後、エージェントはSDKインスツルメンテーションを実行したことを示すメッセージをログに記録します:
    ... Spent XX ms and XXX KiB of Metaspace for instrumentation [sdk] ... 
  3. 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() に相当する機能はありません。