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

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

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

エージェントは、スレッドトラッキングのメカニズムとして、「Constructor モード」および「Executor モード」(Java エージェント 20.11.0 以降)の 2 つを提供します。

次に、スレッド間トランザクション アクティビティを関連付ける 2 つの代替アプローチを示します。

  • Constructor モードのスレッドトレーススレッドRunnable、および Callable がそれぞれの作成に基づいてインストゥルメント化されるモードです。エージェントは、以前はデフォルトモードとしてこのモードを使用していました。
  • Executor モードのスレッドトレース:このトラッキングモードは、デフォルトモードで、ほとんどのアプリケーションとフレームワークで広く使用されるインストゥルメント化実行フレームワークに基づいています。このモードは、Play、Akka、Vert.x、および Spring Reactor リアクティブフレームワークが存在する場合など特にスレッドの使用率が高い場合に、エージェントの動作をより効率化します。

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

エージェントが使用するスレッド関連付けモードは、app-agent-config.xml 構成ファイル内の async-instrumentation-strategy プロパティを使用して選択できます。

Constructor モードでアプリケーションを実行するには、async-instrumentation-strategy プロパティの値を変更するか、次の Java コマンドラインオプションを使用します。

-Dappdynamics.async.instrumentation.strategy=constructor
CODE

システムプロパティは構成ファイルよりも優先されます。実行時に設定されたスレッド インストゥルメンテーション モードは変更できません。