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 はサービスと依存関係を自動検出し、アプリケーションのトポロジーを視覚化してアプリケーションの状態を把握します。
前提条件
このブログの手順を追う場合は、パブリックサブネット内に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 ダウンロードページをご確認ください。
sudo yum install git -y
git clone https://github.com/aws-samples/amazon-cloudwatch-application-signals-java-tomcat-monitoring
cd amazon-cloudwatch-application-signals-java-tomcat-monitoring
sudo chmod +x get_requirements.sh
TOMCAT_VER=<provide latest tomcat version>
MAVEN_VER=<provide latest maven version>
sudo ./get_requirements.sh $TOMCAT_VER $MAVEN_VER
上記のスクリプトを実行すると、以下をインストールし、Java の Web アプリケーション環境をセットアップできます。
- Apache Tomcat と Maven
- CloudWatch エージェントと ADOT Java 自動インストルメンテーションエージェント
- アプリケーションリポジトリから Spring PetClinic アプリケーションを WAR としてパッケージ化し、Tomcat の /webapps ディレクトリに移動
ソリューションウォークスルー
アカウントで Application Signals を有効化する
ステップ 1: アカウントで Application Signals を有効にするの指示に従ってください。
CloudWatch エージェントの設定
- EC2 インスタンスに接続し、以下のコマンドを実行して CloudWatch エージェントの設定ファイルを作成します。
sudo nano /opt/aws/amazon-cloudwatch-agent/bin/app-signals-config.json
- 以下の CloudWatch エージェント設定内容を、以前に作成したファイルにコピーして貼り付け、保存します。これにより、アプリケーションからメトリクス、ログ、トレースを送信するようにエージェントが設定されます。
{ "traces": { "traces_collected": { "app_signals": {} } }, "logs": { "metrics_collected": { "app_signals": {} }, "logs_collected": { "files": { "collect_list": [ { "file_path": "/opt/tomcat/logs/**.log", "log_group_name": "Tomcat-Server-Logs", "retention_in_days": 1 }, { "file_path": "/opt/tomcat/logs/**.txt", "log_group_name": "Tomcat-Access-logs", "retention_in_days": 1 } ] } } } }
- 以下のコマンドを実行して、前のステップで作成した設定ファイルで CloudWatch エージェントを起動します。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/app-signals-config.json
Spring PetClinic アプリケーションの監視設定と Tomcat サーバーの開始
- Tomcat の
bin
ディレクトリにsetenv.sh
という名前のファイルを作成します。このファイルにより、Tomcat サーバーの起動時に適用される環境変数を設定できます。sudo nano /opt/tomcat/bin/setenv.sh
- 次の内容を
setenv.sh
ファイルに貼り付けて保存します。export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/aws/aws-opentelemetry-agent.jar" export OTEL_JAVAAGENT_DEBUG=false export OTEL_METRICS_EXPORTER=none export OTEL_SMP_ENABLED=true export OTEL_AWS_SMP_EXPORTER_ENDPOINT=http://localhost:4315 export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:4315 export OTEL_RESOURCE_ATTRIBUTES=aws.hostedin.environment=EC2,service.name=petclinic
環境変数の説明
- Java エージェントを使用して Java アプリケーションサーバー上で動作するアプリケーションをインストルメントする場合、JVM 引数に
javaagent
パスを追加する必要があります - Tomcat サーバーでは、ADOT Java エージェントを保存したフォルダーの場所へのパスを
CATALINA_OPTS
環境変数の下に提供しています。詳しい情報は Opentelemetry のドキュメントを参照してください。 - (オプション)
OTEL_JAVAAGENT_DEBUG
環境変数をtrue
に設定すると、デバッグログを表示できます。これらのログはかなり冗長であることに注意してください。ここではfalse
に設定しました。 - 上記で使用した他のすべての環境変数は、Application Signals の追加情報用であり、詳細についてはApplication Signals のドキュメントに記載されています。
- Java エージェントを使用して Java アプリケーションサーバー上で動作するアプリケーションをインストルメントする場合、JVM 引数に
- 以下のコマンドを実行して Tomcat サーバーを起動します。
sudo /opt/tomcat/bin/startup.sh
- Tomcat サーバーが起動したら、次の URL に移動してトラフィックを生成することで Spring PetClinic アプリケーションを調べることができます。
http://:8080/petclinic
Spring PetClinic アプリケーションを Application Signals で可視化
CloudWatch コンソールに移動し、そこで左側のナビゲーションペインの Application Signals セクションにある サービス を選択してください。
CloudWatch Application Signals がアプリケーションの検出を開始するまでに 2 〜 3 分かかる場合があります。
サービスダッシュボード
図 2 に示すように、PetClinic サービスのオペレーションヘルスメトリクスと、Application Signals で有効になったサービスのリストがサービスページに表示されます。サービステーブルの下では、呼び出し数の多い順、障害の多い順、レイテンシー順で、上位のオペレーションと依存関係を確認できます。
サービス情報の詳細と依存関係
サービス詳細ページには、Application Signals が有効になっている単一サービスの Overview、オペレーション、依存関係、Synthetics canaries、クライアントページが表示されます。このページを表示するには、CloudWatch コンソールを開き、左側のナビゲーションペインの Application Signals セクション内にあるサービスを選択します。次に、サービス テーブル、Top Servicesテーブル、またはTop Dependency pathsテーブルから任意のサービス名を選択します。
図 3 に示すように、サービスのOverviewページではサービスを構成するコンポーネントが要約され、トラブルシューティングが必要な問題を特定するのに役立つキーパフォーマンスメトリクスが強調表示されています。
サービスオペレーションタブを選択すると、 サービスオペレーションテーブルと、選択したオペレーションのメトリクスのセットが表示されます。このテーブルには、Application Signals で検出したオペレーションのリストが含まれています。図 4 のように、このリストにはサービスレベル指標 (SLI) のステータス、依存関係の数、レイテンシー、トランザクションボリューム、エラー、および可用性のメトリクスが含まれています。
Application Signals はサービスのオペレーションメトリクスと AWS X-Ray トレースを関連付け、運用の健全性の問題の特定が容易にします。メトリクスグラフ上の任意の点を選択すると、選択した時点に関連するトレースを表示する診断ドロワーが開きます。関連付けられたトレーステーブルからトレース ID を選んで X-Ray トレース詳細 ページを開き、そのトレースの詳細を確認できます。
数クリックすると、関連するトレースが表示され、個々のトレースを手動で照合する必要なく、問題の根本原因が把握できます。
サービスレベル目標 (SLO)
Application Signals を使用して、重要なビジネスオペレーションのサービスにサービスレベル目標 (SLO) を設定できます。これらのサービスに対して SLO を設定することで、SLO ダッシュボードで SLO を追跡でき、最も重要なオペレーションを一目で把握できます。
SLO を作成する 手順に従って、PetClinic アプリケーションの SLO を作成してください。
Tomcat アクセスログとサーバーログの可視化
Tomcat のアクセスログとサーバーログは、CloudWatch エージェントによって Log グループに送信されています。これらのログを参照するには、CloudWatch コンソール に移動し、ナビゲーションペインの ログ セクションにある ロググループ を選択します。図 7 に示すように、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) を翻訳したものです。翻訳はテクニカルアカウントマネージャーの日平が担当しました。