Spring Boot Actuatorエンドポイントを使用すると、アプリケーションをモニターし、対話することができます。Spring ActuatorはSpring Bootのサブモジュールであり、アプリケーションで有効および無効にできる組み込みのエンドポイントを提供します。
Spring Boot Actuatorエンドポイント
Spring Boot ActuatorエンドポイントはJMXおよびHTTPで公開されており、ほとんどの場合、HTTPベースのActuatorエンドポイントを使用します。なぜなら、これらはブラウザ、CURLコマンド、シェルスクリプトなどで簡単にアクセスできるからです。便利なアクチュエータエンドポイントのいくつかは次のとおりです:
- beans:このエンドポイントは、アプリケーションで構成されているすべてのビーンのリストを返します。
- env:Spring Environmentプロパティに関する情報を提供します。
- health:アプリケーションの健康状態を表示します。
- info:アプリケーション情報を表示し、Spring環境プロパティでこれを構成できます。
- mappings:すべての@RequestMappingパスのリストを表示します。
- shutdown:アプリケーションを優雅にシャットダウンできます。
- 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