Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

Java APMについて

こんにちは、ロジカル・アーツ 井上です。

JAVA APM について、概要と主な用語をまとめました。

WhaTap モニタリングによって出力される各メトリックスについてまとめてみました。 メトリックの詳細について理解できるものを記載していきます。 メトリックスのフィールド名はWhaTap モニタリングの画面にて出力されるものを記述してます。

1.APMとは

APMとは、Application Performance Managementの略で、ターゲットアプリケーションのパフォーマンス情報を収集し、可視化されたグラフ、表などの形で提供するソリューションを意味します。一般的には、リアルタイムのモニタリング情報を提供するダッシュボード、終了したトランザクション分析、および統計照会およびレポート機能、異常検出および通知機能などを提供します。

APMソリューションベンダーによってさまざまな言語のパフォーマンス監視機能が提供されていますが、今回まとめたAPMJavaアプリケーション用のAPMで、ServletコンテナベースのWebアプリケーションを監視についてです。

つまり、私たちはJava APMを利用して、HTTPトランザクションの監視を主にしているのです。

ただし、APMサーブレットコンテナを監視することに限定されているわけではありません。

モニタリングのためのポイントカット、結合ポイントの設定によっていくらでも変わることがあります。

2. APMで言う「パフォーマンス」とは?

アプリケーションが迅速な応答時間内に多くのスループットを消化しながら、リソースを効率的に使用することを「性能の良いアプリケーション」だと思います。そういう意味でいくつかの指標がありますが、代表的には次のようなものがあります。

応答時間 ・TPS (1 秒あたりのトランザクションスループット、 Transaction Per Second) ・リソース使用量(CPU、メモリ、I/O、…)

3. 性能測定の原理

APMコンポーネントの1つであるエージェントは、これらのパフォーマンス指標を収集する役割を果たします。 CPU、メモリ、スレッドなどのリソースに関する情報は、JMXを介して取得します。 他のパフォーマンスの主な指標の1つである応答時間を測定する原理は、私たちがよく考えるほど単純です。

メソッド終了時間 - 開始時間 = メソッドの実行に要した時間

私たちはJava WebアプリケーションのHTTPトランザクションを監視するので、
HttpServlet.service(request, response)メソッドを最上位メソッドとして、上記と同じ原理で応答時間を収集することです。

最上位のメソッドが開始して終了するまで呼び出される他のメソッドも同じ原理で収集されます。

ただし、結合ポイントとポイントカットが定義されたメソッドに限り収集されます。

すべてのクラスすべてのメソッドを収集する場合、その負荷を余裕が難しいだけでなく、監視する立場でも不要なデータがほとんどの領域を占めるからです。

通常、HttpServlet.service などのトランザクションの開始点と、JDBC、HTTP call に関連するクラスおよびメソッドを基本的に収集します。 このように収集されたデータを利用して、トランザクション応答時間、プロファイルに表示される各項目別の実行時間などを示します。

これらのパフォーマンス情報を収集するときは、ThreadLocalを使用してHTTPトランザクションを処理するスレッドから収集された情報を単一のプロファイルデータにまとめることができます。

ただし、非同期処理などの場合、スレッドが異なりパフォーマンス情報自体が収集できない、または別々のプロファイルに集計されることがありますが、これに対する解決策もソリューション別に提供しています。

4. パフォーマンス情報を収集するためのコードを挿入について

先の説明通りなら、メソッドの開始点と終了点に時間をチェックするコードを入れ、これを計算するコードも入れなければならないようです。しかし、私たちがAPMを使用しても、そのようなコードを直接書くことはありません。また、APM用のライブラリ追加などの作業もまったく行いません。それでもどのようにこのようなことが可能でしょうか?

〇データを収集するAPMエージェントでは、BCI(Byte Code Instrumentation)テクノロジを使用して、クラスのロード時に必要なコードを挿入できます。

Javaの場合、ASMというライブラリが代表的(CGLIBもASMベース、ただしCGLIBはプロキシオブジェクトを作成するので少し異なります)、「-javaagent」というJVMオプションで登録されたアプリケーション(jarファイル)はpremainというメソッドをはじめクラスロードプロセスに介入できます。

〇このプロセスでは、BCIを介してメソッドの開始/終了時に実行されるコードを挿入します。 その後、APMエージェントは、以前に挿入したコードを使用して、メソッド固有の応答時間を計算し、プロファイルデータとして作成します。

〇これにより、ソースコードを変更することなく、目的のロジックを実装したのと同じ効果を得ることができます。

WhaTap APMエージェントを適用するJVMオプションの例

-javaagent:$WHATAP_HOME/whatap.agent-2.1.0.jar

このような原理であるため、インスタンスAPMを新規に適用または除外するとき、または監視対象のポイントカット設定などが変更されたときに、そのクラスがリロードされなければ変更が適用されます。 (通常はインスタンスの再起動)

5. APM構造

このように収集されたデータがどのように渡され、監視UIとして提供されるかを簡単に見てみましょう。

APMは、以下のようにデータ収集エージェント - >収集/集約サーバー - > UIで3tier構造で構成されています。

ダッシュボードで提供されるリアルタイムデータは、Webソケットプッシュを通じて個別に提供されます。 (ソリューションの実装によって異なる場合があります)

プッシュではなくHTTPポーリング方式の場合、リアルタイムモニタリングには適しておらず、パフォーマンスも悪い方です。

