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 のServerAccessログを送信するようエージェントを構成して、アプリケーションの監視可能性を高めます。
  • Application Signals はサービスと依存関係を自動検出し、アプリケーションのトポロジーを視覚化してアプリケーションの状態を把握します。

    図 1. ソリューションアーキテクチャ

    図 1. ソリューションアーキテクチャ

前提条件

このブログの手順を追う場合は、パブリックサブネット内にAmazon EC2 インスタンスを既に設定済みである必要があります。このときの AMI はAmazon Linux 2023 AMI を使用してください。また、インスタンスが次の要件を満たしていることを確認してください。

  1. EC2 インスタンスがインターネットに接続されていて、インスタンスに SSHやEC2 Instance Connect、または AWS Systems Manger Session Manager を使用して接続できることを確認します。
  2. CloudWatchAgentServerPolicyAWSXrayWriteOnlyAccess Policy を使用してIAMロールを作成し、EC2インスタンスにアタッチします。CloudWatch エージェントで使用する IAM ロールとユーザーを作成するを参照してください。
  3. サンプルアプリケーションへのアクセスに必要なクライアントのパブリック IP アドレスからの TCP 8080 経由のインバウンドトラフィックを許可するように EC2 セキュリティグループを設定します。

環境のセットアップ

EC2 インスタンスに接続し、以下のコマンドを実行して GitHub リポジトリをクローンし、必要な依存関係をセットアップおよびインストールします。TOMCAT_VERMAVEN_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 エージェントの設定

  1. EC2 インスタンスに接続し、以下のコマンドを実行して CloudWatch エージェントの設定ファイルを作成します。
    sudo nano /opt/aws/amazon-cloudwatch-agent/bin/app-signals-config.json
  2. 以下の 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 
                    } ] 
                }
            }
        }
    }
  3. 以下のコマンドを実行して、前のステップで作成した設定ファイルで 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 サーバーの開始

  1. Tomcat の bin ディレクトリに setenv.sh という名前のファイルを作成します。このファイルにより、Tomcat サーバーの起動時に適用される環境変数を設定できます。
    sudo nano /opt/tomcat/bin/setenv.sh
  2. 次の内容を 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 のドキュメントに記載されています。
  3. 以下のコマンドを実行して Tomcat サーバーを起動します。
    sudo /opt/tomcat/bin/startup.sh
  4. Tomcat サーバーが起動したら、次の URL に移動してトラフィックを生成することで Spring PetClinic アプリケーションを調べることができます。
    http://:8080/petclinic

Spring PetClinic アプリケーションを Application Signals で可視化

CloudWatch コンソールに移動し、そこで左側のナビゲーションペインの Application Signals セクションにある サービス を選択してください。
CloudWatch Application Signals がアプリケーションの検出を開始するまでに 2 〜 3 分かかる場合があります。

サービスダッシュボード

図 2 に示すように、PetClinic サービスのオペレーションヘルスメトリクスと、Application Signals で有効になったサービスのリストがサービスページに表示されます。サービステーブルの下では、呼び出し数の多い順、障害の多い順、レイテンシー順で、上位のオペレーションと依存関係を確認できます。

図 2. サービスダッシュボード

図 2. サービスダッシュボード

サービス情報の詳細と依存関係

サービス詳細ページには、Application Signals が有効になっている単一サービスの Overview、オペレーション、依存関係、Synthetics canaries、クライアントページが表示されます。このページを表示するには、CloudWatch コンソールを開き、左側のナビゲーションペインの Application Signals セクション内にあるサービスを選択します。次に、サービス テーブル、Top Servicesテーブル、またはTop Dependency pathsテーブルから任意のサービス名を選択します。

図 3 に示すように、サービスのOverviewページではサービスを構成するコンポーネントが要約され、トラブルシューティングが必要な問題を特定するのに役立つキーパフォーマンスメトリクスが強調表示されています。

図 3. サービスの Overview

図 3. サービスの Overview

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

図 4. Service operations を表示

図 4. Service operations を表示

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

図 5. サービスオペレーションのメトリクスと相関関係のあるトレースを可視化

図 5. サービスオペレーションのメトリクスと相関関係のあるトレースを可視化

数クリックすると、関連するトレースが表示され、個々のトレースを手動で照合する必要なく、問題の根本原因が把握できます。

サービスレベル目標 (SLO)

Application Signals を使用して、重要なビジネスオペレーションのサービスにサービスレベル目標 (SLO) を設定できます。これらのサービスに対して SLO を設定することで、SLO ダッシュボードで SLO を追跡でき、最も重要なオペレーションを一目で把握できます。

SLO を作成する 手順に従って、PetClinic アプリケーションの SLO を作成してください。

図 6. サービスレベル目標 (SLO) を作成し可視化する

図 6. サービスレベル目標 (SLO) を作成し可視化する

Tomcat アクセスログとサーバーログの可視化

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

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

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

図 8. Tomcat アクセスログイベントの可視化

図 8. Tomcat アクセスログイベントの可視化

ここから、次の機能を試してTomcat ログから必要な情報を効率的に取り出すことができます。

  • CloudWatch Logs Insights を使って、ログのクエリと分析を行う
    メトリクスフィルターを使って、メトリクスを作成し、ログイベントを監視する
    Live Tail を使って、リアルタイムでログを表示してデバッグする

クリーンアップ

今後料金が発生しないように、以下のリソースを削除してください:

結論

このブログでは、CloudWatch Application Signals (プレビュー) を使用して、Tomcat サーバー上で実行される WAR ファイルとしてパッケージ化された Java Web アプリケーションを自動的に計装する方法を学びました。Application Signals を利用すると、AWS 上のアプリケーションのパフォーマンスを簡単に把握し、異常を見つけ、アプリケーションの問題の根本原因をアプリケーションに手を加えずに特定することができます。

これらの分析結果を活用することで、チームは積極的にパフォーマンスのボトルネックを特定し、対処することができます。これにより、アプリケーションの信頼性とエンドユーザーの体験全体が向上します。ぜひ、Application Signals を環境に実装してください。

詳細については、CloudWatch Application Signals のドキュメントを参照するか、One Observability WorkshopCloudWatch Application Signals のユースケースを実際に手を動かして学習してみてください。

著者について

Deep Chhaiya

Deep は Amazon Web Services のCloud Support Engineerで、Amazon CloudWatch と Amazon Elastic Load Balancing に特化しています。顧客のシステムを最適化し、スムーズな運用と効率的なトラブルシューティングを行うことを楽しんでいます。余暇時間には新しい技術について学ぶことを楽しんでいます。 LinkedIn: /deep-chhaiya

Jay Joshi

Jay は AWS の Sr. Cloud Support Engineer で、Amazon CloudWatch と Route 53 に特化しています。モニタリングとオブザーバビリティを活用して顧客のシステムを強化することに情熱を注いでいます。余暇時間には、アニメを見たり家族と過ごすことを楽しんでいます。LinkedIn: /jayjoshi31

本記事は、Monitor Java apps running on Tomcat server with Amazon CloudWatch Application Signals (Preview) を翻訳したものです。翻訳はテクニカルアカウントマネージャーの日平が担当しました。