スプリングブートアクチュエータエンドポイント
Spring Boot Actuatorのエンドポイントを使用すると、アプリケーションを監視し、操作することができます。Spring ActuatorはSpring Bootのサブモジュールであり、アプリケーションのために有効または無効にすることができる組み込みのエンドポイントを提供します。
スプリングブートアクチュエーターエンドポイント
Spring Boot ActuatorのエンドポイントはJMXとHTTPで公開されており、ほとんどの場合、ブラウザやCURLコマンド、シェルスクリプトなどで簡単にアクセスできるHTTPベースのActuatorエンドポイントが使用されます。便利なActuatorエンドポイントのいくつかは次のとおりです。
-
- beans: このエンドポイントは、アプリケーションに設定されたすべてのビーンのリストを返します。
-
- env: Spring Environment プロパティに関する情報を提供します。
-
- health: アプリケーションの健康状態を表示します。
-
- info: アプリケーションの情報を表示します。Spring 環境プロパティで設定することができます。
-
- mappings: @RequestMapping パスのリストを表示します。
-
- shutdown: アプリケーションを正常にシャットダウンすることができます。
- threaddump: アプリケーションのスレッドダンプを提供します。
こちらから、スプリングアクチュエータエンドポイントの完全なリストを取得することができます。
Springアクチュエータのエンドポイントセキュリティ
「health」と「info」エンドポイントだけがセキュリティなしで公開されており、他のすべてのエンドポイントにアクセスするためには、Spring Securityをアプリケーションに設定する必要があります。これは非常に簡単に実現できます。チュートリアルの後半で説明します。
Springのアクチュエーターエンドポイントを有効にする。
私たちのSpring BootプロジェクトにSpring Actuatorの依存関係を追加すると、自動的にアクチュエータエンドポイントが有効になります。Spring Bootアクチュエータエンドポイントを有効にするために、以下の依存関係を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>)
info.app.name=Spring Actuator Example
info.app.java.version=10
info.app.type=Spring Boot
アクチュエーターのエンドポイントのベースパスをカスタマイズする
デフォルトでは、アクチュエーターのエンドポイントのベースパスは/actuatorです。しかし、application propertiesファイルで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の依存関係を追加してください。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
また、アプリケーションのプロパティファイルにSpring Securityのユーザー名とパスワードを追加してください。
spring.security.user.name=scdev
spring.security.user.password=scdev
アプリケーションを再起動すると、追加のエンドポイントがマッピングされているのを確認できます。
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>)
春のアクチュエーターカスタムエンドポイント
Spring Frameworkの素晴らしい機能の1つは、拡張が非常に簡単であることです。@Endpointアノテーションをクラスに使用することで、独自のアクチュエータエンドポイントを作成することができます。その後、@ReadOperation、@WriteOperation、または@DeleteOperationアノテーションをメソッドに使用して、それらをアクチュエータエンドポイントのビーンとして公開する必要があります。@JmxEndpointおよび@WebEndpointアノテーションを使用して、技術固有のエンドポイントを作成することもできます。以下に、独自のSpringアクチュエータエンドポイントの例を示します。
package com.scdev.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リポジトリから、プロジェクト全体をダウンロードすることができます。