Spring Boot には、アプリケーションを本番環境にプッシュするときにアプリケーションを監視および管理するのに役立つ多くの追加機能が含まれています。HTTP エンドポイントまたは JMX を使用して、アプリケーションを管理および監視することを選択できます。監査、ヘルス、メトリクスの収集もアプリケーションに自動的に適用できます。
1. 本番対応機能を有効にする
spring-boot-actuator [GitHub] (英語) モジュールは、Spring Boot のすべての本番対応機能を提供します。機能を有効にする最も簡単な方法は、spring-boot-starter-actuator 「スターター」に依存関係を追加することです。
Maven ベースのプロジェクトにアクチュエーターを追加するには、次の「スターター」依存関係を追加します。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>Gradle の場合、次の宣言を使用します。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}2. エンドポイント
アクチュエーターエンドポイントを使用すると、アプリケーションを監視および操作できます。Spring Boot には多数のエンドポイントが組み込まれており、独自のエンドポイントを追加できます。例: health エンドポイントは、基本的なアプリケーション正常性情報を提供します。
個々のエンドポイントは HTTP または JMX 経由で公開(リモートアクセス可能)で有効または無効にできます。エンドポイントが有効で公開されている場合、エンドポイントは使用可能であると見なされます。組み込みのエンドポイントは、使用可能な場合にのみ自動構成されます。ほとんどのアプリケーションは HTTP を介して公開を選択します。エンドポイントの ID と /actuator のプレフィックスが URL にマップされます。例: デフォルトでは、health エンドポイントは /actuator/health にマップされます。
次のテクノロジーに依存しないエンドポイントが利用可能です。
| ID | 説明 |
|---|---|
| 現在のアプリケーションの監査イベント情報を公開します。 |
| アプリケーション内のすべての Spring Bean の完全なリストを表示します。 |
| 利用可能なキャッシュを公開します。 |
| 構成クラスおよび自動構成クラスで評価された条件と、それらが一致したまたは一致しなかった理由を示します。 |
| すべての |
| Spring の |
| 適用された Flyway データベースの移行を表示します。1 つ以上の |
| アプリケーションの正常性情報を表示します。 |
| HTTP トレース情報(デフォルトでは、最後の 100 の HTTP リクエスト / レスポンス交換)を表示します。 |
| 任意のアプリケーション情報を表示します。 |
| Spring Integration グラフを表示します。 |
| アプリケーションのロガーの構成を表示および変更します。 |
| 適用された Liquibase データベースの移行を表示します。1 つ以上の |
| 現在のアプリケーションの「メトリクス」情報を表示します。 |
| すべての |
| アプリケーションのスケジュールされたタスクを表示します。 |
| Spring Session-backed セッションストアからのユーザーセッションの取得と削除を許可します。Spring Session を使用したサーブレットベースの Web アプリケーションが必要です。 |
| アプリケーションを正常にシャットダウンします。デフォルトでは無効になっています。 |
| スレッドダンプを実行します。 |
アプリケーションが Web アプリケーション (Spring MVC、Spring WebFlux、または Jersey) の場合、次の追加のエンドポイントを使用できます。
| ID | 説明 |
|---|---|
|
|
| HTTP 経由で JMX Bean を公開します(Jolokia がクラスパス上にある場合、WebFlux では使用できません)。 |
| ログファイルの内容を返します( |
| Prometheus サーバーによってスクレイピング可能な形式でメトリクスを公開します。 |
2.1. エンドポイントを有効にする
デフォルトでは、shutdown を除くすべてのエンドポイントが有効になっています。エンドポイントの有効化を構成するには、management.endpoint.<id>.enabled プロパティを使用します。次の例では、shutdown エンドポイントを有効にします。
management.endpoint.shutdown.enabled=true エンドポイントの有効化をオプトアウトではなくオプトインにしたい場合は、management.endpoints.enabled-by-default プロパティを false に設定し、個々のエンドポイント enabled プロパティを使用してオプトインします。次の例では、info エンドポイントを有効にし、他のすべてのエンドポイントを無効にします。
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true 無効なエンドポイントは、アプリケーションコンテキストから完全に削除されます。エンドポイントが公開されているテクノロジーのみを変更する場合は、代わりに include および exclude プロパティを使用してください。 |
2.2. エンドポイントの公開
エンドポイントには機密情報が含まれている場合があるため、エンドポイントを公開するタイミングについて慎重に検討する必要があります。次の表は、組み込みのエンドポイントのデフォルトの露出を示しています。
| ID | JMX | Web |
|---|---|---|
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | はい |
| なし | いいえ |
| はい | いいえ |
| はい | はい |
| はい | いいえ |
| なし | いいえ |
| なし | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| なし | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
| はい | いいえ |
公開するエンドポイントを変更するには、次のテクノロジー固有の include および exclude プロパティを使用します。
| プロパティ | デフォルト |
|---|---|
| |
|
|
| |
|
|
include プロパティは、公開されているエンドポイントの ID をリストします。exclude プロパティは、公開されるべきではないエンドポイントの ID をリストします。exclude プロパティは、include プロパティよりも優先されます。include プロパティと exclude プロパティの両方に、エンドポイント ID のリストを設定できます。
例: JMX を介したすべてのエンドポイントの公開を停止し、health および info エンドポイントのみを公開するには、次のプロパティを使用します。
management.endpoints.jmx.exposure.include=health,info* を使用して、すべてのエンドポイントを選択できます。例: env および beans エンドポイント以外のすべてを HTTP で公開するには、次のプロパティを使用します。
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
|
| アプリケーションが公開されている場合は、エンドポイントも保護することを強くお勧めします。 |
エンドポイントが公開されるタイミングについて独自の戦略を実装する場合は、EndpointFilter Bean を登録できます。 |
2.3. HTTP エンドポイントの保護
他の機密 URL と同じ方法で、HTTP エンドポイントの保護に注意する必要があります。Spring Security が存在する場合、エンドポイントは Spring Security のコンテンツネゴシエーション戦略を使用してデフォルトで保護されます。HTTP エンドポイントにカスタムセキュリティを設定する場合、たとえば特定のロールを持つユーザーのみにアクセスを許可する場合、Spring Boot は Spring Security と組み合わせて使用できる便利な RequestMatcher オブジェクトを提供します。
典型的な Spring Security 構成は、次の例のようになります。
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
}
} 上記の例では、EndpointRequest.toAnyEndpoint() を使用してリクエストを任意のエンドポイントに一致させ、すべてが ENDPOINT_ADMIN のロールを持つようにします。EndpointRequest では、他のいくつかのマッチャーメソッドも利用できます。詳細については、API ドキュメント(HTML または PDF (英語) )を参照してください。
ファイアウォールの背後にアプリケーションをデプロイする場合、認証を必要とせずにすべてのアクチュエーターエンドポイントにアクセスできるようにすることができます。これを行うには、次のように management.endpoints.web.exposure.include プロパティを変更します。
management.endpoints.web.exposure.include=*さらに、Spring Security が存在する場合、次の例に示すように、エンドポイントへの認証されていないアクセスを許可するカスタムセキュリティ構成を追加する必要があります。
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().permitAll());
}
}2.4. エンドポイントの構成
エンドポイントは、パラメーターを取らない読み取り操作に対するレスポンスを自動的にキャッシュします。エンドポイントがレスポンスをキャッシュする時間を設定するには、cache.time-to-live プロパティを使用します。次の例では、beans エンドポイントのキャッシュの有効期間を 10 秒に設定します。
management.endpoint.beans.cache.time-to-live=10s プレフィックス management.endpoint.<name> は、構成されているエンドポイントを一意に識別するために使用されます。 |
2.5. アクチュエーター Web エンドポイント用のハイパーメディア
すべてのエンドポイントへのリンクを含む「検出ページ」が追加されます。「ディスカバリページ」は、デフォルトで /actuator で利用可能です。
カスタム管理コンテキストパスが設定されると、「ディスカバリページ」が /actuator から管理コンテキストのルートに自動的に移動します。例: 管理コンテキストパスが /management の場合、ディスカバリページは /management から利用できます。管理コンテキストパスが / に設定されている場合、検出ページは無効になり、他のマッピングとの衝突の可能性を防ぎます。
2.6. CORS サポート
クロスオリジンリソース共有 [Mozilla] (CORS) は、認可されるクロスドメインリクエストの種類を柔軟に指定できる W3C 仕様 (英語) です。Spring MVC または Spring WebFlux を使用する場合、アクチュエーターの Web エンドポイントは、そのようなシナリオをサポートするように構成できます。
CORS サポートはデフォルトで無効になっており、management.endpoints.web.cors.allowed-origins プロパティが設定されると有効になります。次の構成では、example.com ドメインからの GET および POST 呼び出しが許可されます。
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST| オプションの完全なリストについては、CorsEndpointProperties [GitHub] (英語) を参照してください。 |
2.7. カスタムエンドポイントの実装
@Endpoint でアノテーションが付けられた @Bean を追加すると、@ReadOperation、@WriteOperation、または @DeleteOperation でアノテーションが付けられたメソッドが JMX 上で自動的に公開され、Web アプリケーションでは HTTP 上でも公開されます。エンドポイントは、Jersey、Spring MVC、または Spring WebFlux を使用して HTTP 経由で公開できます。Jersey と Spring MVC の両方が使用可能な場合は、Spring MVC が使用されます。
@JmxEndpoint または @WebEndpoint を使用して、テクノロジー固有のエンドポイントを作成することもできます。これらのエンドポイントは、それぞれのテクノロジーに制限されています。例: @WebEndpoint は HTTP でのみ公開され、JMX では公開されません。
@EndpointWebExtension および @EndpointJmxExtension を使用して、テクノロジー固有の拡張機能を作成できます。これらのアノテーションにより、既存のエンドポイントを強化するためのテクノロジー固有の操作を提供できます。
最後に、Web フレームワーク固有の機能へのアクセスが必要な場合は、サーブレットまたは Spring @Controller および @RestController エンドポイントを実装できますが、それらのエンドポイントは JMX 経由では利用できないか、別の Web フレームワークを使用します。
2.7.1. 入力を受け取る
エンドポイントでの操作は、パラメーターを介して入力を受け取ります。Web 経由で公開される場合、これらのパラメーターの値は URL のクエリパラメーターと JSON リクエスト本文から取得されます。JMX を介して公開される場合、パラメーターは MBean の操作のパラメーターにマップされます。パラメーターはデフォルトで必須です。@org.springframework.lang.Nullable でアノテーションを付けることにより、オプションにすることができます。
JSON リクエスト本文の各ルートプロパティは、エンドポイントのパラメーターにマップできます。次の JSON リクエスト本文を検討してください。
{
"name": "test",
"counter": 42
} これを使用して、String name および int counter パラメーターを取る書き込み操作を呼び出すことができます。
エンドポイントはテクノロジーに依存しないため、メソッドシグネチャーで指定できるのは単純な型のみです。特に、name および counter プロパティを定義するカスタム型で単一のパラメーターを宣言することはサポートされていません。 |
入力を操作メソッドのパラメーターにマップするには、エンドポイントを実装する Java コードを -parameters でコンパイルし、エンドポイントを実装する Kotlin コードを -java-parameters でコンパイルする必要があります。Spring Boot の Gradle プラグインを使用している場合、または Maven と spring-boot-starter-parent を使用している場合、これは自動的に行われます。 |
2.7.2. カスタム Web エンドポイント
@Endpoint、@WebEndpoint、または @EndpointWebExtension の操作は、Jersey、Spring MVC、または Spring WebFlux を使用して HTTP 経由で自動的に公開されます。Jersey と Spring MVC の両方が使用可能な場合は、Spring MVC が使用されます。
パス
述語のパスは、エンドポイントの ID と Web に公開されたエンドポイントのベースパスによって決定されます。デフォルトのベースパスは /actuator です。例: ID sessions のエンドポイントは、述語のパスとして /actuator/sessions を使用します。
@Selector を使用して操作メソッドの 1 つ以上のパラメーターにアノテーションを付けることにより、パスをさらにカスタマイズできます。そのようなパラメーターは、パス変数としてパス述語に追加されます。エンドポイント操作が呼び出されると、変数の値が操作メソッドに渡されます。残りのすべてのパス要素をキャプチャーする場合は、@Selector(Match=ALL_REMAINING) を最後のパラメーターに追加し、String[] と互換性のある変換型にすることができます。
HTTP メソッド
次の表に示すように、述語の HTTP メソッドは操作型によって決定されます。
| 操作 | HTTP メソッド |
|---|---|
|
|
|
|
|
|
消費する
リクエスト本体を使用する @WriteOperation (HTTP POST)の場合、述語の消費節は application/vnd.spring-boot.actuator.v2+json, application/json です。他のすべての操作では、consumes 句は空です。
生産する
述語の produces 節は、@DeleteOperation、@ReadOperation、@WriteOperation アノテーションの produces 属性によって判別できます。この属性はオプションです。使用しない場合、produces 句は自動的に決定されます。
操作メソッドが void または Void を返す場合、produces 句は空です。操作メソッドが org.springframework.core.io.Resource を返す場合、produces 句は application/octet-stream です。他のすべての操作の場合、produces 句は application/vnd.spring-boot.actuator.v2+json, application/json です。
Web エンドポイントレスポンスステータス
エンドポイント操作のデフォルトのレスポンスステータスは、操作の種類(読み取り、書き込み、削除)と、操作が返すもの(ある場合)によって異なります。
@ReadOperation は値を返し、レスポンスステータスは 200(OK)になります。値を返さない場合、レスポンスステータスは 404(見つかりません)になります。
@WriteOperation または @DeleteOperation が値を返す場合、レスポンスステータスは 200(OK)になります。値を返さない場合、レスポンスステータスは 204(コンテンツなし)になります。
必要なパラメーターなしで、または必要な型に変換できないパラメーターで操作が呼び出された場合、操作メソッドは呼び出されず、レスポンスステータスは 400(不良リクエスト)になります。
2.7.3. サーブレットのエンドポイント
Supplier<EndpointServlet> も実装する @ServletEndpoint アノテーションが付けられたクラスを実装することにより、Servlet をエンドポイントとして公開できます。サーブレットエンドポイントは、サーブレットコンテナーとのより深い統合を提供しますが、移植性を犠牲にします。これらは、既存の Servlet をエンドポイントとして公開するために使用することを目的としています。新しいエンドポイントの場合、可能な限り @Endpoint および @WebEndpoint アノテーションを優先する必要があります。
2.7.4. コントローラーのエンドポイント
@ControllerEndpoint および @RestControllerEndpoint を使用して、Spring MVC または Spring WebFlux によってのみ公開されるエンドポイントを実装できます。メソッドは、Spring MVC および Spring WebFlux の標準アノテーション ( @RequestMapping および @GetMapping など) を使用してマップされ、エンドポイントの ID がパスのプレフィックスとして使用されます。コントローラーエンドポイントは、Spring の Web フレームワークとのより深い統合を提供しますが、移植性が犠牲になります。可能な限り、@Endpoint および @WebEndpoint アノテーションを優先する必要があります。
2.8. ヘルス情報
ヘルス情報を使用して、実行中のアプリケーションのステータスを確認できます。多くの場合、本番システムがダウンしたときに誰かを警告するために、監視ソフトウェアによって使用されます。health エンドポイントによって公開される情報は、management.endpoint.health.show-details および management.endpoint.health.show-components プロパティに依存します。これらのプロパティは、次のいずれかの値で構成できます。
| 名前 | 説明 |
|---|---|
| 詳細は表示されません。 |
| 詳細は承認されたユーザーにのみ表示されます。 |
| 詳細はすべてのユーザーに表示されます。 |
デフォルト値は never です。ユーザーは、エンドポイントの 1 つ以上のロールにいるときに承認されていると見なされます。エンドポイントにロールが構成されていない場合(デフォルト)、認証されたすべてのユーザーが承認されたと見なされます。ロールは、management.endpoint.health.roles プロパティを使用して構成できます。
アプリケーションを保護し、always を使用する場合は、セキュリティ構成で、認証済みユーザーと非認証ユーザーの両方のヘルスエンドポイントへのアクセスを許可する必要があります。 |
ヘルス情報は、HealthContributorRegistry [GitHub] (英語) のコンテンツ(デフォルトでは、ApplicationContext で定義されているすべての HealthContributor [GitHub] (英語) インスタンス)から収集されます。Spring Boot には多数の自動構成 HealthContributors が含まれており、独自に作成することもできます。
HealthContributor は、HealthIndicator または CompositeHealthContributor のいずれかです。HealthIndicator は、Status を含む実際のヘルス情報を提供します。CompositeHealthContributor は、他の HealthContributors の複合を提供します。総合すると、コントリビューターはツリー構造を形成して、システム全体の健全性を表します。
デフォルトでは、最終的なシステムヘルスは、StatusAggregator によって導き出されます。StatusAggregator は、ステータスの順序付きリストに基づいて、各 HealthIndicator からステータスをソートします。ソートされたリストの最初のステータスは、全体的なヘルスステータスとして使用されます。HealthIndicator が StatusAggregator が認識しているステータスを返さない場合、UNKNOWN ステータスが使用されます。
HealthContributorRegistry を使用して、実行時にヘルスインジケータを登録および登録解除できます。 |
2.8.1. 自動構成された HealthIndicators
以下の HealthIndicators は、必要に応じて Spring Boot によって自動構成されます。
| 名前 | 説明 |
|---|---|
Cassandra データベースが稼働していることを確認します。 | |
Couchbase クラスターが稼働していることを確認します。 | |
| |
ディスク容量が不足していないか確認します。 | |
| Elasticsearch クラスターが起動していることを確認します。 |
Hazelcast サーバーが稼働していることを確認します。 | |
InfluxDB サーバーが起動していることを確認します。 | |
JMS ブローカーが起動していることを確認します。 | |
LDAP サーバーが起動していることを確認します。 | |
「活性」アプリケーションの可用性の状態を公開します。 | |
メールサーバーが起動していることを確認します。 | |
Mongo データベースが稼働していることを確認します。 | |
Neo4j データベースが稼働していることを確認します。 | |
常に | |
Rabbit サーバーが稼働していることを確認します。 | |
「準備」アプリケーションの可用性の状態を公開します。 | |
Redis サーバーが稼働していることを確認します。 | |
Solr サーバーが稼働していることを確認します。 |
management.health.defaults.enabled プロパティを設定することにより、すべて無効にできます。 |
2.8.2. カスタム HealthIndicators の作成
カスタムのヘルス情報を提供するために、HealthIndicator [GitHub] (英語) インターフェースを実装する Spring Bean を登録できます。health() メソッドの実装を提供し、Health レスポンスを返す必要があります。Health レスポンスにはステータスが含まれている必要があり、オプションで表示される追加の詳細を含めることができます。次のコードは、サンプルの HealthIndicator 実装を示しています。
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
} 特定の HealthIndicator の識別子は、HealthIndicator 接尾辞が存在しない場合は、HealthIndicator の名前を除いた Bean の名前です。上記の例では、ヘルス情報は my という名前のエントリで利用可能です。 |
Spring Boot の事前定義された Status [GitHub] (英語) 型に加えて、Health は新しいシステム状態を表すカスタム Status を返すこともできます。そのような場合、StatusAggregator [GitHub] (英語) インターフェースのカスタム実装も提供する必要があります。または、management.endpoint.health.status.order 構成プロパティを使用してデフォルトの実装を構成する必要があります。
例: HealthIndicator 実装の 1 つで、コード FATAL の新しい Status が使用されていると仮定します。重大度の順序を構成するには、次のプロパティをアプリケーションプロパティに追加します。
management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up レスポンスの HTTP ステータスコードは、全体的なヘルスステータスを反映します(たとえば、UP は 200 にマッピングされ、OUT_OF_SERVICE および DOWN は 503 にマッピングされます)。HTTP 経由でヘルスエンドポイントにアクセスする場合は、カスタムステータスマッピングを登録することもできます。例: 次のプロパティは FATAL を 503 にマップします(サービスは利用できません):
management.endpoint.health.status.http-mapping.fatal=503 さらに制御が必要な場合は、独自の HttpCodeStatusMapper Bean を定義できます。 |
次の表に、組み込みステータスのデフォルトのステータスマッピングを示します。
| ステータス | マッピング |
|---|---|
DOWN | SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
UP | デフォルトではマッピングがないため、http ステータスは 200 です |
UNKNOWN | デフォルトではマッピングがないため、http ステータスは 200 です |
2.8.3. リアクティブヘルスインジケータ
Spring WebFlux を使用するようなリアクティブアプリケーションの場合、ReactiveHealthContributor はアプリケーションの状態を取得するためのノンブロッキング契約を提供します。従来の HealthContributor と同様に、ヘルス情報は ReactiveHealthContributorRegistry [GitHub] (英語) のコンテンツから収集されます(デフォルトでは、ApplicationContext で定義されているすべての HealthContributor [GitHub] (英語) および ReactiveHealthContributor [GitHub] (英語) インスタンス)。リアクティブ API をチェックしない通常の HealthContributors は、エラスティックスケジューラで実行されます。
リアクティブアプリケーションでは、ReactiveHealthContributorRegistry を使用して、実行時にヘルスインジケータを登録および登録解除する必要があります。通常の HealthContributor を登録する必要がある場合は、ReactiveHealthContributor#adapt を使用してラップする必要があります。 |
リアクティブ API からカスタムヘルス情報を提供するために、ReactiveHealthIndicator [GitHub] (英語) インターフェースを実装する Spring Bean を登録できます。次のコードは、サンプルの ReactiveHealthIndicator 実装を示しています。
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return doHealthCheck() //perform some specific health check that returns a Mono<Health>
.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()));
}
} エラーを自動的に処理するには、AbstractReactiveHealthIndicator から拡張することを検討してください。 |
2.8.4. 自動構成された ReactiveHealthIndicators
以下の ReactiveHealthIndicators は、必要に応じて Spring Boot によって自動構成されます。
| 名前 | 説明 |
|---|---|
Cassandra データベースが稼働していることを確認します。 | |
Couchbase クラスターが稼働していることを確認します。 | |
Mongo データベースが稼働していることを確認します。 | |
Redis サーバーが稼働していることを確認します。 |
必要に応じて、リアクティブインジケータが通常のインジケータを置き換えます。また、明示的に処理されない HealthIndicator は自動的にラップされます。 |
2.8.5. ヘルスグループ
ヘルスインジケーターをさまざまな目的に使用できるグループに編成すると便利な場合があります。
ヘルスインジケータグループを作成するには、management.endpoint.health.group.<name> プロパティを使用し、ヘルスインジケータ ID のリストを include または exclude に指定できます。例: データベースインジケーターのみを含むグループを作成するには、以下を定義できます。
management.endpoint.health.group.custom.include=dblocalhost:8080/actuator/health/custom を押すと、結果を確認できます。
デフォルトでは、グループはシステムヘルスと同じ StatusAggregator および HttpCodeStatusMapper 設定を継承しますが、これらはグループごとに定義することもできます。必要に応じて、show-details および roles プロパティをオーバーライドすることもできます。
management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500 グループで使用するカスタム StatusAggregator または HttpCodeStatusMapper Bean を登録する必要がある場合は、@Qualifier("groupname") を使用できます。 |
2.9. Kubernetes プローブ
Kubernetes にデプロイされたアプリケーションは、コンテナープローブ (英語) を使用して内部状態に関する情報を提供できます。Kubernetes 構成 (英語) に応じて、kubelet はそれらのプローブを呼び出し、結果に反応します。
Spring Boot は、アプリケーションの可用性状態を標準で管理します。Kubernetes 環境にデプロイされた場合、アクチュエーターは ApplicationAvailability インターフェースから「活性」および「準備」情報を収集し、その情報を専用ヘルスインジケーター(LivenessStateHealthIndicator および ReadinessStateHealthIndicator)で使用します。これらのインジケーターは、グローバルヘルスエンドポイント("/actuator/health")に表示されます。また、ヘルスグループを使用する個別の HTTP プローブとして公開されます: "/actuator/health/liveness" および "/actuator/health/readiness"。
その後、次のエンドポイント情報を使用して Kubernetes インフラストラクチャを構成できます。
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: liveness-port
failureThreshold: ...
periodSeconds: ...
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: liveness-port
failureThreshold: ...
periodSeconds: ... 構成された有効期間よりもアプリケーションの起動に時間がかかる場合、Kubernetes は可能な解決策として "startupProbe" についてメンションしています。すべての起動タスクが完了するまで "readinessProbe" が失敗するため、"startupProbe" は必ずしも必要ではありません。アプリケーションライフサイクル中のプローブの動作を参照してください。 |
| アクチュエーターエンドポイントが別の管理コンテキストにデプロイされている場合は、エンドポイントがメインアプリケーションと同じ Web インフラストラクチャ(ポート、接続プール、フレームワークコンポーネント)を使用していないことに注意してください。この場合、メインアプリケーションが正しく機能しない場合(たとえば、新しい接続を受け入れることができない場合)でも、プローブチェックは成功する可能性があります。 |
2.9.1. Kubernetes プローブを使用した外部状態の確認
アクチュエーターは、「活性度」および「準備度」プローブをヘルスグループとして構成します。つまり、すべてのヘルスグループの機能が利用可能です。たとえば、追加のヘルスインジケーターを構成できます。
management.endpoint.health.group.readiness.include=readinessState,customCheckデフォルトでは、Spring Boot はこれらのグループに他のヘルスインジケーターを追加しません。
「活性」プローブは、外部システムのヘルスチェックに依存するべきではありません。アプリケーションの活性状態が壊れている場合、Kubernetes はアプリケーションインスタンスを再起動することでその問題を解決しようとします。つまり、外部システムに障害が発生した場合(データベース、Web API、外部キャッシュなど)、Kubernetes はすべてのアプリケーションインスタンスを再起動し、連鎖的な障害を引き起こす可能性があります。
「準備」プローブについては、外部システムのチェックの選択はアプリケーション開発者が注意深く行う必要があります。つまり、Spring Boot は準備プローブに追加のヘルスチェックを含めません。アプリケーションインスタンスの準備状態の準備ができていない場合、Kubernetes はそのインスタンスにトラフィックをルーティングしません。一部の外部システムは、アプリケーションインスタンスによって共有されない場合があります。その場合、当然、準備プローブに含めることができます。他の外部システムはアプリケーションに不可欠ではない場合があります(アプリケーションにはサーキットブレーカーとフォールバックが含まれる可能性があります)。その場合、絶対に含まれるべきではありません。残念ながら、すべてのアプリケーションインスタンスで共有される外部システムは一般的であり、判断の呼び出しを行う必要があります。それを準備プローブに含め、外部サービスがダウンしたときにアプリケーションがサービスから除外されることを期待するか、そのままにしておきます。スタックの上位の障害を取り出して処理します。たとえば、呼び出し元でサーキットブレーカーを使用します。
アプリケーションのすべてのインスタンスの準備ができていない場合、type=ClusterIP または NodePort を使用する Kubernetes サービスは受信接続を受け入れません。接続がないため、HTTP エラーレスポンス(503 など)はありません。type=LoadBalancer を使用するサービスは、プロバイダーに応じて、接続を受け入れる場合と受け入れない場合があります。明示的な Ingress (英語) を持つサービスも、実装に応じた方法でレスポンスします。入力サービス自体が、ダウンストリームからの「接続拒否」を処理する方法を決定する必要があります。HTTP 503 は、ロードバランサーと Ingress の両方の場合によく発生します。 |
また、アプリケーションが Kubernetes 自動スケーリング (英語) を使用している場合、そのオートスケーラー構成によっては、ロードバランサーから取り出されるアプリケーションに対する反応が異なる場合があります。
2.9.2. アプリケーションのライフサイクルとプローブの状態
Kubernetes プローブのサポートの重要な側面は、アプリケーションライフサイクルとの一貫性です。Spring Boot は起動およびシャットダウン中のアプリケーションイベントを公開しています。
Spring Boot アプリケーションが起動すると、次のようになります。
| アプリケーションの起動フェーズ | 活性状態 | 準備状態 | ノート |
|---|---|---|---|
開始 |
|
| Kubernetes は「活性」プローブをチェックし、時間がかかりすぎる場合はアプリケーションを再起動します。 |
起動済み |
|
| アプリケーションコンテキストがリフレッシュされます。アプリケーションは起動タスクを実行し、まだトラフィックを受信していません。 |
準備完了 |
|
| 起動タスクが完了しました。アプリケーションはトラフィックを受信しています。 |
Spring Boot アプリケーションがシャットダウンすると、次のようになります。
| アプリケーションのシャットダウン段階 | 活性状態 | 準備状態 | ノート |
|---|---|---|---|
実行 | ライブ | 準備ができて | シャットダウンがリクエストされました。 |
正常なシャットダウン | ライブ | 準備ができていない | 有効にすると、正常なシャットダウンが処理中のリクエストを処理します。 |
シャットダウンが完了しました | 壊れた | 準備ができていない | アプリケーションコンテキストは閉じられており、アプリケーションはトラフィックを処理できません。 |
| Kubernetes デプロイの詳細については、Kubernetes コンテナーのライフサイクルセクションを参照してください。 |
2.10. アプリケーション情報
アプリケーション情報は、ApplicationContext で定義されたすべての InfoContributor [GitHub] (英語) Bean から収集されたさまざまな情報を公開します。Spring Boot には多数の自動構成 InfoContributor Bean が含まれており、独自の Bean を作成できます。
2.10.1. 自動構成された InfoContributors
以下の InfoContributor Bean は、必要に応じて Spring Boot によって自動構成されます。
| 名前 | 説明 |
|---|---|
| |
| |
|
management.info.defaults.enabled プロパティを設定することにより、すべて無効にすることができます。 |
2.10.2. カスタムアプリケーション情報
info.* Spring プロパティを設定することにより、info エンドポイントによって公開されるデータをカスタマイズできます。info キーのすべての Environment プロパティは自動的に公開されます。例: application.properties ファイルに次の設定を追加できます。
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8これらの値をハードコードするのではなく、ビルド時に情報プロパティを展開することもできます。 Maven を使用すると仮定すると、上記の例を次のように書き換えることができます。 |
2.10.3. Git コミット情報
info エンドポイントのもう 1 つの便利な機能は、プロジェクトがビルドされたときの git ソースコードリポジトリの状態に関する情報を公開する機能です。GitProperties Bean が使用可能な場合、git.branch、git.commit.id、git.commit.time プロパティが公開されます。
git.properties ファイルがクラスパスのルートで利用可能な場合、GitProperties Bean は自動構成されます。詳細については、"Git 情報を生成する" を参照してください。 |
完全な git 情報(つまり、git.properties の完全なコンテンツ)を表示する場合は、次のように management.info.git.mode プロパティを使用します。
management.info.git.mode=full2.10.4. ビルド情報
BuildProperties Bean が使用可能な場合、info エンドポイントはビルドに関する情報も公開できます。これは、META-INF/build-info.properties ファイルがクラスパスで利用可能な場合に発生します。
| Maven および Gradle プラグインは両方ともそのファイルを生成できます。詳細については、"ビルド情報を生成する" を参照してください。 |
2.10.5. カスタム InfoContributors の作成
カスタムアプリケーション情報を提供するために、InfoContributor [GitHub] (英語) インターフェースを実装する Spring Bean を登録できます。
次の例は、単一の値を持つ example エントリを提供します。
import java.util.Collections;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
@Component
public class ExampleInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example",
Collections.singletonMap("key", "value"));
}
}info エンドポイントに到達すると、次の追加エントリを含むレスポンスが表示されます。
{
"example": {
"key" : "value"
}
}3. HTTP を介した監視と管理
Web アプリケーションを開発している場合、Spring Boot Actuator はすべての有効なエンドポイントが HTTP 経由で公開されるように自動構成します。デフォルトの規則では、URL パスとして /actuator のプレフィックスを持つエンドポイントの id を使用します。例: health は /actuator/health として公開されます。
| アクチュエーターは、Spring MVC、Spring、WebFlux、Jersey でネイティブにサポートされています。Jersey と Spring MVC の両方が使用可能な場合は、Spring MVC が使用されます。 |
3.1. 管理エンドポイントパスのカスタマイズ
管理エンドポイントのプレフィックスをカスタマイズすると便利な場合があります。例: アプリケーションは、別の目的で /actuator をすでに使用している場合があります。次の例に示すように、management.endpoints.web.base-path プロパティを使用して、管理エンドポイントのプレフィックスを変更できます。
management.endpoints.web.base-path=/manage 上記の application.properties の例は、エンドポイントを /actuator/{id} から /manage/{id} に変更します(たとえば、/manage/info)。
別の HTTP ポートを使用してエンドポイントを公開するように管理ポートが構成されていない限り、management.endpoints.web.base-path は server.servlet.context-path に相対的です。management.server.port が構成されている場合、management.endpoints.web.base-path は management.server.servlet.context-path に対して相対的です。 |
エンドポイントを別のパスにマップする場合は、management.endpoints.web.path-mapping プロパティを使用できます。
次の例では、/actuator/health を /healthcheck に再マッピングします。
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck3.2. 管理サーバーポートのカスタマイズ
デフォルトの HTTP ポートを使用して管理エンドポイントを公開することは、クラウドベースのデプロイにとって実用的な選択です。ただし、アプリケーションが独自のデータセンター内で実行される場合は、別の HTTP ポートを使用してエンドポイントを公開することをお勧めします。
次の例に示すように、management.server.port プロパティを設定して HTTP ポートを変更できます。
management.server.port=8081| Cloud Foundry では、アプリケーションはデフォルトで HTTP と TCP の両方のルーティングに対してポート 8080 でのみリクエストを受信します。Cloud Foundry でカスタム管理ポートを使用する場合は、アプリケーションのルートを明示的に設定して、トラフィックをカスタムポートに転送する必要があります。 |
3.3. 管理固有の SSL の構成
カスタムポートを使用するように構成されている場合、さまざまな management.server.ssl.* プロパティを使用して、管理サーバーを独自の SSL で構成することもできます。例: これにより、次のプロパティ設定に示すように、メインアプリケーションが HTTPS を使用しているときに、管理サーバーを HTTP 経由で使用できるようになります。
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=falseまたは、メインサーバーと管理サーバーの両方で SSL を使用できますが、次のようにキーストアが異なります。
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret3.4. 管理サーバーのアドレスのカスタマイズ
management.server.address プロパティを設定することにより、管理エンドポイントが使用可能なアドレスをカスタマイズできます。これは、内部または ops に面したネットワークでのみリッスンする場合、または localhost からの接続のみをリッスンする場合に役立ちます。
| ポートがメインサーバーのポートと異なる場合にのみ、別のアドレスでリッスンできます。 |
次の例 application.properties は、リモート管理接続を許可しません。
management.server.port=8081
management.server.address=127.0.0.14. JMX を介した監視と管理
Java Management Extensions(JMX)は、アプリケーションを監視および管理するための標準メカニズムを提供します。デフォルトでは、この機能は有効になっておらず、構成プロパティ spring.jmx.enabled を true に設定することでオンにできます。Spring Boot は、デフォルトで管理エンドポイントを org.springframework.boot ドメインの JMX MBean として公開します。
4.1. MBean 名のカスタマイズ
通常、MBean の名前はエンドポイントの id から生成されます。例: health エンドポイントは org.springframework.boot:type=Endpoint,name=Health として公開されます。
アプリケーションに複数の Spring ApplicationContext が含まれている場合、名前が衝突することがあります。この問題を解決するには、spring.jmx.unique-names プロパティを true に設定して、MBean 名が常に一意になるようにします。
エンドポイントが公開される JMX ドメインをカスタマイズすることもできます。次の設定は、application.properties で実行する例を示しています。
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp4.2. JMX エンドポイントの無効化
JMX でエンドポイントを公開したくない場合は、次の例に示すように、management.endpoints.jmx.exposure.exclude プロパティを * に設定できます。
management.endpoints.jmx.exposure.exclude=*4.3. HTTP を介した JMX での Jolokia の使用
Jolokia は、JMX Bean にアクセスする代替方法を提供する JMX-HTTP ブリッジです。Jolokia を使用するには、org.jolokia:jolokia-core への依存関係を含めます。例: Maven では、次の依存関係を追加します。
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>jolokia または * を management.endpoints.web.exposure.include プロパティに追加することにより、Jolokia エンドポイントを公開できます。その後、管理 HTTP サーバーで /actuator/jolokia を使用してアクセスできます。
| Jolokia エンドポイントは、Jolokia のサーブレットをアクチュエーターエンドポイントとして公開します。その結果、これは Spring MVC や Jersey などのサーブレット環境に固有です。エンドポイントは WebFlux アプリケーションでは使用できません。 |
5. ロガー
Spring Boot Actuator には、実行時にアプリケーションのログレベルを表示および構成する機能が含まれています。リスト全体または個々のロガーの設定を表示できます。これは、明示的に設定されたログレベルと、ログフレームワークによって指定された有効なログレベルの両方で構成されます。これらのレベルは次のいずれかです。
TRACEDEBUGINFOWARNERRORFATALOFFnull
null は、明示的な構成がないことを示します。
6. メトリクス
Spring Boot Actuator は、次のような多数の監視システムをサポートするアプリケーションメトリクスファサードである Micrometer (英語) の依存関係管理と自動構成を提供します。
| Micrometer の機能の詳細については、リファレンスドキュメント (英語) 、特に概念セクション (英語) を参照してください。 |
6.1. 入門
Spring Boot は、コンポジット MeterRegistry を自動構成し、クラスパスで検出されたサポートされている各実装のレジストリをコンポジットに追加します。Spring Boot がレジストリを設定するには、ランタイムクラスパスで micrometer-registry-{system} に依存していれば十分です。
ほとんどのレジストリは共通の機能を共有しています。たとえば、Micrometer レジストリ実装がクラスパスにある場合でも、特定のレジストリを無効にできます。例: Datadog を無効にするには:
management.metrics.export.datadog.enabled=falseSpring Boot は、次のことを明示的に指示しない限り、Metrics クラスのグローバルな静的複合レジストリに自動構成レジストリを追加します。
management.metrics.use-global-registry=false メーターをレジストリに登録する前に、MeterRegistryCustomizer Bean をいくつでも登録して、共通タグの適用など、レジストリをさらに設定できます。
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}ジェネリクス型をより具体的にすることにより、特定のレジストリ実装にカスタマイズを適用できます。
@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
} そのセットアップを使用して、コンポーネントに MeterRegistry を挿入し、メトリクスを登録できます。
@Component
public class SampleBean {
private final Counter counter;
public SampleBean(MeterRegistry registry) {
this.counter = registry.counter("received.messages");
}
public void handleMessage(String message) {
this.counter.increment();
// handle message implementation
}
}Spring Boot は、構成または専用のアノテーションマーカーを介して制御できる組み込みのインストルメンテーション(つまり、MeterBinder 実装)も構成します。
6.2. サポートされている監視システム
6.2.1. AppOptics
デフォルトでは、AppOptics レジストリは定期的にメトリクスを api.appoptics.com/v1/measurements (英語) にプッシュします。メトリクスを SaaS AppOptics (英語) にエクスポートするには、API トークンを提供する必要があります。
management.metrics.export.appoptics.api-token=YOUR_TOKEN6.2.2. Atlas
デフォルトでは、メトリクスはローカルマシンで実行されている Atlas (英語) にエクスポートされます。使用する Atlas サーバー [GitHub] (英語) の場所は、以下を使用して提供できます。
management.metrics.export.atlas.uri=https://atlas.example.com:7101/api/v1/publish6.2.3. Datadog
Datadog レジストリは、メトリクスを datadoghq (英語) に定期的にプッシュします。メトリクスを Datadog (英語) にエクスポートするには、API キーを提供する必要があります。
management.metrics.export.datadog.api-key=YOUR_KEYメトリクスが Datadog に送信される間隔を変更することもできます。
management.metrics.export.datadog.step=30s6.2.4. Dynatrace
Dynatrace レジストリは、構成された URI にメトリクスを定期的にプッシュします。メトリクスを Dynatrace (英語) にエクスポートするには、API トークン、デバイス ID、URI を提供する必要があります。
management.metrics.export.dynatrace.api-token=YOUR_TOKEN
management.metrics.export.dynatrace.device-id=YOUR_DEVICE_ID
management.metrics.export.dynatrace.uri=YOUR_URIメトリクスが Dynatrace に送信される間隔を変更することもできます。
management.metrics.export.dynatrace.step=30s6.2.5. Elastic
デフォルトでは、メトリクスはローカルマシンで実行されている Elastic (英語) にエクスポートされます。使用する Elastic サーバーの場所は、次のプロパティを使用して提供できます。
management.metrics.export.elastic.host=https://elastic.example.com:80866.2.6. Ganglia
デフォルトでは、メトリクスはローカルマシンで実行されている Ganglia (英語) にエクスポートされます。使用する Ganglia サーバー (英語) ホストとポートは、以下を使用して提供できます。
management.metrics.export.ganglia.host=ganglia.example.com
management.metrics.export.ganglia.port=96496.2.7. Graphite
デフォルトでは、メトリクスはローカルマシンで実行されている Graphite (英語) にエクスポートされます。使用する Graphite サーバー (英語) ホストとポートは、以下を使用して提供できます。
management.metrics.export.graphite.host=graphite.example.com
management.metrics.export.graphite.port=9004Micrometer は、次元のメーター ID がフラットな階層名にマップされる (英語) 方法を管理するデフォルトの HierarchicalNameMapper を提供します。
この動作を制御するには、GraphiteMeterRegistry を定義し、独自の HierarchicalNameMapper を提供します。独自に定義しない限り、自動構成された GraphiteConfig および Clock Bean が提供されます。 |
@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
return new GraphiteMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}6.2.8. Humio
デフォルトでは、Humio レジストリはメトリクスを cloud.humio.com (英語) に定期的にプッシュします。メトリクスを SaaS Humio (英語) にエクスポートするには、API トークンを提供する必要があります。
management.metrics.export.humio.api-token=YOUR_TOKENまた、1 つ以上のタグを構成して、メトリクスがプッシュされるデータソースを識別する必要があります。
management.metrics.export.humio.tags.alpha=a
management.metrics.export.humio.tags.bravo=b6.2.9. Influx
デフォルトでは、メトリクスはローカルマシンで実行されている Influx (英語) にエクスポートされます。使用する Influx サーバー (英語) の場所は、以下を使用して提供できます。
management.metrics.export.influx.uri=https://influx.example.com:80866.2.10. JMX
Micrometer は、主に安価で移植性の高いメトリクスをローカルで表示する方法として、JMX (英語) への階層マッピングを提供します。デフォルトでは、メトリクスは metrics JMX ドメインにエクスポートされます。使用するドメインは、次を使用して提供できます。
management.metrics.export.jmx.domain=com.example.app.metricsMicrometer は、次元のメーター ID がフラットな階層名にマップされる (英語) 方法を管理するデフォルトの HierarchicalNameMapper を提供します。
この動作を制御するには、JmxMeterRegistry を定義し、独自の HierarchicalNameMapper を提供します。独自に定義しない限り、自動構成された JmxConfig および Clock Bean が提供されます。 |
@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}6.2.11. KairosDB
デフォルトでは、メトリクスはローカルマシンで実行されている KairosDB (英語) にエクスポートされます。使用する KairosDB サーバー (英語) の場所は、以下を使用して提供できます。
management.metrics.export.kairos.uri=https://kairosdb.example.com:8080/api/v1/datapoints6.2.12. New Relic
New Relic レジストリは、メトリクスを New Relic (英語) に定期的にプッシュします。メトリクスを New Relic (英語) にエクスポートするには、API キーとアカウント ID を提供する必要があります。
management.metrics.export.newrelic.api-key=YOUR_KEY
management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_IDまた、メトリクスが New Relic に送信される間隔を変更することもできます。
management.metrics.export.newrelic.step=30sデフォルトでは、メトリクスは REST 呼び出しを介して公開されますが、クラスパスにある場合は Java エージェント API を使用することもできます。
management.metrics.export.newrelic.client-provider-type=insights-agent 最後に、独自の NewRelicClientProvider Bean を定義することで、完全に制御できます。
6.2.13. Prometheus
Prometheus (英語) は、メトリクスの個々のアプリインスタンスをスクレイピングまたはポーリングすることを想定しています。Spring Boot は、/actuator/prometheus で利用可能なアクチュエーターエンドポイントを提供して、適切な形式の Prometheus scrape (英語) を提示します。
以下は、prometheus.yml に追加する scrape_config の例です。
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['HOST:PORT']スクレイピングできるほど長く存在しない可能性のある一時的なジョブやバッチジョブの場合、Prometheus Pushgateway [GitHub] (英語) サポートを使用して、そのメトリクスを Prometheus に公開できます。Prometheus Pushgateway サポートを有効にするには、プロジェクトに次の依存関係を追加します。
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
</dependency> クラスパスに Prometheus Pushgateway 依存関係が存在する場合、Spring Boot は PrometheusPushGatewayManager Bean を自動構成します。これにより、Prometheus Pushgateway へのメトリクスのプッシュが管理されます。PrometheusPushGatewayManager は、management.metrics.export.prometheus.pushgateway のプロパティを使用して調整できます。高度な構成では、独自の PrometheusPushGatewayManager Bean を提供することもできます。
6.2.14. SignalFx
SignalFx レジストリは、メトリクスを定期的に SignalFx (英語) にプッシュします。メトリクスを SignalFx (英語) にエクスポートするには、アクセストークンを提供する必要があります。
management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKENメトリクスが SignalFx に送信される間隔を変更することもできます。
management.metrics.export.signalfx.step=30s6.2.15. シンプル
Micrometer には、他のレジストリが構成されていない場合に自動的にフォールバックとして使用される単純なメモリ内バックエンドが付属しています。これにより、メトリクスエンドポイントで収集されるメトリクスを確認できます。
メモリ内のバックエンドは、他の利用可能なバックエンドを使用するとすぐに無効になります。明示的に無効にすることもできます:
management.metrics.export.simple.enabled=false6.2.16. Stackdriver
Stackdriver レジストリは指標を定期的に Stackdriver にプッシュします。メトリクスを SaaS Stackdriver (英語) にエクスポートするには、Google クラウドプロジェクト ID を指定する必要があります。
management.metrics.export.stackdriver.project-id=my-projectまた、メトリクスが Stackdriver に送信される間隔を変更することもできます。
management.metrics.export.stackdriver.step=30s6.2.17. StatsD
StatsD レジストリは、メトリクスを UDP 経由で StatsD エージェントに積極的にプッシュします。デフォルトでは、メトリクスはローカルマシンで実行されている StatsD (英語) エージェントにエクスポートされます。使用する StatsD エージェントのホストとポートは、次を使用して提供できます。
management.metrics.export.statsd.host=statsd.example.com
management.metrics.export.statsd.port=9125また、使用する StatsD ラインプロトコルを変更できます(デフォルトは Datadog)。
management.metrics.export.statsd.flavor=etsy6.2.18. Wavefront
Wavefront レジストリはメトリクスを定期的に Wavefront (英語) にプッシュします。メトリクスを Wavefront (英語) に直接エクスポートする場合は、API トークンを提供する必要があります。
management.metrics.export.wavefront.api-token=YOUR_API_TOKENあるいは、メトリクスデータを Wavefront API ホストに転送する環境内に設定された Wavefront サイドカーまたは内部プロキシを使用することもできます。
management.metrics.export.wavefront.uri=proxy://localhost:2878 メトリクスを Wavefront プロキシに公開する場合 ( ドキュメント (英語) に従って)、ホストは proxy://HOST:PORT 形式である必要があります。 |
メトリクスが Wavefront に送信される間隔を変更することもできます。
management.metrics.export.wavefront.step=30s6.3. サポートされているメトリクス
Spring Boot は、該当する場合、次の主要なメトリクスを登録します
JVM メトリクス、レポート使用率:
さまざまなメモリおよびバッファプール
ガベージコレクションに関連する統計
スレッド使用率
ロード / アンロードされたクラスの数
CPU メトリクス
ファイル記述子のメトリクス
Kafka コンシューマー指標
Log4j2 メトリクス: 各レベルで Log4j2 に記録されたイベントの数を記録します
Logback メトリクス: 各レベルで Logback に記録されたイベントの数を記録します
稼働時間メトリクス: 稼働時間のゲージと、アプリケーションの絶対開始時間を表す固定ゲージを報告する
Tomcat メトリクス (すべての Tomcat メトリクスを登録するには、
server.tomcat.mbeanregistry.enabledをtrueに設定する必要があります)Spring Integration メトリクス
6.3.1. Spring MVC メトリクス
自動構成により、Spring MVC によって処理されるリクエストの計測が可能になります。management.metrics.web.server.request.autotime.enabled が true の場合、このインストルメンテーションはすべてのリクエストに対して発生します。または、false に設定すると、リクエスト処理メソッドに @Timed を追加することでインストルメンテーションを有効にすることができます。
@RestController
@Timed (1)
public class MyController {
@GetMapping("/api/people")
@Timed(extraTags = { "region", "us-east-1" }) (2)
@Timed(value = "all.people", longTask = true) (3)
public List<Person> listPeople() { ... }
}| 1 | コントローラー内のすべてのリクエストハンドラーでタイミングを有効にするコントローラークラス。 |
| 2 | 個々のエンドポイントを有効にする方法。これはクラスにある場合は必要ありませんが、この特定のエンドポイントのタイマーをさらにカスタマイズするために使用できます。 |
| 3 | メソッドの長いタスクタイマーを有効にする longTask = true を使用するメソッド。長いタスクタイマーには別のメトリクス名が必要であり、短いタスクタイマーでスタックできます。 |
デフォルトでは、メトリクスは http.server.requests という名前で生成されます。management.metrics.web.server.request.metric-name プロパティを設定することにより、名前をカスタマイズできます。
デフォルトでは、Spring MVC 関連のメトリクスは次の情報でタグ付けされます。
| タグ | 説明 |
|---|---|
| リクエストの処理中にスローされた例外の単純なクラス名。 |
| リクエストの方法 (たとえば、 |
| レスポンスのステータスコードに基づくリクエストの結果。1xx は |
| レスポンスの HTTP ステータスコード (たとえば、 |
| 可能であれば、変数置換の前のリクエストの URI テンプレート (たとえば、 |
デフォルトのタグに追加するには、1 つ以上の @Bean`s that implement `WebMvcTagsContributor を提供します。デフォルトのタグを置き換えるには、WebMvcTagsProvider を実装する @Bean を提供します。
6.3.2. Spring WebFlux メトリクス
自動構成により、WebFlux コントローラーおよび機能ハンドラーによって処理されるすべてのリクエストの計測が可能になります。
デフォルトでは、メトリクスは http.server.requests という名前で生成されます。management.metrics.web.server.request.metric-name プロパティを設定して、名前をカスタマイズできます。
デフォルトでは、WebFlux 関連のメトリクスは次の情報でタグ付けされます。
| タグ | 説明 |
|---|---|
| リクエストの処理中にスローされた例外の単純なクラス名。 |
| リクエストの方法 (たとえば、 |
| レスポンスのステータスコードに基づくリクエストの結果。1xx は |
| レスポンスの HTTP ステータスコード (たとえば、 |
| 可能であれば、変数置換の前のリクエストの URI テンプレート (たとえば、 |
デフォルトのタグに追加するには、1 つ以上の @Bean`s that implement `WebFluxTagsContributor を提供します。デフォルトのタグを置き換えるには、WebFluxTagsProvider を実装する @Bean を提供します。
6.3.3. Jersey サーバーメトリクス
Micrometer の micrometer-jersey2 モジュールがクラスパスにある場合、自動構成により、Jersey JAX-RS 実装によって処理されるリクエストの計測が可能になります。management.metrics.web.server.request.autotime.enabled が true の場合、このインスツルメンテーションはすべてのリクエストに対して発生します。あるいは、false に設定されている場合、@Timed をリクエスト処理メソッドに追加することにより、インストルメンテーションを有効にできます。
@Component
@Path("/api/people")
@Timed (1)
public class Endpoint {
@GET
@Timed(extraTags = { "region", "us-east-1" }) (2)
@Timed(value = "all.people", longTask = true) (3)
public List<Person> listPeople() { ... }
}| 1 | リソースクラスで、リソース内のすべてのリクエストハンドラーでタイミングを有効にします。 |
| 2 | 個々のエンドポイントを有効にする方法。これはクラスにある場合は必要ありませんが、この特定のエンドポイントのタイマーをさらにカスタマイズするために使用できます。 |
| 3 | longTask = true を使用したメソッドで、メソッドの長いタスクタイマーを有効にします。長いタスクタイマーには別のメトリクス名が必要であり、短いタスクタイマーでスタックできます。 |
デフォルトでは、メトリクスは http.server.requests という名前で生成されます。management.metrics.web.server.request.metric-name プロパティを設定することにより、名前をカスタマイズできます。
デフォルトでは、Jersey サーバーメトリクスは次の情報でタグ付けされます。
| タグ | 説明 |
|---|---|
| リクエストの処理中にスローされた例外の単純なクラス名。 |
| リクエストの方法 (たとえば、 |
| レスポンスのステータスコードに基づくリクエストの結果。1xx は |
| レスポンスの HTTP ステータスコード (たとえば、 |
| 可能であれば、変数置換の前のリクエストの URI テンプレート (たとえば、 |
タグをカスタマイズするには、JerseyTagsProvider を実装する @Bean を提供します。
6.3.4. HTTP クライアントメトリクス
Spring Boot Actuator は、RestTemplate と WebClient の両方のインスツルメンテーションを管理します。そのためには、自動構成されたビルダーを挿入し、それを使用してインスタンスを作成する必要があります。
RestTemplate用RestTemplateBuilderWebClient用WebClient.Builder
このインスツルメンテーションを担当するカスタマイザー、つまり MetricsRestTemplateCustomizer および MetricsWebClientCustomizer を手動で適用することもできます。
デフォルトでは、メトリクスは http.client.requests という名前で生成されます。management.metrics.web.client.request.metric-name プロパティを設定することにより、名前をカスタマイズできます。
デフォルトでは、インストルメントされたクライアントによって生成されたメトリクスには、次の情報がタグ付けされます。
| タグ | 説明 |
|---|---|
| URI のホスト部分 |
| リクエストの方法 (たとえば、 |
| レスポンスのステータスコードに基づくリクエストの結果。1xx は |
| レスポンスの HTTP ステータスコード(利用可能な場合)(例: |
| 可能であれば、変数置換の前のリクエストの URI テンプレート (たとえば、 |
タグをカスタマイズし、選択したクライアントに応じて、RestTemplateExchangeTagsProvider または WebClientExchangeTagsProvider を実装する @Bean を提供できます。RestTemplateExchangeTags および WebClientExchangeTags には便利な静的関数があります。
6.3.5. キャッシュメトリクス
自動構成により、起動時に使用可能なすべての Cache のインストルメンテーションが可能になり、メトリクスの先頭に cache が付きます。キャッシュインスツルメンテーションは、メトリクスの基本セットに対して標準化されています。追加のキャッシュ固有のメトリクスも利用できます。
次のキャッシュライブラリがサポートされています。
Caffeine
EhCache 2
Hazelcast
準拠する JCache(JSR-107)実装
メトリクスは、キャッシュの名前と、Bean 名から派生した CacheManager の名前でタグ付けされます。
起動時に設定されるキャッシュのみがレジストリにバインドされます。キャッシュの構成で定義されていないキャッシュの場合、たとえばオンザフライで、起動段階後にプログラムで作成されたキャッシュの場合、明示的な登録が必要です。CacheMetricsRegistrar Bean は、そのプロセスを簡単にするために利用可能になります。 |
6.3.6. DataSource メトリクス
自動構成により、jdbc.connections のプレフィックスが付いたメトリクスを使用して、使用可能なすべての DataSource オブジェクトのインスツルメンテーションが可能になります。データソースのインスツルメンテーションにより、プール内の現在アクティブな接続、アイドル接続、最大許容接続、最小許容接続を表すゲージが作成されます。
メトリクスは、Bean 名に基づいて計算された DataSource の名前でもタグ付けされます。
デフォルトでは、Spring Boot はサポートされているすべてのデータソースのメタデータを提供します。お気に入りのデータソースがすぐにサポートされない場合は、DataSourcePoolMetadataProvider Bean を追加できます。例については、DataSourcePoolMetadataProvidersConfiguration を参照してください。 |
また、Hikari 固有のメトリクスは、hikaricp プレフィックスで公開されます。各メトリクスは、プールの名前でタグ付けされます(spring.datasource.name で制御できます)。
6.3.7. Hibernate メトリクス
自動構成により、hibernate という名前のメトリクスで統計が有効になっているすべての使用可能な Hibernate EntityManagerFactory インスタンスのインストルメンテーションが可能になります。
メトリクスは、Bean 名から派生した EntityManagerFactory の名前でもタグ付けされます。
統計を有効にするには、標準の JPA プロパティ hibernate.generate_statistics を true に設定する必要があります。次の例に示すように、自動構成された EntityManagerFactory でそれを有効にできます。
spring.jpa.properties.hibernate.generate_statistics=true6.4. カスタムメトリクスの登録
カスタムメトリクスを登録するには、次の例に示すように、MeterRegistry をコンポーネントに挿入します。
class Dictionary {
private final List<String> words = new CopyOnWriteArrayList<>();
Dictionary(MeterRegistry registry) {
registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
}
// …
} コンポーネントまたはアプリケーション全体で一連のメトリクスを繰り返し計測する場合は、このスイートを MeterBinder 実装にカプセル化できます。デフォルトでは、すべての MeterBinder Bean のメトリクスは自動的に Spring 管理の MeterRegistry にバインドされます。
6.5. 個々のメトリクスのカスタマイズ
特定の Meter インスタンスにカスタマイズを適用する必要がある場合は、io.micrometer.core.instrument.config.MeterFilter インターフェースを使用できます。デフォルトでは、すべての MeterFilter Bean は micrometer MeterRegistry.Config に自動的に適用されます。
例: com.example で始まるすべてのメーター ID の mytag.region タグの名前を mytag.area に変更する場合、次の操作を実行できます。
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}6.5.1. 一般的なタグ
一般に、共通タグは、ホスト、インスタンス、リージョン、スタックなどの動作環境でのディメンションのドリルダウンに使用されます。共通タグはすべてのメーターに適用され、次の例に示すように構成できます。
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod 上記の例では、region および stack タグを、それぞれ us-east-1 および prod の値を持つすべてのメーターに追加します。
Graphite を使用している場合、共通タグの順序は重要です。このアプローチでは共通タグの順序を保証できないため、Graphite ユーザーは代わりにカスタム MeterFilter を定義することをお勧めします。 |
6.5.2. メーター別のプロパティ
MeterFilter Bean に加えて、プロパティを使用して、メーター別で限られたカスタマイズセットを適用することもできます。メーターごとのカスタマイズは、指定された名前で始まるすべてのメーター ID に適用されます。例: 以下は、example.remote で始まる ID を持つメーターを無効にします
management.metrics.enable.example.remote=false次のプロパティでは、メーターごとのカスタマイズが可能です。
| プロパティ | 説明 |
|---|---|
| メーターによるメトリクスの出力を拒否するかどうか。 |
| 集計可能な(ディメンション間)パーセンタイル近似の計算に適したヒストグラムを公開するかどうか。 |
| 期待値の範囲を制限することにより、少ないヒストグラムバケットを公開します。 |
| アプリケーションで計算されたパーセンタイル値を公開する |
| サービスレベルゴールによって定義されたバケットを含む累積ヒストグラムを公開します。 |
percentiles-histogram、percentiles、sla の背景となる概念の詳細については、micrometer ドキュメントの「ヒストグラムとパーセンタイル」セクション (英語) を参照してください。
6.6. メトリクスエンドポイント
Spring Boot は、アプリケーションによって収集されたメトリクスを検査するために診断的に使用できる metrics エンドポイントを提供します。エンドポイントはデフォルトでは使用できないため、公開する必要があります。詳細については、エンドポイントの公開を参照してください。
/actuator/metrics に移動すると、使用可能なメーター名のリストが表示されます。セレクターとして名前を指定することにより、特定のメーターに関する情報を表示するためにドリルダウンできます。/actuator/metrics/jvm.memory.max
ここで使用する名前は、コードで使用される名前と一致する必要があります。提供先の監視システム用に正規化された命名規則に準拠した名前ではありません。つまり、スネークケースの命名規則のために |
また、URL の末尾に任意の数の tag=KEY:VALUE クエリパラメーターを追加して、メーターなどのディメンションをドリルダウンすることもできます。/actuator/metrics/jvm.memory.max?tag=area:nonheap
レポートされる測定値は、メーター名と適用されたタグに一致するすべてのメーターの統計の合計です。上記の例では、返される「値」統計は、ヒープの「コードキャッシュ」、「圧縮クラススペース」、「メタスペース」領域の最大メモリフットプリントの合計です。「メタスペース」の最大サイズを表示したいだけであれば、追加の |
7. 監査
Spring Security が動作すると、Spring Boot Actuator にはイベント(デフォルトでは「認証成功」、「失敗」、「アクセス拒否」の例外)を公開する柔軟な監査フレームワークがあります。この機能は、レポートおよび認証失敗に基づいたロックアウトポリシーの実装に非常に役立ちます。
監査を有効にするには、アプリケーションの構成で型 AuditEventRepository の Bean を提供します。便宜上、Spring Boot は InMemoryAuditEventRepository を提供します。InMemoryAuditEventRepository の機能は限られているため、開発環境でのみ使用することをお勧めします。本番環境では、独自の代替 AuditEventRepository 実装を作成することを検討してください。
7.1. カスタム監査
公開されたセキュリティイベントをカスタマイズするには、AbstractAuthenticationAuditListener および AbstractAuthorizationAuditListener の独自の実装を提供できます。
独自のビジネスイベントに監査サービスを使用することもできます。そのためには、AuditEventRepository Bean を独自のコンポーネントに挿入して直接使用するか、AuditApplicationEvent を Spring ApplicationEventPublisher で公開します(ApplicationEventPublisherAware を実装することにより)。
8. HTTP トレース
HTTP トレースは、アプリケーションの構成で HttpTraceRepository 型の Bean を指定することで有効にできます。便宜上、Spring Boot はデフォルトで、過去 100 回のリクエストとレスポンスの交換のトレースを保存する InMemoryHttpTraceRepository を提供します。InMemoryHttpTraceRepository は他のトレースソリューションと比べて制限があるため、開発環境でのみ使用することをお勧めします。本番環境の場合は、Zipkin や Spring Cloud Sleuth など、本番対応のトレースまたは可観測性ソリューションを使用することをお勧めします。あるいは、ニーズを満たす独自の HttpTraceRepository を作成します。
httptrace エンドポイントを使用して、HttpTraceRepository に格納されているリクエストとレスポンスの交換に関する情報を取得できます。
9. プロセス監視
spring-boot モジュールには、プロセスの監視に役立つことが多いファイルを作成するための 2 つのクラスがあります。
ApplicationPidFileWriterは、アプリケーション PID を含むファイルを作成します(デフォルトでは、ファイル名がapplication.pidのアプリケーションディレクトリにあります)。WebServerPortFileWriterは、実行中の Web サーバーのポートを含むファイル(またはファイル)を作成します(デフォルトでは、ファイル名がapplication.portのアプリケーションディレクトリにあります)。
デフォルトでは、これらのライターはアクティブ化されていませんが、次を有効にできます。
10. Cloud Foundry サポート
Spring Boot のアクチュエーターモジュールには、互換性のある Cloud Foundry インスタンスにデプロイするときにアクティブになる追加のサポートが含まれています。/cloudfoundryapplication パスは、すべての @Endpoint Bean への安全な代替ルートを提供します。
拡張サポートにより、Cloud Foundry 管理 UI(デプロイされたアプリケーションの表示に使用できる Web アプリケーションなど)を Spring Boot アクチュエーター情報で強化できます。例: アプリケーションステータスページには、通常の「実行中」または「停止」ステータスではなく、完全なヘルス情報が含まれる場合があります。
/cloudfoundryapplication パスには、通常のユーザーは直接アクセスできません。エンドポイントを使用するには、有効な UAA トークンをリクエストと共に渡す必要があります。 |
10.1. 拡張 Cloud Foundry アクチュエーターサポートの無効化
/cloudfoundryapplication エンドポイントを完全に無効にする場合は、application.properties ファイルに次の設定を追加できます。
management.cloudfoundry.enabled=false10.2. Cloud Foundry 自己署名証明書
デフォルトでは、/cloudfoundryapplication エンドポイントのセキュリティ検証は、さまざまな Cloud Foundry サービスへの SSL 呼び出しを行います。Cloud Foundry UAA または Cloud Controller サービスが自己署名証明書を使用する場合、次のプロパティを設定する必要があります。
management.cloudfoundry.skip-ssl-validation=true10.3. カスタムコンテキストパス
サーバーのコンテキストパスが / 以外に設定されている場合、Cloud Foundry エンドポイントはアプリケーションのルートで利用できません。例: server.servlet.context-path=/app の場合、Cloud Foundry エンドポイントは /app/cloudfoundryapplication/* で利用可能になります。
サーバーのコンテキストパスに関係なく、/cloudfoundryapplication/* で Cloud Foundry エンドポイントが常に使用できると予想される場合は、アプリケーションで明示的に構成する必要があります。構成は、使用中の Web サーバーによって異なります。Tomcat の場合、次の構成を追加できます。
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new Tomcat.FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}
};
}
private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (c, context) -> {
Servlet servlet = new GenericServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
ServletContext context = req.getServletContext().getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
}
};
context.addServlet("cloudfoundry", servlet).addMapping("/*");
};
}11. 次のステップ
Graphite (英語) などのグラフ作成ツールについて参照してください。
それ以外の場合は、続けて「デプロイオプション」について読んだり、Spring Boot のビルドツールプラグインに関する詳細情報を読んだりすることができます。