Actuator端点让你监视和与应用程序交互,Spring Boot包含许多内置的端点,并容许你添加本身的端点。例如,health
端点提供基本的应用程序健康信息。html
能够启用或禁用每一个单独的端点,这将控制端点是否被建立,以及它的bean是否存在于应用程序上下文中,要实现远程访问,端点还必须经过JMX或HTTP公开,大多数应用程序选择HTTP,将端点的ID与/actuator
的前缀映射到URL。例如,默认状况下,health
端点映射到/actuator/health
。java
可使用如下与技术无关的端点:git
ID | 描述 | 默认启用 |
---|---|---|
auditevents |
公开当前应用程序的审计事件信息 | Yes |
beans |
显示应用程序中全部Spring bean的完整列表 | Yes |
conditions |
显示在配置和自动配置类上评估的条件以及它们是否匹配的缘由 | Yes |
configprops |
显示全部@ConfigurationProperties 对照的列表 |
Yes |
env |
从Spring的ConfigurableEnvironment 中公开属性 |
Yes |
flyway |
显示已应用的任何Flyway数据库迁移 | Yes |
health |
显示应用程序健康信息 | Yes |
httptrace |
显示HTTP跟踪信息(默认状况下,最后100个HTTP请求-响应交互) | Yes |
info |
显示任意应用程序信息 | Yes |
loggers |
显示和修改应用程序中记录器的配置 | Yes |
liquibase |
显示已应用的任何Liquibase数据库迁移 | Yes |
metrics |
显示当前应用程序的“指标”信息 | Yes |
mappings |
显示全部@RequestMapping 路径对照的列表 |
Yes |
scheduledtasks |
显示应用程序中调度的任务 | Yes |
sessions |
容许从Spring session支持的会话存储中检索和删除用户会话,在使用Spring会话对响应性web应用程序的支持时不可用 | Yes |
shutdown |
让应用程序优雅地关闭 | No |
threaddump |
执行线程转储 | Yes |
若是你的应用程序是一个web应用程序(Spring MVC、Spring WebFlux或Jersey),你可使用如下附加端点:github
ID | 描述 | 默认启用 |
---|---|---|
heapdump |
返回一个GZip压缩的hprof 堆转储文件 |
Yes |
jolokia |
在HTTP上公开JMX bean(当Jolokia在类路径上时,WebFlux不可用) | Yes |
logfile |
返回日志文件的内容(若是是logging.file 或loggin.path 属性已经设置了),支持使用HTTP Range header来检索日志文件内容的一部分 |
Yes |
prometheus |
公开指标,该格式能够被Prometheus服务器采集 | Yes |
要了解有关Actuator的端点及其请求和响应格式的更多信息,请参考单独的API文档(HTML 或 PDF)。web
默认状况下,除了shutdown
以外的全部端点都启用了,要配置端点的启动,可使用它的management.endpoint.<id>.enabled
属性,下面的示例启用关闭端点:redis
management.endpoint.shutdown.enabled=true
若是你更喜欢端点opt-in而不是opt-out,设置management.endpoints.enabled-by-default
属性为false
并使用单独的端点启用属性来选择返回,下面的示例启用info
端点并禁用全部其余端点:spring
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true
禁用的端点彻底从应用程序上下文中删除,若是你只想更改端点暴露的技术,则使用include
和exclude
属性代替。
因为端点可能包含敏感信息,因此应该仔细考虑什么时候公开它们,下表显示了默认公开的内置端点:数据库
ID | JMX | Web |
---|---|---|
auditevents |
Yes | No |
beans |
Yes | No |
conditions |
Yes | No |
configprops |
Yes | No |
env |
Yes | No |
flyway |
Yes | No |
health |
Yes | Yes |
heapdump |
N/A | No |
httptrace |
Yes | No |
info |
Yes | Yes |
jolokia |
N/A | No |
logfile |
N/A | No |
loggers |
Yes | No |
liquibase |
Yes | No |
metrics |
Yes | No |
mappings |
Yes | No |
prometheus |
N/A | No |
scheduledtasks |
Yes | No |
sessions |
Yes | No |
shutdown |
Yes | No |
threaddump |
Yes | No |
要更改公开的端点,请使用如下技术特定的include
和exclude
属性:json
属性 | 默认 |
---|---|
management.endpoints.jmx.exposure.exclude |
|
management.endpoints.jmx.exposure.include |
* |
management.endpoints.web.exposure.exclude |
|
management.endpoints.web.exposure.include |
info, health |
include
属性列出了公开的端点的id,exclude
属性列出不该公开的端点的id,exclude
属性优先于include
属性,include
和exclude
属性均可以使用端点id列表进行配置。segmentfault
例如,要中止在JMX上公开全部端点,而且只公开health
和info
端点,请使用如下属性:
management.endpoints.jmx.exposure.include=health,info
*
可用于选择全部端点,例如,要经过HTTP公开除env
和beans
端点以外的全部内容,请使用如下属性:
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans
*
在YAML中有特殊的含义,因此若是要包含(或排除)全部端点,请务必添加引号,以下例所示:
management: endpoints: web: exposure: include: "*"
若是你的应用程序是对外公开的,咱们强烈建议你也保护你的端点。
若是你想要当端点暴露时实现本身的策略,能够注册
EndpointFilter
bean。
你应该注意保护HTTP端点的方式,就像保护其余敏感URL同样,若是存在Spring Security,则使用Spring Security的内容协商策略默认保护端点。若是你但愿为HTTP端点配置自定义安全性,例如,只容许具备特定角色的用户访问它们,Spring Boot提供了一些方便的RequestMatcher
对象,能够与Spring Security结合使用。
一个典型的Spring安全配置可能以下面的示例所示:
@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests() .anyRequest().hasRole("ENDPOINT_ADMIN") .and() .httpBasic(); } }
前面的示例使用EndpointRequest.toAnyEndpoint()
匹配任何端点的请求,而后确保全部端点都具备ENDPOINT_ADMIN
角色,在EndpointRequest
上还有几个其余的matcher方法,详情请参阅API文档(HTML 或 PDF)。
若是你将应用程序部署到防火墙后,你可能但愿能够在不须要身份验证的状况下访问全部actuator端点,你能够经过更改management.endpoints.web.exposure.include
属性来实现这一点,以下:
application.properties
management.endpoints.web.exposure.include=*
此外,若是存在Spring Security,则须要添加自定义安全配置,容许对端点进行未经身份验证的访问,以下面的示例所示:
@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests() .anyRequest().permitAll() } }
端点为不带任何参数的读取操做自动缓存响应,要配置端点缓存响应的时间量,请使用cache.time-to-live
属性,下面的示例将beans
端点缓存的生存时间设置为10秒:
application.properties
management.endpoint.beans.cache.time-to-live=10s
前缀management.endpoint.<name>
用于唯一地标识正在配置的端点。在发出通过身份验证的HTTP请求时,
Principal
被认为是端点的输入,所以不会缓存响应。
一个连接全部端点的“discovery页面”被添加,默认状况下,“ discovery页面”在/actuator
上可用。
配置自定义管理上下文路径时,“discovery页面”自动从/actuator
移动到管理上下文的根,例如,若是管理上下文路径是/management
,那么能够从/management
得到discovery页面,当管理上下文路径被设置为/
时,discovery页面被禁用,以防止与其余映射发生冲突。
默认状况下,经过使用端点的ID在/actuator
路径下经过HTTP公开端点,例如,beans
端点在/actuator/beans
下公开,若是但愿将端点映射到不一样的路径,可使用management.endpoints.web.path-mapping
属性,另外,若是你想要更改基本路径,你可使用management.endpoints.web.base-path
。
如下示例将从新映射/actuator/health
到/healthcheck
:
application.properties
management.endpoints.web.base-path=/ management.endpoints.web.path-mapping.health=healthcheck
跨源资源共享(CORS)是W3C规范,容许你灵活地指定受权的跨域请求类型,若是你使用Spring MVC或Spring WebFlux,能够配置Actuator的web端点来支持这些场景。
CORS支持在默认状况下是禁用的,而且只在management.endpoints.web.cors.allowed-origins
属性已设置时才启用,如下配置容许从example.com域GET
和POST
调用:
management.endpoints.web.cors.allowed-origins=http://example.com management.endpoints.web.cors.allowed-methods=GET,POST
有关选项的完整列表,请参见 CorsEndpointProperties
若是你添加一个带@Endpoint
注解的@Bean
,那么任何带@ReadOperation
、@WriteOperation
或@DeleteOperation
的方法都会自动地经过JMX公开,在web应用程序中,也会经过HTTP公开,可使用Jersey、Spring MVC或Spring WebFlux经过HTTP公开端点。
你还可使用@JmxEndpoint
或@WebEndpoint
来编写特定于技术的端点,这些端点仅限于各自的技术,例如,@WebEndpoint
仅经过HTTP公开,而不是经过JMX公开。
可使用@EndpointWebExtension
和@EndpointJmxExtension
编写特定于技术的扩展,这些注解容许你提供特定于技术的操做,以加强现有的端点。
最后,若是你须要访问特定于web框架的功能,你能够实现Servlet或Spring @Controller
和@RestController
端点,代价是它们在JMX上不可用,或者在使用不一样的web框架时不可用。
端点上的操做经过它们的参数接收输入,当经过web公开时,这些参数的值取自URL的查询参数和JSON请求体,当经过JMX公开时,参数被映射到MBean操做的参数,默认状况下须要参数,可使用@org.springframework.lang.Nullable
对它们进行注解,从而使它们成为可选的。
容许将输入映射到操做方法的参数,实现端点的Java代码应该用-parameters
编译,而且实现端点的Kotlin代码应该用-java-parameters
编译,若是你使用Spring Boot的Gradle插件,或者使用Maven和spring-boot-starter-parent
,这将自动发生。
输入类型转换
若是须要,传递给端点操做方法的参数将自动转换为所需的类型,在调用操做方法以前,使用ApplicationConversionService
实例将经过JMX或HTTP请求接收的输入转换为所需的类型。
对@Endpoint
、@WebEndpoint
或@WebEndpointExtension
的操做经过使用Jersey、Spring MVC或Spring WebFlux经过HTTP自动公开。
在web公开的端点上,每一个操做都会自动生成一个请求谓词。
谓词的路径由端点的ID和web公开端点的基本路径决定,默认的基本路径是/actuator
,例如,具备ID sessions
的端点将在谓词中使用/actuator/sessions
做为其路径。
经过使用@Selector
注解操做方法的一个或多个参数,能够进一步定制路径,这样的参数做为路径变量添加到路径谓词,当调用端点操做时,将变量的值传递给操做方法。
谓词的HTTP方法由操做类型决定,以下表所示:
@ReadOperation
=> GET
@WriteOperation
=> POST
@DeleteOperation
=> DELETE
对于使用请求体的@WriteOperation
(HTTP POST
),谓词的消费子句是application/vnd.spring-boot.actuator.v2+json, application/json
,对于全部其余操做,消费子句为空。
谓词的生产子句能够由@DeleteOperation
、@ReadOperation
和@WriteOperation
注解的produces
属性肯定,属性是可选的,若是不使用,则自动肯定“生成”子句。
若是操做方法返回void
或Void
,则生成子句为空,若是操做方法返回一个org.springframework.core.io.Resource
,生成子句是application/octet-stream
。对于全部其余操做,生成子句是application/vnd.spring-boot.actuator.v2+json, application/json
。
端点操做的默认响应状态取决于操做类型(读、写或删除)以及操做返回的内容(若是有的话)。
@ReadOperation
返回一个值,响应状态为200 (OK),若是不返回值,响应状态将为404(Not Found)。
若是@WriteOperation
或@DeleteOperation
返回一个值,则响应状态为200 (OK),若是不返回值,响应状态将为204(No Content)。
若是没有必需的参数调用操做,或者参数不能转换为所需的类型,则不会调用操做方法,响应状态将为400(Bad Request)。
HTTP范围请求能够用于请求HTTP资源的一部分,当使用Spring MVC或Spring Web Flux时,操做将返回一个自动支持范围请求的org.springframework.core.io.Resource
。
使用Jersey时不支持范围请求
web端点或特定于web的端点扩展上的操做能够接收当前的java.security.Principal
或org.springframework.boot.actuate.endpoint.SecurityContext
做为一个方法参数。前者一般与@Nullable
一块儿使用,用于为通过身份验证的用户和未经身份验证的用户提供不一样的行为,后者一般用于使用其isUserInRole(String)
方法执行受权检查。
Servlet
能够经过实现一个带有@ServletEndpoint
注解的类来做为端点公开,这个类也实现了Supplier<EndpointServlet>
。Servlet端点提供了与Servlet容器更深层次的集成,但暴露了可移植性,它们用于将现有的Servlet公开为端点。对于新的端点,应该尽量使用@Endpoint
和@WebEndpoint
注解。
可使用@ControllerEndpoint
和@RestControllerEndpoint
实现仅由Spring MVC或Spring WebFlux公开的端点,方法使用Spring MVC和Spring WebFlux(如@RequestMapping
和@GetMapping
)的标准注解进行映射,使用端点的ID做为路径的前缀。Controller端点提供了与Spring web框架的更深刻的集成,但却牺牲了可移植性,尽量使用@Endpoint和@WebEndpoint注解。
你可使用健康信息检查正在运行的应用程序的状态,当生产系统崩溃时,监控软件一般会用它来通知某人,health
端点公开的信息取决于management.endpoint.health.show-details
属性,可使用如下值之一配置:
never
when-authorized
management.endpoint.health.roles
配置受权角色always
默认值是never
,当用户处于端点的一个或多个角色中时,就被认为是通过受权的,若是端点没有配置角色(默认),则认为全部通过身份验证的用户都是通过受权的,可使用management.endpoint.health.roles
属性。
若是你已经保护了你的应用程序而且但愿使用
always
,你的安全配置必须容许对通过身份验证的用户和未经身份验证的用户访问健康端点。
健康信息是从你的ApplicationContext
中定义的全部HealthIndicator bean中收集的,Spring Boot包括许多自动配置的HealthIndicators
,而且你也能够本身写。默认状况下,最终的系统状态由HealthAggregator
派生,它根据有序的状态列表从每一个HealthIndicator
排序状态。排序列表中的第一个状态被用做整体健康状态,若是没有HealthAggregator
所知道的HealthIndicator
状态返回,则使用UNKNOWN
状态。
如下的HealthIndicators
在适当的时候在Spring Boot中自动配置:
DataSource
的链接
你能够经过设置
management.health.defaults.enabled
属性来禁用它们全部。
要提供自定义的健康信息,你能够注册实现HealthIndicator接口的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
后缀的bean的名称(若是存在的话),在前面的示例中,健康信息能够在名为my
的条目中得到。
除了Spring Boot的预约义Status类型以外,Health
还能够返回表示新系统状态的自定义Status
,在这种状况下,还须要提供HealthAggregator接口的自定义实现,或者,默认实现是使用management.health.status.order
配置属性。
例如,假设在你的一个HealthIndicator
实现中使用了一个带有代码FATAL
的新Status
,要配置严重性顺序,请在应用程序属性中添加如下属性:
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
响应中的HTTP状态代码反映整体健康状态(例如,UP
映射到200,而OUT_OF_SERVICE
和DOWN
映射到503),若是你经过HTTP访问健康端点,你可能还想注册自定义状态映射,例如,如下属性将FATAL
映射到503(service unavailable):
management.health.status.http-mapping.FATAL=503
若是你须要更多的控制,你能够定义本身的
HealthStatusHttpMapper
bean。
下表显示了内建状态的默认状态映射:
DOWN
OUT_OF_SERVICE
UP
UNKNOWN