Amazon Web Services ブログ
Tomcat サーバー上で実行する Java アプリを Amazon CloudWatch Application Signals (プレビュー) で監視
従来、Java Web アプリケーションは Web Application Resource (WAR) ファイルにパッケージ化され、Tomcat サーバーなどの Servlet/JSP コンテナに展開されています。これらのアプリケーションは、データベース、外部 API、キャッシングレイヤなど、様々な相互接続されたコンポーネントを含む分散環境で動作しており、それらの複雑な相互作用によりパフォーマンスと健全性の監視が難しく、平均復旧時間 (MTTR) が長くなる可能性があります。
このブログでは、WAR パッケージからデプロイされ、Tomcat サーバーで実行されている Java Web アプリケーションを Amazon CloudWatch Application Signals を使って自動的にインストルメンテーションする方法を紹介します。Application Signals を有効にすることで、AWS Distro for OpenTelemetry (ADOT) Java 自動インストルメンテーション エージェントを使用してアプリケーションを自動的にインストルメンテーションし、コードの変更なしにメトリクスとトレースを収集することができます。コールボリューム、可用性、レイテンシー、障害、エラーなどの主要メトリクスを利用して、アプリケーションサービスの現在の運用状態を迅速に確認してトリアージできるため、アプリケーションが長期的なパフォーマンスとビジネス上の目標を満たしているかを確認できます。
ソリューションの概要
以下に、このソリューションの詳細な技術的概要を示します。
- Spring PetClinic アプリケーションを WAR ファイルとしてパッケージ化し、Tomcat サーバーがインストールされた Amazon EC2 インスタンスにデプロイします。
- Application Signals を有効にするために、Tomcat サーバー内の環境変数を使用してADOT Java 自動インストルメンテーションエージェントを構成し、アプリケーションにメトリクスとトレースを出力できるようインストルメントします。
- ADOT Java の自動インストルメンテーションエージェントは、さまざまなライブラリやフレームワークからテレメトリデータを収集するために、Java 8+ アプリケーションに接続できます。このエージェントは、起動時にコードを自動的に変換してトレースデータを収集します。デフォルトでは、OTLP エクスポータを使用し、http://localhost:4317 の OpenTelemetry コレクターにメトリクスとトレースの両方のデータを送信するように構成されています。
- Application Signals のメトリクスとトレースを収集するために、CloudWatch エージェントを構成します。さらに、Tomcat の
Server
とAccess
ログを送信するようエージェントを構成して、アプリケーションの監視可能性を高めます。 - Application Signals はサービスと依存関係を自動検出し、アプリケーションのトポロジーを視覚化してアプリケーションの状態を把握します。
図 1. ソリューションアーキテクチャ
前提条件
このブログの手順を追う場合は、パブリックサブネット内にAmazon EC2 インスタンスを既に設定済みである必要があります。このときの AMI はAmazon Linux 2023 AMI を使用してください。また、インスタンスが次の要件を満たしていることを確認してください。
- EC2 インスタンスがインターネットに接続されていて、インスタンスに SSHやEC2 Instance Connect、または AWS Systems Manger Session Manager を使用して接続できることを確認します。
CloudWatchAgentServerPolicy
とAWSXrayWriteOnlyAccess
Policy を使用してIAMロールを作成し、EC2インスタンスにアタッチします。CloudWatch エージェントで使用する IAM ロールとユーザーを作成するを参照してください。- サンプルアプリケーションへのアクセスに必要なクライアントのパブリック IP アドレスからの TCP 8080 経由のインバウンドトラフィックを許可するように EC2 セキュリティグループを設定します。
環境のセットアップ
EC2 インスタンスに接続し、以下のコマンドを実行して GitHub リポジトリをクローンし、必要な依存関係をセットアップおよびインストールします。TOMCAT_VER
と MAVEN_VER
の変数値は、利用可能な最新バージョンに更新してください。最新のバージョンについては、Apache Tomcat 10 ダウンロードページとApache Maven ダウンロードページをご確認ください。
上記のスクリプトを実行すると、以下をインストールし、Java の Web アプリケーション環境をセットアップできます。
- Apache Tomcat と Maven
- CloudWatch エージェントと ADOT Java 自動インストルメンテーションエージェント
- アプリケーションリポジトリから Spring PetClinic アプリケーションを WAR としてパッケージ化し、Tomcat の /webapps ディレクトリに移動
ソリューションウォークスルー
アカウントで Application Signals を有効化する
ステップ 1: アカウントで Application Signals を有効にするの指示に従ってください。
CloudWatch エージェントの設定
- EC2 インスタンスに接続し、以下のコマンドを実行して CloudWatch エージェントの設定ファイルを作成します。
- 以下の CloudWatch エージェント設定内容を、以前に作成したファイルにコピーして貼り付け、保存します。これにより、アプリケーションからメトリクス、ログ、トレースを送信するようにエージェントが設定されます。
- 以下のコマンドを実行して、前のステップで作成した設定ファイルで CloudWatch エージェントを起動します。
Spring PetClinic アプリケーションの監視設定と Tomcat サーバーの開始
- Tomcat の
bin
ディレクトリにsetenv.sh
という名前のファイルを作成します。このファイルにより、Tomcat サーバーの起動時に適用される環境変数を設定できます。 - 次の内容を
setenv.sh
ファイルに貼り付けて保存します。環境変数の説明
- Java エージェントを使用して Java アプリケーションサーバー上で動作するアプリケーションをインストルメントする場合、JVM 引数に
javaagent
パスを追加する必要があります - Tomcat サーバーでは、ADOT Java エージェントを保存したフォルダーの場所へのパスを
CATALINA_OPTS
環境変数の下に提供しています。詳しい情報は Opentelemetry のドキュメントを参照してください。 - (オプション)
OTEL_JAVAAGENT_DEBUG
環境変数をtrue
に設定すると、デバッグログを表示できます。これらのログはかなり冗長であることに注意してください。ここではfalse
に設定しました。 - 上記で使用した他のすべての環境変数は、Application Signals の追加情報用であり、詳細についてはApplication Signals のドキュメントに記載されています。
- Java エージェントを使用して Java アプリケーションサーバー上で動作するアプリケーションをインストルメントする場合、JVM 引数に
- 以下のコマンドを実行して Tomcat サーバーを起動します。
- Tomcat サーバーが起動したら、次の URL に移動してトラフィックを生成することで Spring PetClinic アプリケーションを調べることができます。
Spring PetClinic アプリケーションを Application Signals で可視化
CloudWatch コンソールに移動し、そこで左側のナビゲーションペインの Application Signals セクションにある サービス を選択してください。
CloudWatch Application Signals がアプリケーションの検出を開始するまでに 2 〜 3 分かかる場合があります。
サービスダッシュボード
図 2 に示すように、PetClinic サービスのオペレーションヘルスメトリクスと、Application Signals で有効になったサービスのリストがサービスページに表示されます。サービステーブルの下では、呼び出し数の多い順、障害の多い順、レイテンシー順で、上位のオペレーションと依存関係を確認できます。

