1. 概要

この記事では、SpringBootActuatorを紹介します。 最初に基本事項について説明し、次にSpring Boot2.xと1.xで利用できるものについて詳しく説明します。

Spring Boot 2.xおよびWebFluxでこの監視ツールを使用、構成、および拡張する方法を、リアクティブプログラミングモデルを利用して学習します。 次に、Boot1.xを使用して同じことを行う方法について説明します。

Spring Boot Actuatorは、最初のSpringBootリリースとともに2014年4月から利用可能です。

Spring Boot 2 リリースに伴い、アクチュエーターが再設計され、新しいエキサイティングなエンドポイントが追加されました。

このガイドは、次の3つの主要なセクションに分かれています。

2. アクチュエータとは何ですか?

本質的に、アクチュエータは本番環境に対応した機能をアプリケーションにもたらします。

この依存関係により、アプリの監視、メトリックの収集、トラフィックの理解、またはデータベースの状態が簡単になります。

このライブラリの主な利点は、これらの機能を実際に自分で実装しなくても、実稼働グレードのツールを入手できることです。

アクチュエータは主に、実行中のアプリケーションに関する操作情報(ヘルス、メトリック、情報、ダンプ、環境など)を公開するために使用されます。 HTTPエンドポイントまたはJMXBeanを使用して、HTTPエンドポイントと対話できるようにします。

この依存関係がクラスパスに依存すると、すぐに使用できるいくつかのエンドポイントが利用可能になります。 ほとんどのSpringモジュールと同様に、さまざまな方法で簡単に構成または拡張できます。

2.1. 入門

Spring Boot Actuatorを有効にするには、spring-boot-actuator依存関係をパッケージマネージャーに追加する必要があります。

Mavenの場合:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

バージョンはSpringBootBill of Materials(BOM)で指定されているため、これはブートバージョンに関係なく有効であることに注意してください。

3. SpringBoot2.xアクチュエータ

2.xでは、Actuatorはその基本的な意図を維持しますが、モデルを簡素化し、機能を拡張し、より適切なデフォルトを組み込みます。

まず、このバージョンはテクノロジーに依存しなくなります。 また、アプリケーションモデルとマージすることにより、セキュリティモデルを簡素化します。

さまざまな変更の中で、それらのいくつかが壊れていることを覚えておくことが重要です。 これには、HTTPリクエストとレスポンス、およびJavaAPIが含まれます。

最後に、最新バージョンは、古い読み取り/書き込みモデルではなく、CRUDモデルをサポートするようになりました。

3.1. テクノロジーサポート

2番目のメジャーバージョンでは、アクチュエータはテクノロジーに依存しなくなりましたが、1.xではMVCに関連付けられていたため、サーブレットAPIに関連付けられていました。

2.xでは、Actuatorは、そのモデルをMVCに依存せずにプラグイン可能で拡張可能であると定義しています。

したがって、この新しいモデルを使用すると、MVCとWebFluxを基盤となるWebテクノロジーとして利用できます。

さらに、適切なアダプターを実装することにより、今後のテクノロジーを追加することができます。

最後に、JMXは、追加のコードなしでエンドポイントを公開するために引き続きサポートされます。

3.2. 重要な変更

以前のバージョンとは異なり、アクチュエータにはほとんどのエンドポイントが無効になっています。

したがって、デフォルトで使用できるのは /health/infoの2つだけです。

それらすべてを有効にする場合は、 management.endpoints.web.exposure.include =*を設定できます。 または、有効にする必要があるエンドポイントを一覧表示することもできます。

Actuatorは、セキュリティ構成を通常のAppセキュリティルールと共有するようになったため、セキュリティモデルが大幅に簡素化されました。

