概要

Java エージェントの非常に重要な機能は、JVM 内のアクティビティを追跡することです。これにより、特定の着信要求を処理する結果として、すべてのアクティビティ(JVM の内部および外部の両方)をリクエスト自体に関連付けることができます。単純なケースでは、各リクエストは 1 つの Java スレッドによって処理され、その単一スレッドの処理を追跡する必要があるだけです。これは、「リクエストごとのスレッド」として広く知られているパターンです。

これは、サーブレット仕様のバージョン 3.0(Java EE 6 で導入)が導入される前の JEE アプリケーションで主なケースでした。外部リソースの待機に大量の時間が費やされているシステムでは、多くのアプリケーションスレッドが外部応答待ちでブロックされたライフタイムのほとんどを消費するため、「リクエストごとのスレッド」モデルでは非効率的に見えることがあります。

このような観察から、サーブレット 3 の一部として提供される非同期サーブレット機能が実現され、普及が進む一般的なリアクティブフレームワークの多く(Play、Akka、Vert.x、Spring Reactor など)が推進されています。このアーキテクチャアプローチを使用するアプリケーションでトランザクションをエンドツーエンドで正しく関連付けるために、エージェントはスレッドからスレッドへトランザクションを追跡する必要があります。こうして、各リクエストの代わりに実行されるすべての作業エレメントについて、どのスレッドで実行されているかに関係なく、作業を測定してリンクできます。

エージェントは、スレッドトラッキングのメカニズムとして、「Constructor モード」および「Executor モード」(Java エージェントリリース 4.5.11 で追加された新しい試験的機能)の 2 つを提供します。

次のページでは、スレッド間トランザクション アクティビティを関連付けるこれら 2 つの代替アプローチについて説明します。

  • Constructor モードスレッドトレース
    これは、これまで数年間にわたってエージェントが使用してきたモードです。スレッド、Runnable、および Callable がそれぞれの作成に基づいてインストゥルメント化されます。

  • Executor モードスレッドトレース(試験的機能)
    この新しい試験的トラッキングモードは、ほとんどのアプリケーションとフレームワークで広く使用されるインストゥルメント化実行フレームワークに基づいています。このモードは、前述のリアクティブフレームワークが存在する場合など特にスレッドの使用率が高い場合に、エージェントの動作をより効率的にすることが期待されます。

スレッド関連付けモードの選択

エージェントによって使用されるスレッド関連付けモードは、app-agent-config.xml 構成ファイル内の async-instrumentation-strategy  プロパティを使用して選択されます。新しい(試験的な)エグゼキュータベースのインストゥルメント化を使用するには、エージェントを起動する前に async-instrumentation-strategy  プロパティの値を constructor から executor に変更して app-agent-config.xml を変更します。また、JVM コマンドラインで appdynamics.async.instrumentation.strategy システムプロパティを設定することによって、インストゥルメント化方法を設定することもできます。例: -Dappdynamics.async.instrumentation.strategy=executor

システムプロパティは構成ファイルよりも優先されます。使用されるスレッドインストゥルメント化モードは、実行時に変更できません。スレッドの動作は、デフォルトでは Constructor モードを使用して追跡されます。