図 2. サービスダッシュボード
サービス情報の詳細と依存関係
サービス詳細ページには、Application Signals が有効になっている単一サービスの Overview、オペレーション、依存関係、Synthetics canaries、クライアントページが表示されます。このページを表示するには、CloudWatch コンソールを開き、左側のナビゲーションペインの Application Signals セクション内にあるサービスを選択します。次に、サービス テーブル、Top Servicesテーブル、またはTop Dependency pathsテーブルから任意のサービス名を選択します。
図 3 に示すように、サービスのOverviewページではサービスを構成するコンポーネントが要約され、トラブルシューティングが必要な問題を特定するのに役立つキーパフォーマンスメトリクスが強調表示されています。

図 3. サービスの Overview
サービスオペレーションタブを選択すると、 サービスオペレーションテーブルと、選択したオペレーションのメトリクスのセットが表示されます。このテーブルには、Application Signals で検出したオペレーションのリストが含まれています。図 4 のように、このリストにはサービスレベル指標 (SLI) のステータス、依存関係の数、レイテンシー、トランザクションボリューム、エラー、および可用性のメトリクスが含まれています。

図 4. Service operations を表示
Application Signals はサービスのオペレーションメトリクスと AWS X-Ray トレースを関連付け、運用の健全性の問題の特定が容易にします。メトリクスグラフ上の任意の点を選択すると、選択した時点に関連するトレースを表示する診断ドロワーが開きます。関連付けられたトレーステーブルからトレース ID を選んで X-Ray トレース詳細 ページを開き、そのトレースの詳細を確認できます。

図 5. サービスオペレーションのメトリクスと相関関係のあるトレースを可視化
数クリックすると、関連するトレースが表示され、個々のトレースを手動で照合する必要なく、問題の根本原因が把握できます。
サービスレベル目標 (SLO)
Application Signals を使用して、重要なビジネスオペレーションのサービスにサービスレベル目標 (SLO) を設定できます。これらのサービスに対して SLO を設定することで、SLO ダッシュボードで SLO を追跡でき、最も重要なオペレーションを一目で把握できます。
SLO を作成する 手順に従って、PetClinic アプリケーションの SLO を作成してください。

図 6. サービスレベル目標 (SLO) を作成し可視化する
Tomcat アクセスログとサーバーログの可視化
Tomcat のアクセスログとサーバーログは、CloudWatch エージェントによって Log グループに送信されています。これらのログを参照するには、CloudWatch コンソール に移動し、ナビゲーションペインの ログ セクションにある ロググループ を選択します。図 7 に示すように、tomcat
プレフィックスを使用して ロググループをフィルタリングします。

図 7. Tomcat のアクセスログとサーバーログのロググループ

図 8. Tomcat アクセスログイベントの可視化
ここから、次の機能を試してTomcat ログから必要な情報を効率的に取り出すことができます。
- CloudWatch Logs Insights を使って、ログのクエリと分析を行う
メトリクスフィルターを使って、メトリクスを作成し、ログイベントを監視する
Live Tail を使って、リアルタイムでログを表示してデバッグする
クリーンアップ
今後料金が発生しないように、以下のリソースを削除してください:
- Amazon EC2 インスタンスを終了する
- 以下の CloudWatch ロググループを削除する
- Tomcat-Access-Logs
- Tomcat-Server-Logs
- /aws/appsignals/generic
結論
このブログでは、CloudWatch Application Signals (プレビュー) を使用して、Tomcat サーバー上で実行される WAR ファイルとしてパッケージ化された Java Web アプリケーションを自動的に計装する方法を学びました。Application Signals を利用すると、AWS 上のアプリケーションのパフォーマンスを簡単に把握し、異常を見つけ、アプリケーションの問題の根本原因をアプリケーションに手を加えずに特定することができます。
これらの分析結果を活用することで、チームは積極的にパフォーマンスのボトルネックを特定し、対処することができます。これにより、アプリケーションの信頼性とエンドユーザーの体験全体が向上します。ぜひ、Application Signals を環境に実装してください。
詳細については、CloudWatch Application Signals のドキュメントを参照するか、One Observability Workshop の CloudWatch Application Signals のユースケースを実際に手を動かして学習してみてください。
著者について
本記事は、Monitor Java apps running on Tomcat server with Amazon CloudWatch Application Signals (Preview) を翻訳したものです。翻訳はテクニカルアカウントマネージャーの日平が担当しました。