したがって、アクチュエータのセキュリティルールを微調整するには、 / actuator /**のエントリを追加するだけです。

@Bean
public SecurityWebFilterChain securityWebFilterChain(
  ServerHttpSecurity http) {
    return http.authorizeExchange()
      .pathMatchers("/actuator/**").permitAll()
      .anyExchange().authenticated()
      .and().build();
}

詳細については、最新のアクチュエータ公式ドキュメントをご覧ください。

また、デフォルトでは、すべてのアクチュエータエンドポイントが/actuatorパスの下に配置されるようになりました。

以前のバージョンと同じように、新しいプロパティmanagement.endpoints.web.base-path。を使用してこのパスを微調整できます。

3.3. 事前定義されたエンドポイント

いくつかの利用可能なエンドポイントを見てみましょう。それらのほとんどはすでに1.xで利用可能でした。

また、一部のエンドポイントが追加され、一部が削除され、一部が再構築されました

  • / auditevents は、ユーザーのログイン/ログアウトなどのセキュリティ監査関連のイベントを一覧表示します。 また、他のフィールドの中でプリンシパルまたはタイプでフィルタリングできます。
  • / beans は、BeanFactoryで使用可能なすべてのBeanを返します。 / auditevents とは異なり、フィルタリングはサポートされていません。
  • / conditions (以前は/ autoconfig と呼ばれていました)は、自動構成に関する条件のレポートを作成します。
  • / configprops を使用すると、すべての@ConfigurationPropertiesBeanをフェッチできます。
  • /envは現在の環境プロパティを返します。 さらに、単一のプロパティを取得できます。
  • / flyway は、Flywayデータベースの移行に関する詳細を提供します。
  • / health は、アプリケーションのヘルスステータスを要約します。
  • / heapdump は、アプリケーションで使用されるJVMからヒープダンプを構築して返します。
  • /infoは一般的な情報を返します。 カスタムデータ、ビルド情報、または最新のコミットに関する詳細である可能性があります。
  • /liquibase/flyway と同じように動作しますが、Liquibase用です。
  • /logfileは通常のアプリケーションログを返します。
  • / loggers を使用すると、アプリケーションのログレベルを照会および変更できます。
  • /metricsアプリケーションの詳細なメトリック。 これには、一般的なメトリックとカスタムメトリックが含まれる場合があります。
  • / prometheus は前のメトリックと同様のメトリックを返しますが、Prometheusサーバーで動作するようにフォーマットされています。
  • / scheduledtasks は、アプリケーション内のすべてのスケジュールされたタスクに関する詳細を提供します。
  • / sessions は、SpringSessionを使用している場合のHTTPセッションを一覧表示します。
  • / shutdown は、アプリケーションの正常なシャットダウンを実行します。
  • / threaddump は、基盤となるJVMのスレッド情報をダンプします。

3.4. アクチュエータエンドポイント用のハイパーメディア

Spring Bootは、使用可能なすべてのアクチュエータエンドポイントへのリンクを返す検出エンドポイントを追加します。 これにより、アクチュエータのエンドポイントとそれに対応するURLの検出が容易になります。

デフォルトでは、この検出エンドポイントには/アクチュエーターエンドポイントからアクセスできます。

したがって、 GET リクエストをこのURLに送信すると、さまざまなエンドポイントのアクチュエータリンクが返されます。

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "features-arg0": {
      "href": "http://localhost:8080/actuator/features/{arg0}",
      "templated": true
    },
    "features": {
      "href": "http://localhost:8080/actuator/features",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8080/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8080/actuator/caches/{cache}",
      "templated": true
    },
    // truncated
}

上に示したように、 /アクチュエータエンドポイントは、_linksフィールドの下で使用可能なすべてのアクチュエータエンドポイントを報告します。

さらに、カスタム管理ベースパスを構成する場合は、そのベースパスを検出URLとして使用する必要があります。

たとえば、management.endpoints.web.base-path/mgmt に設定した場合、 /mgmtエンドポイントにリクエストを送信する必要があります。リンクのリストを参照してください。

非常に興味深いことに、管理ベースパスが / に設定されている場合、他のマッピングとの衝突の可能性を防ぐために、検出エンドポイントが無効になります。

3.5. 健康指標

以前のバージョンと同様に、カスタムインジケーターを簡単に追加できます。 他のAPIとは異なり、カスタムヘルスエンドポイントを作成するための抽象化は変更されていません。 ただし、新しいインターフェイスReactiveHealthIndicatorが追加され、リアクティブヘルスチェックが実装されています。

簡単なカスタムリアクティブヘルスチェックを見てみましょう。

@Component
public class DownstreamServiceHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {
        return checkDownstreamServiceHealth().onErrorResume(
          ex -> Mono.just(new Health.Builder().down(ex).build())
        );
    }

    private Mono<Health> checkDownstreamServiceHealth() {
        // we could use WebClient to check health reactively
        return Mono.just(new Health.Builder().up().build());
    }
}

健康指標の便利な機能は、階層の一部としてそれらを集約できることです。

したがって、前の例に従って、すべてのダウンストリームサービスを downstream- servicesカテゴリにグループ化できます。 ネストされたすべてのサービスに到達可能である限り、このカテゴリは正常です。

詳細については、健康指標に関する記事をご覧ください。

3.6. 健康グループ

Spring Boot 2.2以降、ヘルスインジケーターをグループに整理し、すべてのグループメンバーに同じ構成を適用できます。

たとえば、 application.properties にこれを追加することで、customという名前のヘルスグループを作成できます。

management.endpoint.health.group.custom.include=diskSpace,ping

このように、カスタムグループには、diskSpaceおよびpingヘルスインジケーターが含まれます。

ここで、 /アクチュエータ/ヘルスエンドポイントを呼び出すと、JSON応答で新しいヘルスグループについて通知されます。

{"status":"UP","groups":["custom"]}

ヘルスグループを使用すると、いくつかのヘルスインジケーターの集計結果を確認できます。

この場合、 /アクチュエータ/ヘルス/カスタムにリクエストを送信すると、次のようになります。

{"status":"UP"}

application.properties を介して、詳細を表示するようにグループを構成できます。

management.endpoint.health.group.custom.show-components=always
management.endpoint.health.group.custom.show-details=always

同じリクエストを/アクチュエータ/ヘルス/カスタムに送信すると、詳細が表示されます。

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 499963170816,
        "free": 91300069376,
        "threshold": 10485760
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

許可されたユーザーに対してのみ、これらの詳細を表示することもできます。

management.endpoint.health.group.custom.show-components=when_authorized
management.endpoint.health.group.custom.show-details=when_authorized

カスタムステータスマッピングを作成することもできます。

たとえば、HTTP 200 OK応答の代わりに、207ステータスコードを返すことができます。

management.endpoint.health.group.custom.status.http-mapping.up=207

ここでは、カスタムグループステータスがUPの場合に207HTTPステータスコードを返すようにSpring Bootに指示しています。

3.7. SpringBoot2のメトリクス

Spring Boot 2.0では、社内のメトリックがMicrometerサポートに置き換えられたため、重大な変更が予想されます。 アプリケーションがGaugeServiceCounterServiceなどのメトリックサービスを使用していた場合、それらは使用できなくなります。

代わりに、マイクロメータと直接対話することが期待されています。 Spring Boot 2.0では、タイプMeterRegistryのBeanが自動構成されます。

さらに、MicrometerはActuatorの依存関係の一部になっているため、Actuatorの依存関係がクラスパスにある限りは問題ありません。

さらに、/metricsエンドポイントから完全に新しい応答を取得します。

{
  "names": [
    "jvm.gc.pause",
    "jvm.buffer.memory.used",
    "jvm.memory.used",
    "jvm.buffer.count",
    // ...
  ]
}

ご覧のとおり、1.xで取得した実際のメトリックはありません。

特定のメトリックの実際の値を取得するために、目的のメトリック( /actuator/metrics/jvm.gc.pause など)に移動して、詳細な応答を取得できます。

{
  "name": "jvm.gc.pause",
  "measurements": [
    {
      "statistic": "Count",
      "value": 3.0
    },
    {
      "statistic": "TotalTime",
      "value": 7.9E7
    },
    {
      "statistic": "Max",
      "value": 7.9E7
    }
  ],
  "availableTags": [
    {
      "tag": "cause",
      "values": [
        "Metadata GC Threshold",
        "Allocation Failure"
      ]
    },
    {
      "tag": "action",
      "values": [
        "end of minor GC",
        "end of major GC"
      ]
    }
  ]
}

現在、メトリックは、さまざまな値だけでなく、いくつかの関連するメタデータも含めて、はるかに徹底的です。

3.8. /infoエンドポイントのカスタマイズ

/infoエンドポイントは変更されません。 以前と同様に、それぞれのMavenまたはGradleの依存関係を使用してgitの詳細を追加できます

<dependency>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
</dependency>

同様に、 MavenまたはGradleプラグインを使用して、名前、グループ、バージョンなどのビルド情報を含めることもできます。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>build-info</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3.9. カスタムエンドポイントの作成

前に指摘したように、カスタムエンドポイントを作成できます。 ただし、Spring Boot 2は、これを実現する方法を再設計して、テクノロジーにとらわれない新しいパラダイムをサポートしています。

アプリケーションで機能フラグを照会、有効化、および無効化するためのアクチュエータエンドポイントを作成しましょう

@Component
@Endpoint(id = "features")
public class FeaturesEndpoint {

    private Map<String, Feature> features = new ConcurrentHashMap<>();

    @ReadOperation
    public Map<String, Feature> features() {
        return features;
    }

    @ReadOperation
    public Feature feature(@Selector String name) {
        return features.get(name);
    }

    @WriteOperation
    public void configureFeature(@Selector String name, Feature feature) {
        features.put(name, feature);
    }

    @DeleteOperation
    public void deleteFeature(@Selector String name) {
        features.remove(name);
    }

    public static class Feature {
        private Boolean enabled;

        // [...] getters and setters 
    }

}

エンドポイントを取得するには、Beanが必要です。 この例では、これに@Componentを使用しています。 また、このBeanを@Endpointで装飾する必要があります。

エンドポイントのパスは、@Endpointのid パラメーターによって決定されます。この場合、リクエストは / actuator /featuresにルーティングされます。

準備ができたら、次を使用して操作の定義を開始できます。

  • @ReadOperation :HTTP GETにマップされます。
  • @WriteOperation :HTTP POSTにマップされます。
  • @DeleteOperation :HTTP DELETEにマップされます。

アプリケーションの前のエンドポイントでアプリケーションを実行すると、SpringBootがそれを登録します。

これを確認する簡単な方法は、ログを確認することです。

[...].WebFluxEndpointHandlerMapping: Mapped "{[/actuator/features/{name}],
  methods=[GET],
  produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features],
  methods=[GET],
  produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features/{name}],
  methods=[POST],
  consumes=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features/{name}],
  methods=[DELETE]}"[...]

以前のログでは、WebFluxが新しいエンドポイントをどのように公開しているかを確認できます。 MVCに切り替えると、コードを変更することなく、そのテクノロジーを委任するだけです。

また、この新しいアプローチで覚えておくべきいくつかの重要な考慮事項があります。

  • MVCとの依存関係はありません。
  • 以前のメソッドとして存在していたすべてのメタデータ( sensitive、enabled…)はもう存在しません。 ただし、 @Endpoint(id =“ features”、enableByDefault = false)を使用して、エンドポイントを有効または無効にすることができます。
  • 1.xとは異なり、特定のインターフェイスを拡張する必要はありません。
  • 以前の読み取り/書き込みモデルとは対照的に、@DeleteOperationを使用してDELETE操作を定義できるようになりました。

3.10. 既存のエンドポイントの拡張

アプリケーションの本番インスタンスがSNAPSHOTバージョンにならないようにしたいとします。

これを行うには、この情報を返すアクチュエータエンドポイントのHTTPステータスコード( / info )を変更します。 アプリがたまたまSNAPSHOTの場合、別のHTTPステータスコードを取得します。

@EndpointExtensionアノテーション、またはそのより具体的な特殊化@EndpointWebExtensionまたは@EndpointJmxExtensionを使用して、事前定義されたエンドポイントの動作を簡単に拡張できます。

@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {

    private InfoEndpoint delegate;

    // standard constructor

    @ReadOperation
    public WebEndpointResponse<Map> info() {
        Map<String, Object> info = this.delegate.info();
        Integer status = getStatus(info);
        return new WebEndpointResponse<>(info, status);
    }

    private Integer getStatus(Map<String, Object> info) {
        // return 5xx if this is a snapshot
        return 200;
    }
}

3.11. すべてのエンドポイントを有効にする

HTTPを使用してアクチュエータエンドポイントにアクセスするには、それらを有効にして公開する必要があります。

デフォルトでは、 /shutdownを除くすべてのエンドポイントが有効になっています。 デフォルトでは、 /healthおよび/infoエンドポイントのみが公開されます。

すべてのエンドポイントを公開するには、次の構成を追加する必要があります。

management.endpoints.web.exposure.include=*

特定のエンドポイント( / shutdownなど)を明示的に有効にするには、を使用します。

management.endpoint.shutdown.enabled=true

1つ( / loggers など)を除くすべての有効なエンドポイントを公開するには、次を使用します。

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=loggers

4. SpringBoot1.xアクチュエータ

1.xでは、アクチュエータは読み取り/書き込みモデルに従います。つまり、アクチュエータから読み取りまたは書き込みを行うことができます。

たとえば、メトリックやアプリケーションの状態を取得できます。 または、アプリを正常に終了するか、ログ設定を変更することもできます。

Actuatorを機能させるには、SpringMVCがHTTPを介してエンドポイントを公開する必要があります。 他のテクノロジーはサポートされていません。

4.1. エンドポイント

1.xでは、アクチュエータは独自のセキュリティモデルをもたらします。 Spring Security構造を利用しますが、アプリケーションの他の部分から独立して構成する必要があります。

また、ほとんどのエンドポイントは機密性が高く、完全に公開されていないか、ほとんどの情報が省略されますが、 /infoなどの少数のエンドポイントは機密情報ではありません。

Bootがすぐに提供する最も一般的なエンドポイントのいくつかを次に示します。

  • / health は、アプリケーションのヘルス情報を表示します(認証されていない接続を介してアクセスされた場合は単純な status 、認証された場合は完全なメッセージの詳細)。 デフォルトでは機密ではありません。
  • /infoは任意のアプリケーション情報を表示します。 デフォルトでは機密ではありません。
  • /metricsは現在のアプリケーションのメトリクス情報を表示します。 デフォルトでは機密です。
  • / trace は、トレース情報(デフォルトでは最後のいくつかのHTTP要求)を表示します。

上の既存のエンドポイントの完全なリストは、公式ドキュメントにあります。

4.2. 既存のエンドポイントの構成

エンドポイント。[エンドポイント名]。[カスタマイズするプロパティ]の形式を使用して、プロパティを使用して各エンドポイントをカスタマイズできます。

次の3つのプロパティを使用できます。

  • id :このエンドポイントにHTTP経由でアクセスします
  • enabled :trueの場合、アクセスできます。 それ以外の場合は
  • sensitive :trueの場合、HTTPを介して重要な情報を表示するための認証が必要です

たとえば、次のプロパティを追加すると、/ Beansエンドポイントがカスタマイズされます。

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true

4.3. /healthエンドポイント

/ health エンドポイントは、実行中のアプリケーションのヘルスまたは状態をチェックするために使用されます。

これは通常、監視ソフトウェアによって実行され、実行中のインスタンスがダウンしたり、DBとの接続の問題、ディスク容量の不足などの他の理由で異常になった場合に警告します。

デフォルトでは、許可されていないユーザーは、HTTP経由でアクセスする場合にのみステータス情報を表示できます。

{
    "status" : "UP"
}

このヘルス情報は、アプリケーションコンテキストで構成されたHealthIndicatorインターフェースを実装するすべてのBeanから収集されます。

HealthIndicator によって返される一部の情報は本質的に機密情報ですが、 endpoints.health.sensitive = false を構成して、ディスクスペース、メッセージングブローカー接続、カスタムチェック、もっと。

これは、1.5.0より前のSpringBootバージョンでのみ機能することに注意してください。 1.5.0以降のバージョンでは、不正アクセスに対して management.security.enabled = false を設定して、セキュリティも無効にする必要があります。

また、独自のカスタムヘルスインジケーターを実装することもできます。これにより、アプリケーションに固有の任意のタイプのカスタムヘルスデータを収集し、 /healthエンドポイントを介して自動的に公開できます。

@Component("myHealthCheck")
public class HealthCheck 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();
    }
    
    public int check() {
    	// Our logic to check health
    	return 0;
    }
}

出力は次のようになります。

{
    "status" : "DOWN",
    "myHealthCheck" : {
        "status" : "DOWN",
        "Error Code" : 1
     },
     "diskSpace" : {
         "status" : "UP",
         "free" : 209047318528,
         "threshold" : 10485760
     }
}

4.4. /infoエンドポイント

/infoエンドポイントによって表示されるデータをカスタマイズすることもできます。

info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application
info.app.version=1.0.0

そしてサンプル出力:

{
    "app" : {
        "version" : "1.0.0",
        "description" : "This is my first spring boot application",
        "name" : "Spring Sample Application"
    }
}

4.5. /metricsエンドポイント

メトリクスエンドポイントは、OSとJVMに関する情報、およびアプリケーションレベルのメトリクスを公開します。有効にすると、メモリ、ヒープ、プロセッサ、スレッド、ロードされたクラス、アンロードされたクラス、スレッドプールなどの情報が取得されます。一部のHTTPメトリックも同様です。

このエンドポイントの出力は、箱から出してすぐに次のようになります。

{
    "mem" : 193024,
    "mem.free" : 87693,
    "processors" : 4,
    "instance.uptime" : 305027,
    "uptime" : 307077,
    "systemload.average" : 0.11,
    "heap.committed" : 193024,
    "heap.init" : 124928,
    "heap.used" : 105330,
    "heap" : 1764352,
    "threads.peak" : 22,
    "threads.daemon" : 19,
    "threads" : 22,
    "classes" : 5819,
    "classes.loaded" : 5819,
    "classes.unloaded" : 0,
    "gc.ps_scavenge.count" : 7,
    "gc.ps_scavenge.time" : 54,
    "gc.ps_marksweep.count" : 1,
    "gc.ps_marksweep.time" : 44,
    "httpsessions.max" : -1,
    "httpsessions.active" : 0,
    "counter.status.200.root" : 1,
    "gauge.response.root" : 37.0
}

カスタムメトリックを収集するために、ゲージ(データの単一値スナップショット)とカウンター、つまりメトリックのインクリメント/デクリメントがサポートされています。

独自のカスタムメトリックを/metricsエンドポイントに実装しましょう。

ログインフローをカスタマイズして、成功したログイン試行と失敗したログイン試行を記録します。

@Service
public class LoginServiceImpl {

    private final CounterService counterService;
    
    public LoginServiceImpl(CounterService counterService) {
        this.counterService = counterService;
    }
	
    public boolean login(String userName, char[] password) {
        boolean success;
        if (userName.equals("admin") && "secret".toCharArray().equals(password)) {
            counterService.increment("counter.login.success");
            success = true;
        }
        else {
            counterService.increment("counter.login.failure");
            success = false;
        }
        return success;
    }
}

出力は次のようになります。

{
    ...
    "counter.login.success" : 105,
    "counter.login.failure" : 12,
    ...
}

ログイン試行およびその他のセキュリティ関連のイベントは、Actuatorの箱から出して監査イベントとして利用できることに注意してください。

4.6. 新しいエンドポイントの作成

Spring Bootが提供する既存のエンドポイントを使用することに加えて、まったく新しいエンドポイントを作成することもできます。

まず、新しいエンドポイントに実装する必要があります終点インターフェース:

@Component
public class CustomEndpoint implements Endpoint<List<String>> {
    
    @Override
    public String getId() {
        return "customEndpoint";
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public boolean isSensitive() {
        return true;
    }

    @Override
    public List<String> invoke() {
        // Custom logic to build the output
        List<String> messages = new ArrayList<String>();
        messages.add("This is message 1");
        messages.add("This is message 2");
        return messages;
    }
}

この新しいエンドポイントにアクセスするには、そのidを使用してマップします。 つまり、 /customEndpointを押して実行することができます。

出力:

[ "This is message 1", "This is message 2" ]

4.7. さらなるカスタマイズ

セキュリティ上の理由から、非標準ポートを介してアクチュエータエンドポイントを公開することを選択する場合があります。management.portプロパティを使用して簡単に構成できます。

また、すでに述べたように、1.xでは。 Actuatorは、Spring Securityに基づいて独自のセキュリティモデルを構成しますが、アプリケーションの他の部分からは独立しています。

したがって、 management.address プロパティを変更して、ネットワーク経由でエンドポイントにアクセスできる場所を制限できます。

#port used to expose actuator
management.port=8081 

#CIDR allowed to hit actuator
management.address=127.0.0.1 

#Whether security should be enabled or disabled altogether
management.security.enabled=false

さらに、 / info を除くすべての組み込みエンドポイントは、デフォルトで機密性があります。

アプリケーションがSpringSecurityを使用している場合、 application.properties ファイルでデフォルトのセキュリティプロパティ(ユーザー名、パスワード、および役割)を定義することにより、これらのエンドポイントを保護できます。

security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER

5. 結論

この記事では、SpringBootActuatorについて説明しました。 まず、アクチュエータの意味とそれが私たちのために何をするかを定義することから始めました。

次に、現在のSpring Bootバージョン2.xのアクチュエーターに焦点を当て、その使用方法、調整方法、および拡張方法について説明しました。 また、この新しいイテレーションで見つけることができる重要なセキュリティの変更についても話しました。 いくつかの人気のあるエンドポイントと、それらがどのように変化したかについても説明しました。

次に、以前のSpringBoot1バージョンでアクチュエータについて説明しました。

最後に、アクチュエータをカスタマイズおよび拡張する方法を示しました。

いつものように、この記事で使用されているコードは、 Spring Boot2.xSpringBoot1.xの両方のGitHubにあります。