Spring Boot を使用して構築されたアプリケーションを監視するには、アプリケーションを Alibaba Cloud Managed Service for Prometheus に接続できます。このトピックでは、Spring Boot アプリケーションを Managed Service for Prometheus に接続する方法について説明します。
背景情報
Spring、Spring Web MVC、および MyBatis フレームワークを使用するアプリケーションを構築するには、多くの構成作業が必要です。構成エラーが簡単に発生する可能性があります。Spring Boot は、この問題を解決するために設計されています。Spring Boot の主な利点は自動構成です。Spring Boot は、JAR ファイルを使用してアプリケーションを自動的に構成できます。デフォルトの構成がビジネス要件を満たしていない場合は、自動的に構成されるクラスを変更できます。このようにして、カスタム構成を使用してエンタープライズクラスのアプリケーションを構築できます。
Spring Boot アプリケーションをビルドしてリリースした後、アプリケーションを監視できます。オールインワンで使いやすい監視システムは、次の主要な機能を提供します。
監視データ収集
監視データを収集する最も一般的な方法は、プッシュとプルです。データをプルする監視システムの例として、ますます普及している Prometheus に基づいて開発されたManaged Service for Prometheus があります。アプリケーションとインフラストラクチャの監視データは、OpenMetrics 標準を使用してManaged Service for Prometheus に公開されます。Managed Service for Prometheus はデータを定期的に収集し、長期間データを保存します。
OpenMetrics は、クラウドネイティブでスケーラビリティの高いメトリックプロトコルです。OpenMetrics は、クラウドネイティブメトリックを大規模に送信するための標準を指定し、テキスト表現プロトコルと Protocol Buffers の両方をサポートしています。テキスト表現プロトコルはより一般的に使用されます。デフォルトでは、Managed Service for Prometheus はデータをキャプチャするときにテキスト表現プロトコルを使用します。次の図は、OpenMetrics 形式のメトリックの例を示しています。
メトリックのデータモデルは、メトリック名とラベルと呼ばれる一連のキーと値のペアによって識別されます。同じメトリック名とラベルを持つデータサンプルは、同じ時系列に属します。たとえば、acme_http_router_request_seconds_sum{path="/api/v1",method="GET"} は、メトリック名が acme_http_router_request_seconds_sum であるデータサンプルを表します。データサンプルには、キーが method で値が GET のラベルがあります。データサンプルには、float64 値とミリ秒精度の UNIX タイムスタンプが含まれています。時間の経過とともに収集されたデータサンプルは、折れ線グラフで表示できます。
クラウドネイティブシステムのほとんどの基本コンポーネントは、OpenMetrics テキスト形式を使用してメトリックを公開できます。メトリックを公開できないコンポーネントの場合、オープンソースの Prometheus は開発者と運用エンジニア向けにさまざまな Prometheus エクスポーターを提供しています。これらのコンポーネントまたはエクスポーターは、Managed Service for Prometheus からリクエストを受信し、処理と分析のために監視データをManaged Service for Prometheus にエクスポートします。アプリケーション開発者の場合は、Managed Service for Prometheus の多言語 SDK を使用してアプリケーションをインストルメント化し、ビジネスメトリックを Managed Service for Prometheus と統合できます。
データの視覚化と分析
ステータス、リソース使用率、サービスステータスなどのアプリケーションまたはインフラストラクチャに関する情報を取得した後、さまざまなタイプの多次元情報をクエリおよび分析することで、ノードを追跡および比較できます。また、標準的で使いやすいダッシュボードを使用して、システムのステータスを確認することもできます。Grafana は、オープンソースコミュニティで人気のあるデータ視覚化ソリューションであり、幅広いチャートとテンプレートを提供します。Managed Service for Prometheus は、マネージド Grafana に基づいてデータクエリ、分析、および視覚化機能も提供します。
アラートと緊急対応
監視システムは、問題を引き起こす可能性のあるリスクを検出し、管理者にすぐに通知する必要があります。このようにして、問題とビジネスへの影響を防ぐことができます。問題が発生した後、管理者は問題を主張し、処理する必要があります。管理者は、さまざまな監視メトリックと履歴データに基づいて問題の根本原因を特定できます。
手順
Spring Boot アプリケーションの場合、Spring コミュニティはすぐに使える Spring Boot Actuator を提供しています。Spring Boot Actuator を使用すると、開発者は効率的な方法でアプリケーションをインストルメント化し、監視データの収集とエクスポートを容易にすることができます。Spring Boot 2.0 以降、Spring Boot Actuator は Micrometer を使用し、より強力で柔軟な監視機能を提供します。Micrometer は監視ファサードであり、監視用の Simple Logging Facade for Java (SLF4J) と見なすことができます。Micrometer を使用して、AppOptics、Datadog、Elastic、InfluxDB、Managed Service for Prometheus などのさまざまな監視システムにアプリケーションを接続できます。
Micrometer を使用すると、Java アプリケーションのメトリックをManaged Service for Prometheus にマッピングできます。次の表は、マッピングについて説明しています。
Micrometer メトリックタイプ | Managed Service for Prometheus メトリックタイプ | シナリオ |
Counter | Counter | 値が単調に増加する変数を監視するために使用されます。例:ページビュー(PV)、ユニークビジター(PV)、API 呼び出しの数。 |
Gauge | Gauge | 値が変動する変数を監視するために使用されます。例:リソース使用率、システム負荷、リクエストキューの長さ。 |
Timer | Histogram | データ分布統計を提供するために使用されます。たとえば、このメトリックタイプを使用して、API 呼び出しの 50 パーセンタイル、90 パーセンタイル、99 パーセンタイルのレイテンシを提供できます。 |
DistributionSummary | Summary | Histogram メトリックタイプと同様の方法でデータ分布統計を提供するために使用されます。 |
Micrometer の Counter メトリックタイプは、Managed Service for Prometheus の Counter メトリックタイプにマッピングされます。このメトリックタイプは、値が単調に増加する変数を監視するために使用されます。たとえば、このメトリックタイプを使用して、API へのアクセス数、キャッシュヒット数、またはアクセス数の合計を監視できます。Timer メトリックタイプは、Counter メトリックタイプによって提供される情報を提供します。たとえば、各 API の応答時間に関するデータを収集するために使用される Timer タイプのメトリックは、アクセス数に関するデータも収集します。API に対して両方のタイプのメトリックを構成する必要はありません。
Micrometer の Gauge メトリックタイプは、Managed Service for Prometheus の Gauge メトリックタイプにマッピングされます。このメトリックタイプは、値の範囲内で値が継続的に変動する変数を監視するために使用されます。たとえば、このメトリックタイプを使用して、CPU 使用率またはスレッドプール内のタスクキューの数を監視できます。
Micrometer の Timer メトリックタイプは、Managed Service for Prometheus の Histogram メトリックタイプにマッピングされます。Timer メトリックタイプは、API の応答時間の分布など、時間関連データの分布統計を提供するために使用されます。
Micrometer の DistributionSummary メトリックタイプは、Managed Service for Prometheus の Summary メトリックタイプにマッピングされます。Histogram メトリックタイプと同様に、Summary メトリックタイプもデータ分布統計を提供するために使用されます。ただし、データ分布統計はクライアントによって計算され、Managed Service for Prometheus に保存されます。したがって、複数のマシンによって提供された結果を集計することはできず、データ分布の概要を提供することはできません。
手順
Spring Boot アプリケーションをManaged Service for Prometheus に接続するには、アプリケーションをインストルメント化し、Kubernetes クラスターにアプリケーションをデプロイし、サービスディスカバリを構成します。
まず、Spring Boot Actuator の Maven 依存関係をコードに追加し、監視するデータを登録するか、Controller のメソッドにアノテーションを付ける必要があります。
次に、インストルメント化されたアプリケーションを Kubernetes クラスターにデプロイし、Managed Service for Prometheus にエンドポイントを公開する必要があります。Managed Service for Prometheus のサービスディスカバリ機能は、エンドポイントから監視データをプルします。Managed Service for Prometheus では、カスタムリソース定義(CRD)に基づいて ServiceMonitor を作成することで、サービスディスカバリを構成できます。
アプリケーションのエンドポイントがManaged Service for Prometheus によって検出された後、Grafana でデータソースとダッシュボードを構成できます。主要なメトリックのアラートルールを構成することもできます。主要なメトリックのアラートルールを構成することもできます。
目的
Kubernetes クラスター内の Spring Boot アプリケーションをManaged Service for Prometheus に接続して、次の目的を達成できます。
システムのフロントエンドを監視する:Spring Web MVC を使用して構築されたアプリケーションはフロントエンドサービスを提供し、アプリケーションのレート、エラー、および期間(RED)メトリックが監視されます。レートは、リクエストが処理されるレートを指します。エラーは、失敗したリクエストの数を指します。期間は、各リクエストにかかる時間を指します。
バックエンドサービスのクリティカルパス内のオブジェクトを監視します。たとえば、スレッドプール内のキューの数、または Guava Cache のキャッシュヒット率を監視できます。
ビジネスにとって重要なカスタムメトリックを監視します。例:API の UV。
Java 仮想マシンのガベージコレクションタスクとメモリ使用量を監視します。
上記のメトリックを集計して表示し、主要なメトリックのアラートルールを構成します。
ステップ 1:Spring Boot Actuator の依存関係を追加し、初期構成を実行する
この例では、Spring Boot と Spring Cloud Alibaba を使用して構築されたクラウドネイティブマイクロサービスアプリケーションを使用して、Kubernetes クラスター内の Spring Boot アプリケーションを Managed Service for Prometheus に接続する方法について説明します。
次のコードを実行して、Spring Boot Actuator の依存関係を追加します。
<!-- Spring Boot Actuator 依存関係 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- Managed Service for Prometheus 依存関係 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
application.properties ファイルに次の構成を追加して、監視データをエクスポートするために使用するポートを公開します。たとえば、ポートを 8091 に設定します。
# メトリックを公開するには、application.properties ファイルに次の構成を追加します。 spring.application.name=frontend management.server.port=8091 management.endpoints.web.exposure.include=* management.metrics.tags.application=${spring.application.name}
構成が完了すると、Managed Service for Prometheus はアプリケーションのポート 8091 にアクセスできます。その後、Managed Service for Prometheus は /actuator/prometheus パスから OpenMetrics 形式の監視データを取得できます。
ステップ 2:アプリケーションをインストルメント化して変更する
API の RED メトリックを取得するには、API のメソッドに @Timed アノテーションを追加します。次のコードは、インデックスページの API に @Timed アノテーションを追加する方法を示しています。
@Timed(value = "main_page_request_duration", description = "メインページを返すのにかかった時間", histogram = true)
@ApiOperation(value = "メインページ", tags = {"メインページ"})
@GetMapping("/")
public String index(Model model) {
model.addAttribute("products", productDAO.getProductList());
model.addAttribute("FRONTEND_APP_NAME", Application.APP_NAME);
model.addAttribute("FRONTEND_SERVICE_TAG", Application.SERVICE_TAG);
model.addAttribute("FRONTEND_IP", registration.getHost());
model.addAttribute("PRODUCT_APP_NAME", PRODUCT_APP_NAME);
model.addAttribute("PRODUCT_SERVICE_TAG", PRODUCT_SERVICE_TAG);
model.addAttribute("PRODUCT_IP", PRODUCT_IP);
model.addAttribute("new_version", StringUtils.isBlank(env));
return "index.html";
}
上記のコードでは、value は /actuator/prometheus に公開されるメトリックの名前を示します。histogram=true は、メトリックが Histogram タイプであり、各リクエストにかかる時間を監視するために使用されることを示します。このメトリックを使用すると、リクエストにかかる時間の 90 パーセンタイルと 99 パーセンタイルを計算できます。
アプリケーションでインプロセスキャッシュライブラリ(たとえば、Guava Cache ライブラリ)を使用していて、インプロセスキャッシュの正常性を監視する場合は、Micrometer によって提供される変更メソッドを使用して監視する主要オブジェクトをカプセル化できます。
Guava Cache を変更する
MeterRegistry を挿入します。この例では、PrometheusMeterRegistry は Spring Boot によって自動的に挿入されます。
ユーティリティクラス API を使用して、ローカルキャッシュをカプセル化します。この例では、GuavaCacheMetrics.monitor が使用されます。
.recordStats() メソッドを使用して、データレコードのキャッシュを有効にします。
キャッシュの名前を指定します。この名前は、生成されるメトリックで使用されます。
スレッドプールを変更する
MeterRegistry を挿入します。この例では、PrometheusMeterRegistry は Spring Boot によって自動的に挿入されます。
ユーティリティクラス API を使用して、スレッドプールをカプセル化します。
スレッドプールの名前を指定します。この名前は、生成されるメトリックで使用されます。
開発プロセスでは、ビジネスにとって重要な多くのカスタムメトリックを監視する必要があります。これらのメトリックを監視するには、MeterRegistry を Bean に挿入し、ビジネス要件とシナリオに基づいて Counter、Gauge、または Timer タイプのメトリックを構成します。次に、これらのメトリックを MeterRegistry に登録して、メトリックを公開します。次のコードは例を示しています。
@Service
public class DemoService {
Counter visitCounter;
public DemoService(MeterRegistry registry) {
visitCounter = Counter.builder("visit_counter")
.description("サイトへのアクセス数") // 翻訳済み
.register(registry);
}
public String visit() {
visitCounter.increment();
return "Hello World!";
}
}
上記の手順を完了した後、アプリケーションコードが変更されます。次に、Managed Service for Prometheus が有効になっている Kubernetes クラスターにアプリケーションイメージを再構築してデプロイし、Managed Service for Prometheus コンソールで ServiceMonitor を構成して、アプリケーションに対応する Service を検出する必要があります。詳細については、ACK クラスターを監視するための Prometheus インスタンスの作成 および ACK サービスディスカバリ を参照してください。
ServiceMonitor を構成した後、[ターゲット] タブの [サービスディスカバリ] ページで新しく登録された Service を表示できます。
ステップ 3:ダッシュボードを構成する
アプリケーションの監視データがManaged Service for Prometheus に収集および保存された後、監視データのダッシュボードとアラートルールを構成できます。Grafana コミュニティによって提供される次の 2 つのオープンソースダッシュボードテンプレートがあります。これらのテンプレートを使用して、ビジネス用のカスタムダッシュボードを作成できます。
上記のテンプレートとManaged Service for Prometheus によって提供される Grafana サービスを使用して、Grafana ダッシュボードに主要なメトリックを表示できます。これは、開発と運用を容易にするのに役立ちます。毎日の監視用のカスタムダッシュボードを作成することもできます。次の図は、上記のテンプレートとビジネス要件に基づいて構築されたダッシュボードを示しています。ダッシュボードは、コンポーネントの実行期間、メモリ使用量、ヒープメモリ使用量と非ヒープメモリ使用量、およびさまざまな世代に関するガベージコレクションデータなどの概要とメトリックを提供します。