Spring Boot Actuatorエンドポイント

Spring Boot Actuatorエンドポイントを使用すると、アプリケーションをモニターし、対話することができます。Spring ActuatorはSpring Bootのサブモジュールであり、アプリケーションで有効および無効にできる組み込みのエンドポイントを提供します。

Spring Boot Actuatorエンドポイント

Spring Boot ActuatorエンドポイントはJMXおよびHTTPで公開されており、ほとんどの場合、HTTPベースのActuatorエンドポイントを使用します。なぜなら、これらはブラウザ、CURLコマンド、シェルスクリプトなどで簡単にアクセスできるからです。便利なアクチュエータエンドポイントのいくつかは次のとおりです:

  1. beans:このエンドポイントは、アプリケーションで構成されているすべてのビーンのリストを返します。
  2. env:Spring Environmentプロパティに関する情報を提供します。
  3. health:アプリケーションの健康状態を表示します。
  4. info:アプリケーション情報を表示し、Spring環境プロパティでこれを構成できます。
  5. mappings:すべての@RequestMappingパスのリストを表示します。
  6. shutdown:アプリケーションを優雅にシャットダウンできます。
  7. threaddump:アプリケーションのスレッドダンプを提供します。

こちらから、Springアクチュエーターエンドポイントの完全なリストを取得できます。

Springアクチュエーターエンドポイントのセキュリティ

「health」と「info」エンドポイントのみがセキュリティなしで公開されており、他のすべてのエンドポイントにアクセスするには、Springセキュリティでアプリケーションを構成する必要があります。これは非常に簡単に実現できます。チュートリアルの後半で説明します。

Springアクチュエーターエンドポイントを有効にする

SpringブートプロジェクトにSpringアクチュエーターの依存関係を追加すると、自動的にアクチュエーターエンドポイントが有効になります。Springブートアクチュエーターエンドポイントを有効にするには、Springアプリケーションに以下の依存関係を追加してください。

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

アプリケーションを実行すると、ログにアクチュエーターエンドポイントがマッピングされているのが見えます。

2018-06-19 15:23:20.715  INFO 6493 --- [main] o.s.b.a.e.web.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2018-06-19 15:23:20.723  INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 15:23:20.724  INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

healthおよびinfoの2つのエンドポイントのみがマップされていることに注意してください。以下の画像は、これらのアクチュエータエンドポイントの出力を示しています。/actuator/infoにデータがないことに気付きましたか?それは、まだそれらを設定していないためです。次のプロパティをapplication.propertiesファイルに追加してください。

info.app.name=Spring Actuator Example
info.app.java.version=10
info.app.type=Spring Boot

アプリケーションを再起動すると、次の出力が得られます:

アクチュエータエンドポイントのベースパスをカスタマイズ

デフォルトでは、アクチュエータエンドポイントのベースパスは/actuatorですが、management.endpoints.web.base-pathをアプリケーションプロパティファイルに設定することで、任意の値に変更できます。

management.endpoints.web.base-path=/management

他のアクチュエータエンドポイントを公開する

他のアクチュエータエンドポイントを有効または無効にすることができます。すべてのアクチュエータエンドポイントを有効にしたい場合は、次のプロパティを追加してください。

management.endpoints.web.exposure.include=*

特定のアクチュエータエンドポイントのみを有効にするには、エンドポイントIDのリストを提供します。

management.endpoints.web.exposure.include=health,info,beans,env

アクチュエータエンドポイントのためのSpring Security

追加のエンドポイントを有効にするためには、Spring Securityをアプリケーションに追加する必要があることに注意してください。なぜなら、他のすべてのエンドポイントは少なくとも基本認証を必要とするからです。アプリケーションにspring securityの依存関係を追加します。

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

また、アプリケーションプロパティファイルにspring securityのユーザー名とパスワードを追加します。

spring.security.user.name=pankaj
spring.security.user.password=pankaj

アプリケーションを再起動すると、追加のエンドポイントがマッピングされているのを見ることができます。

2018-06-19 16:18:22.211  INFO 6627 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/beans],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212  INFO 6627 --- [           main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212  INFO 6627 --- [           main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env/{toMatch}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

保護されたアクチュエータエンドポイントにアクセスしようとすると、ログイン資格情報を提供する必要があります。以下の画像はbeansおよびenv/java.homeエンドポイントの応答を示しています。

Springアクチュエータカスタムエンドポイント

Spring Frameworkの素晴らしい機能の1つは、拡張が非常に簡単であることです。クラスに@Endpoint注釈を使用して独自のアクチュエータエンドポイントを作成できます。その後、メソッドに@ReadOperation@WriteOperation、または@DeleteOperation注釈を使用して、それらをアクチュエータエンドポイントビーンとして公開する必要があります。技術固有のエンドポイントは、@JmxEndpointおよび@WebEndpoint注釈を使用して作成できます。以下は、独自のSpringアクチュエータエンドポイントの例です。

package com.journaldev.spring;

import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Endpoint(id="myendpoint")
@Component
public class MyCustomEndpoints {

	@ReadOperation
	@Bean
	public String hi() {
		return "Hi from custom endpoint";
	}
}

エンドポイントIDに気付きましたか?これを有効にするアクチュエータエンドポイントのリストにもこれを構成する必要があります。次のプロパティをapplication.propertiesファイルで更新してください。

management.endpoints.web.exposure.include=health,info,beans,env,myendpoint

アプリケーションを起動すると、ログにこの新しいエンドポイントがマップされているかどうかを確認してください。

2018-06-19 17:06:59.743  INFO 6739 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/myendpoint],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

以下の画像は、独自のアクチュエータエンドポイントを呼び出したときの出力を示しています。

要約

Spring Boot Actuatorは、本番用の管理および情報モジュールです。独自のAPIを追加してアプリケーションを管理することが簡単にできます。

完全なプロジェクトは、GitHubリポジトリからダウンロードできます。

Source:
https://www.digitalocean.com/community/tutorials/spring-boot-actuator-endpoints