6. APMの主な概念

それでは、APMを使用する際にわかりやすくするための用語と概念について説明します。概念を誤って理解して監視する場合は、サービスの運用に悪影響を及ぼす可能性があるため、各用語が実際に表す意味を理解したいと思います。

トランザクション

ビジネスが開始して終了するまでの1サイクルを意味します。 Java Webアプリケーションの場合、HttpRequestが起動してHttpResponseで応答を提供するまでを意味します。

〇ブラウザから WAS に到達するまでのネットワーク時間や、Response を生成して service メソッドを返した後にブラウザに到達するネットワーク時間などは Java APM に含まれません。

〇純粋にJavaアプリケーションがHTTPトランザクションを開始して終了した時間を意味します。

アクティブトランザクション

開始されたトランザクションのうちまだ終了していないトランザクションを意味します。

APMは、特定のサイクル(ex> 5秒)ごとにJVMで実行されているトランザクションをアクティブトランザクションと判断します。

APMでは、アクティブトランザクションに対して通常/遅い/非常に遅いなどの形で視覚化して提供しますが、 一般的に、青だけが出力されるレベルが最も安定していることがわかります。

青が多すぎると、応答が遅くなる状況が発生することを疑うことができます。 あるいは、新規/修正デプロイされたAPIのパフォーマンスが悪い場合もあります。 黄色/赤が表示される場合は重大な問題である可能性があるため、迅速な措置が必要です

TPS

Transaction Per Secondの略で、1秒あたりに処理されるトランザクションの数を意味します。 TPSが高いということは、それだけ大量のトランザクションを迅速に処理しているということです。

APMではグラフを通じて一般的に小数点データとして提供することになるが、グラフは通常5秒、10秒、1分単位のデータを提供するがTPSという概念自体が「秒当たり」という意味を内包しているため平均値を露出して小数点として提供されます。

応答時間遅延が発生した場合、TPSグラフは下にずっと落ちるでしょうか? 」

こちらは、APMソリューションを提供されたユーザが最もよくした質問の1つです。

ギャップ(Gap-Time)

ポイントカットで指定されていない部分で費やされた時間を意味します。

実務家が最も見過ごしたり誤解したりする概念です。

特に表自体を間違って見て、単に「応答時間」程度に解釈する場合がありますが、この場合、誤った措置を取ることがあるので注意する必要があります。

APMを使用した監視はAOPを介して行われ、どのクラスのどのメソッドをどの状況にどのアドバイスを適用して監視するかを決定します。

Java APMをインストールすると、デフォルトではHttpServlet.serviceや、HTTP call、JDBC Connection、Statementなどの基本的な部分に対してのみポイントカットが設定されています。 (ソリューションによって異なる)

これに加えて、ユーザが希望するポイントカットに対してパフォーマンス情報を収集するように設定することもできます。

ギャップという部分は、意味の通り、これらの「監視することが決定された部分ではない場所で発生した」時間を意味します。

上記の例を説明すると、プロファイル情報内にJDBC Connectionを取得する際にギャップが1.6秒程度発生するケースですが、

これは「JDBC connectionを取得するのに1.6秒かかった」という言葉もある程度文脈上正しいが、JDBC connection取得のために「私たちが監視対象にしていないどこかで1.6秒のディレイが発生した」と解釈するのが正確です。

その理由は「所要」カラムを見るとわかります。その部分の実行時間は1ミリ秒しかかかりませんでした。この実行時間は、そのメソッドが純粋に実行した時間を意味し、メソッド内部で呼び出されたサブメソッドの実行時間を除いた時間です。

応答時間

トランザクションのroot メソッドの終了時間 - 開始時間を意味し、私たちは Servlet コンテナベースの HTTP トランザクションを監視するので、 HttpServlet.service(request, response) が root になります。場合によっては、特定のメソッドをルートメソッドとして収集するかどうかを設定することもあります。この場合、そのメソッドの実行時間がトランザクション応答時間になります。

同時接続ユーザー

特定の時間帯にブラウザを介してそのサービスにアクセスし、HTTP Requestを発生させたユーザーの数を意味します。これを行うには、各ユーザーを識別する必要があります。 (https://www.whatap.io/ja/blog/101/index.html

平均応答時間と最大応答時間

トランザクション統計情報を分析すると、平均応答時間、最大応答時間などが表示されます。 2つの指標についても一度見てみましょう。

平均応答時間が高い=トランザクションは全体的に遅い。

ビジネスロジックの遅延を改善する点があるのか​​、サービスのインスタンス数が足りないのかなどを確認することをお勧めします。

平均応答時間は低いが、最大応答時間が著しく高いトランザクションが存在する=ある時点で応答遅延が発生した。

その時点の環境要因やサービス特性などに基づいて分析が必要です。

特定の時間にオープンしてトラフィックが集中するサービスの場合、その時間帯にのみ最大応答時間の高いトランザクションが発生する可能性があります。
あるいは、まったく異なる要因でネットワークやDB接続の問題が発生した可能性があります。

トランザクション検索で問題になるAPIを探す

応答時間/URL/エラーが発生するかどうかなど、さまざまな条件に基づいてトランザクションを検索できるため、パフォーマンスが悪いAPIを見つけるときに活用できます。

〇応答が遅れたトランザクションを検索するとき 〇どのような例外が発生したかを確認するとき
〇特定のURLのパフォーマンスを確認したい場合