アプリケーションリアルタイム監視サービス(ARMS)のアプリケーション監視サブサービスを統合して、一般的な Java フレームワークを使用するアプリケーションを監視すると、ARMS エージェントはフレームワークを自動的にインストゥルメントします。このようにして、コードを変更することなくトレースが収集されます。ただし、プロセス固有のコンテキストを非同期に渡す場合は、Java 用 OpenTelemetry SDK をインストールできます。
ARMS エージェントでサポートされているコンポーネントとフレームワークについては、ARMS でサポートされている Java コンポーネントとフレームワーク を参照してください。
シナリオ
アプリケーションが次のいずれかの方法を使用して非同期プログラミングを実行する場合、ARMS エージェントはコード変更なしでトレースコンテキストを自動的に非同期に渡します。
JDK、Spring、または Netty スレッドプールを使用して非同期タスクを送信する。
React または RxJava フレームワークでプログラミングする。
Spring @Async アノテーションを使用する。
Spring Webflux や Spring Gateway などのフレームワークでプログラミングする。
ただし、次の非同期処理シナリオでは、Java 用 OpenTelemetry SDK を使用してコンテキストを手動で渡す必要があります。
プロデューサー - コンシューマーシナリオ
スレッド T1 がキューにメッセージを配置し、スレッド T2 が処理のためにメッセージを取得する場合、スレッド T2 はスレッド T1 のトレースコンテキストを再利用する必要があります。
データベースバッチ処理
プロセス P1 がデータベースにデータのバッチを書き込み、プロセス P2 がデータを読み取って処理する場合、プロセス P2 はプロセス P1 のトレースコンテキストを再利用する必要があります。
前提条件
ARMS のアプリケーション監視が統合されていること。詳細については、アプリケーション監視の概要 を参照してください。
ARMS エージェントが V4.x 以後であること。ARMS エージェントの更新方法については、ARMS エージェントの更新 を参照してください。
依存関係の追加
Java 用 OpenTelemetry SDK を導入するには、次の Maven 依存関係を追加します。詳細については、インストゥルメンテーション を参照してください。
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.23.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>コンテキストを非同期に渡す
次のサンプルコードは、プロデューサー - コンシューマーシナリオを示しています。イベント生成中に、プロデューサーはスレッドのトレースコンテキストを記録します。イベント消費中に、コンテキストを取得して復元します。
class Event {
private Context context;
private String msg;
// イベントのコンストラクタ。コンテキストとメッセージを受け取ります。
public Event(Context context, String msg) {
this.context = context;
this.msg = msg;
}
}
private final LinkedBlockingQueue<Event> linkedBlockingQueue = new LinkedBlockingQueue<Event>();
// イベントを生成し、現在のコンテキストとともにキューに追加します。
public void produce(String msg) {
linkedBlockingQueue.add(new Event(Context.current(), msg));
}
// キューからイベントを消費し、保存されたコンテキストで処理します。
public void consume() throws Exception {
Event event = linkedBlockingQueue.take();
try(Scope scope = event.context.makeCurrent()) {
processEvent(event);
}
}
// イベントを処理します。
public void processEvent(Event event) {
//todo process event
}関連手順
トレース ID をアプリケーションログに関連付けて、エラーを迅速に特定、分析、および解決できます。詳細については、Java アプリケーションのログにトレース ID を関連付ける を参照してください。