Endpoints

Actuator 端点让您监控和交互您的应用程序。Spring Boot 包含许多内置端点,并让您可以添加您自己的端点。例如,health 端点提供基本的应用程序健康状况信息。 您可以 enable or disable 每个单独的端点和 expose them (make them remotely accessible) over HTTP or JMX。当端点既启用又能公开时,它将被视为可用。内置端点仅在可用时才自动配置。大多数应用程序选择公开 HTTP,其中端点的 ID 和 /actuator 的前缀被映射到 URL。例如,默认情况下,health 端点被映射到 /actuator/health

若要了解有关 Actuator 的端点及其请求和响应格式的更多信息,请参阅 API documentation

以下技术不可知端点可用:

ID Description

auditevents

公开当前应用程序的审计事件信息。需要一个 AuditEventRepository Bean。

beans

显示应用程序中所有 Spring bean 的完整列表。

caches

Exposes available caches.

conditions

显示在配置和自动配置类上评估的条件,以及他们匹配或不匹配的原因。

configprops

显示所有 @ConfigurationProperties 的整理列表。受 sanitization 控制。

env

公开 Spring 的 ConfigurableEnvironment 属性。受 sanitization 控制。

flyway

显示已应用的任何 Flyway 数据库迁移。需要一个或多个 Flyway bean。

health

Shows application health information.

httpexchanges

显示 HTTP 交换信息(默认情况下,最近 100 次 HTTP 请求响应交换)。需要 HttpExchangeRepository bean。

info

Displays arbitrary application info.

integrationgraph

显示 Spring 集成图。需要依赖 spring-integration-core

loggers

显示和修改应用程序中记录器的配置。

liquibase

显示已应用的任何 Liquibase 数据库迁移。需要一个或多个 Liquibase bean。

metrics

显示当前应用程序的 “metrics” 信息。

mappings

显示所有 @RequestMapping 路径的整理列表。

quartz

显示有关 Quartz 调度程序作业的信息。受 sanitization 控制。

scheduledtasks

显示应用程序中安排的任务。

sessions

允许从 Spring Session 支持的会话存储检索和删除用户会话。需要 servlet 为基础的 Web 应用程序,该应用程序使用 Spring Session。

shutdown

让应用程序正常关机。仅在使用 jar 打包时起作用。默认情况下禁用。

startup

显示 ApplicationStartup 收集的 startup steps data。需要用 BufferingApplicationStartup 配置 SpringApplication

threaddump

Performs a thread dump.

如果您的应用程序是 Web 应用程序(Spring MVC、Spring WebFlux 或 Jersey),则可以使用以下附加端点:

ID Description

heapdump

返回一个堆转储文件。在 HotSpot JVM 上,返回 HPROF 格式的文件。在 OpenJ9 JVM 上,返回 PHD 格式的文件。

logfile

返回日志文件内容(如果 logging.file.namelogging.file.path 属性已设置)。支持使用 HTTP Range 头检索日志文件内容的一部分。

prometheus

以 Prometheus 服务器可以抓取的格式公开指标。需要依赖 micrometer-registry-prometheus

Enabling Endpoints

在默认情况下,除“@1”之外的所有端点都会启用。要配置端点的启用状态,可以使用“@2”属性。以下示例启用“@3”端点:

management:
  endpoint:
    shutdown:
      enabled: true

如果您更喜欢先注销再启用端点,而不是先启用再注销,请将“configprop:management.endpoints.enabled-by-default[]”属性设置为“@4”,然后使用单个端点“@5”属性重新启用。以下示例启用“@6”端点并禁用所有其他端点:

management:
  endpoints:
    enabled-by-default: false
  endpoint:
    info:
      enabled: true

禁用的端点会从应用程序上下文中完全移除。如果您只想更改端点的公开技术,请使用“@9”。

Exposing Endpoints

在默认情况下,只有状态端点公开在 HTTP 和 JMX 中,由于端点可能包含敏感信息,因此您是否公开它们时应仔细考虑。

要更改公开哪些端点,请使用以下特定于技术的“@10”和“@11”属性:

Property Default

configprop:management.endpoints.jmx.exposure.exclude[]

configprop:management.endpoints.jmx.exposure.include[]

health

configprop:management.endpoints.web.exposure.exclude[]

configprop:management.endpoints.web.exposure.include[]

health

“@12”属性列出公开的端点的 ID。"@13" 属性列出不应该公开的端点的 ID。"“@14”属性优先于“@15”属性。您可以使用端点 ID 清单配置“@16”属性和“@17”属性。

例如,要只在 JMX 中公开“@18”和“@19”端点,请使用以下属性:

management:
  endpoints:
    jmx:
      exposure:
        include: "health,info"

“@20”可用于选择所有端点。例如,要在 HTTP 中公开除了“@21”和“@22”端点之外的所有内容,请使用以下属性:

management:
  endpoints:
    web:
      exposure:
        include: "*"
        exclude: "env,beans"

“@23”在 YAML 中有特殊含义,因此如果您要包含(或排除)所有端点,请务必添加引号。

如果您的应用程序公开,我们强烈建议您也“@24”。

如果您要实施端点公开的自定义策略,则可以注册一个“@25”bean。

Security

出于安全目的,只有“@26”端点在默认情况下公开在 HTTP 中。您可以使用“configprop:management.endpoints.web.exposure.include[]”属性配置公开的端点。

在设置“@27”之前,请确保公开的致动器不包含敏感信息,并受到防火墙或 Spring 安全性等保护。

如果 Spring 安全性在类路径上,并且不存在其他“@28”bean,那么除了“@29”之外的所有致动器都受 Spring Boot 自动配置保护。如果您定义一个自定义“@30”bean,Spring Boot 自动配置会退场,让您完全控制致动器访问规则。

如果您希望配置 HTTP 端点的自定义安全性(例如,只允许具有特定角色的用户访问它们),Spring Boot 提供了一些便捷的“@31”对象,可以将其与 Spring 安全性结合使用。

典型的 Spring 安全配置可能如下例所示:

前一个示例使用“@32”匹配对任何端点的请求,然后确保所有端点都具有“@33”角色。在“@34”上还有其他一些匹配器方法可用。有关详细信息,请参见“@35”。

如果您在防火墙后面部署应用程序,那么您可能更喜欢在无需身份验证的情况下访问所有致动器端点。您可以通过以下方式来更改“configprop:management.endpoints.web.exposure.include[]”属性:

management:
  endpoints:
    web:
      exposure:
        include: "*"

此外,如果存在 Spring Security,你需要添加自定义安全配置,以允许未经身份验证的用户访问端点,如下例所示:

在这两个前面的示例中,配置仅适用于 actuator 端点。由于 Spring Boot 的安全配置在存在任何 bean 的情况下完全退出,因此你需要用适用于应用程序其余部分的规则配置一个额外的 bean。

Cross Site Request Forgery Protection

由于 Spring Boot 依赖于 Spring Security 的默认设置,因此 CSRF 保护默认启用。这意味着,在使用默认安全配置时,需要 @XXX (关闭和记录器端点)、@YYY 或 @ZZZ 的 actuator 端点会收到 403(禁止)错误。

我们仅在你创建由非浏览器客户端使用的服务时才建议完全禁用 CSRF 保护。

你可以在 Spring Security 参考指南中找到有关 CSRF 保护的更多信息:{url-spring-security-docs}/features/exploits/csrf.html。

Configuring Endpoints

端点会自动缓存对不采用任何参数的读取操作的响应。若要配置端点缓存响应的时间,请使用其 @PPP 属性。以下示例将 @QQQ 端点的缓存生存时间设置为 10 秒:

management:
  endpoint:
    beans:
      cache:
        time-to-live: "10s"

@RRR 前缀唯一标识要配置的端点。

Sanitize Sensitive Values

@SSS、@TTT 和 @UUU 端点返回的信息可能很敏感,因此默认情况下,这些值总会被完全清理(替换为 @VVV)。

只有在以下情况下才能以未经清理的形式查看值:

  • @WWW 属性已被设为非 @XXX

  • 没有应用自定义 @YYY bean

可以为可清理端点配置 @ZZZ 属性,将其设为以下值之一:

  • @AAA - 值总会被完全清理(替换为 @BBB)

  • @CCC - 所有用户均可看到值(只要没有应用 @DDD bean)

  • @EEE - 只有授权用户才能看到值(只要没有应用 @FFF bean)

对于 HTTP 端点,如果用户经过身份验证并具有由端点的角色属性配置的角色权限,则该用户会被视为已授权。默认情况下,任何经过身份验证的用户都获得授权。

对于 JMX 端点,所有用户始终获得授权。

以下示例允许具有 @GGG 角色的所有用户以原始形式查看来自 @HHH 端点的值。未经授权的用户或不具备 @III 角色的用户,只能看到已清理的值。

management:
  endpoint:
    env:
      show-values: WHEN_AUTHORIZED
      roles: "admin"

此示例假设未定义任何 SanitizingFunction bean。

Hypermedia for Actuator Web Endpoints

通过链接到所有端点添加了一个 “discovery page”。“discovery page” 默认情况下在 /actuator 中提供。

要禁用 “discovery page”,将以下属性添加到应用程序属性中:

management:
  endpoints:
    web:
      discovery:
        enabled: false

配置自定义管理上下文路径后,“discovery page” 会自动从 /actuator 移动到管理上下文的根目录。例如,如果管理上下文路径为 /management,则可以通过 /management 访问发现页面。当管理上下文路径设置为 / 时,将禁用发现页面,以防止发生与其他映射冲突的可能性。

CORS Support

Cross-origin resource sharing (CORS) 是一种 W3C specification,允许您灵活指定允许哪种跨域请求类型。如果您使用 Spring MVC 或 Spring WebFlux,则可以配置 Actuator 的 Web 端点来支持此类情况。

CORS 支持默认禁用,仅在您设置 configprop:management.endpoints.web.cors.allowed-origins[] 属性后才会启用。以下配置允许来自 example.com 域的 GETPOST 调用:

management:
  endpoints:
    web:
      cors:
        allowed-origins: "https://example.com"
        allowed-methods: "GET,POST"

请参见 {code-spring-boot-actuator-autoconfigure-src}/endpoint/web/CorsEndpointProperties.java[CorsEndpointProperties],了解完整选项列表。

Implementing Custom Endpoints

如果您添加了带 @Endpoint 注释的 @Bean,则带 @ReadOperation@WriteOperation@DeleteOperation 注释的任何方法都会自动通过 JMX 公开,并且在 Web 应用程序中也会通过 HTTP 公开。端点可以使用 Jersey、Spring MVC 或 Spring WebFlux 通过 HTTP 公开。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。

以下示例公开了一个读取操作,其返回一个自定义对象:

您还可以使用 @JmxEndpoint@WebEndpoint 编写特定于技术的端点。这些端点仅限于它们各自的技术。例如,@WebEndpoint 仅通过 HTTP 公开,而不会通过 JMX 公开。

您可以使用 @EndpointWebExtension@EndpointJmxExtension 编写特定于技术的扩展。这些注释允许您提供特定于技术的操作来增强现有端点。

最后,如果您需要访问特定于 Web 框架的功能,您可以实现 servlet 或者 Spring @Controller@RestController 端点,其缺点是它们无法通过 JMX 访问,或者在使用不同的 Web 框架时无法访问。

Receiving Input

端点上的操作通过其参数接收输入。当通过 Web 公开时,这些参数的值取自 URL 的查询参数和 JSON 请求正文。当通过 JMX 公开时,参数映射到 MBean 的操作参数。默认情况下,参数是必需的。通过使用 @javax.annotation.Nullable@org.springframework.lang.Nullable 注释它们,可以使它们变为可选的。

您可以将 JSON 请求正文中的每个根属性映射到端点的参数。请考虑以下 JSON 请求正文:

{
	"name": "test",
	"counter": 42
}

您可以使用此文档调用一个写入操作,它采用 String nameint counter 参数,如下例所示:

由于端点与技术无关,因此仅能指定简单类型作为方法签名。特别是,不支持声明具有一个参数(其 CustomData 类型定义了 namecounter 属性)的情况。

为了让输入映射到操作方法的参数,实现端点的 Java 代码应使用 -parameters 编译,而实现端点的 Kotlin 代码应使用 -java-parameters 编译。如果您使用 Spring Boot 的 Gradle 插件,或使用 Maven 和 spring-boot-starter-parent,则会自动进行编译。

Input Type Conversion

如果需要,传递到端点操作方法的参数会自动转换为必需类型。在调用操作方法之前,使用 ApplicationConversionService 的实例,以及使用 @EndpointConverter 限定的任何 ConverterGenericConverter Bean,将通过 JMX 或 HTTP 收到的输入转换为必需类型。

Custom Web Endpoints

@Endpoint@WebEndpoint@EndpointWebExtension 的操作会自动通过 Jersey、Spring MVC 或 Spring WebFlux 暴露到 HTTP 中。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。

Web Endpoint Request Predicates

会自动为在公开在 Web 上的端点上的每个操作生成请求谓词。

Path

谓词的路径由端点的 ID 和公开在 Web 上的端点的基本路径决定。默认基本路径是 /actuator。例如,具有 ID 为 sessions 的端点使用 /actuator/sessions 作为其在谓词中的路径。

可以通过使用 @Selector 对操作方法的一个或多个参数进行注释来进一步自定义路径。这样的参数作为路径变量添加到路径谓词中。在调用端点操作时,变量的值会传递到操作方法中。如果你想捕获所有剩余路径元素,则可以将 @Selector(Match=ALL_REMAINING) 添加到最后一个参数,并使其成为与 String[] 转换兼容的类型。

HTTP method

谓词的 HTTP 方法由操作类型决定,如下表所示:

Operation HTTP method

@ReadOperation

GET

@WriteOperation

POST

@DeleteOperation

DELETE

Consumes

对于使用请求正文的 @WriteOperation (HTTP POST),谓词的 consumes 条款是 application/vnd.spring-boot.actuator.v2+json, application/json。对于所有其他操作,consumes 条款为空。

Produces

谓词的 produces 条款可以通过 @DeleteOperation@ReadOperation@WriteOperation 注释的 produces 属性来确定。该属性是可选的。如果未使用,则 produces 条款会自动确定。

如果操作方法返回 voidVoid,则 produces 条款为空。如果操作方法返回 org.springframework.core.io.Resource,则 produces 条款是 application/octet-stream。对于所有其他操作,produces 条款是 application/vnd.spring-boot.actuator.v2+json, application/json

Web Endpoint Response Status

端点操作的默认响应状态取决于操作类型(读取、写入或删除)以及操作返回内容(如果有)。

如果 @ReadOperation 返回一个值,则响应状态将是 200(确定)。如果它没有返回值,则响应状态将是 404(找不到)。

如果 @WriteOperation@DeleteOperation 返回一个值,则响应状态将是 200(确定)。如果它没有返回值,则响应状态将是 204(无内容)。

如果在没有必需参数或参数无法转换到必需类型的情况下调用了操作,则不会调用操作方法,并且响应状态将是 400(错误的请求)。

Web Endpoint Range Requests

你可以使用 HTTP 范围请求来请求 HTTP 资源的一部分。在使用 Spring MVC 或 Spring Web Flux 时,返回 org.springframework.core.io.Resource 的操作会自动支持范围请求。

在使用 Jersey 时不支持范围请求。

Web Endpoint Security

对 Web 端点或特定 Web 端点的扩展上执行的操作可以将当前 java.security.Principalorg.springframework.boot.actuate.endpoint.SecurityContext 接收为方法参数。前者通常与 @Nullable 结合使用,以便为已认证和未认证用户提供不同的行为。后者通常用来通过使用其 isUserInRole(String) 方法来执行授权检查。

Servlet Endpoints

可以通过实现同时实现 Supplier<EndpointServlet> 的使用 @ServletEndpoint 注释的类来将 Servlet 公开为端点。Servlet 端点提供与 Servlet 容器的更深入集成,但也以牺牲可移植性为代价。它们旨在用于将现有 Servlet 公开为端点。对于新端点,应尽可能选择 @Endpoint@WebEndpoint 注释。

Controller Endpoints

可以使用 @ControllerEndpoint@RestControllerEndpoint 来实现仅通过 Spring MVC 或 Spring WebFlux 公开的端点。方法是使用适用于 Spring MVC 和 Spring WebFlux 的标准注释(例如 @RequestMapping@GetMapping)映射,端点的 ID 作为该路径的前缀。控制器端点提供与 Spring 的 Web 框架的更深入集成,但也以牺牲可移植性为代价。应尽可能选择 @Endpoint@WebEndpoint 注释。

Health Information

你可以使用健康信息来检查正在运行的应用程序的状态。它经常由监控软件使用,以便在生产系统出现故障时提醒某人。由 health 端点公开的信息取决于 configprop:management.endpoint.health.show-details[] 和 configprop:management.endpoint.health.show-components[] 属性,它们可以配置为以下值之一:

Name Description

never

Details are never shown.

when-authorized

详细信息仅显示给授权用户。可以使用 management.endpoint.health.roles 配置授权角色。

always

详细信息对所有用户均可见。

默认值是 never。当用户属于端点的某个角色或多个角色时,被视为已授权。如果端点没有配置角色(这是默认值),则所有已验证用户都视为已授权。你可以使用 configprop: management. endpoint.health.roles[] 属性来配置角色。

如果你已经保护了应用程序并希望使用 always,则你的安全配置必须允许已验证用户和未验证用户都访问运行状况端点。

运行状况信息从 {code-spring-boot-actuator-src}/health/HealthContributorRegistry.java[HealthContributorRegistry](默认情况下,所有在你的 ApplicationContext 中定义的 {code-spring-boot-actuator-src}/health/HealthContributor.java[HealthContributor] 实例)的内容中收集。Spring Boot 包含众多自动配置的 HealthContributors,你也可以编写你自己的 HealthContributors

HealthContributor 可以是 HealthIndicatorCompositeHealthContributorHealthIndicator 提供实际的运行状况信息,包括 StatusCompositeHealthContributor 提供其他 HealthContributors 的混合。贡献者共同形成树结构来代表整个系统的运行状况。

默认情况下,最终系统运行状况是由 StatusAggregator`派生的,该 `StatusAggregator 根据已排序的状态列表对来自每个 HealthIndicator 的状态进行分类。分类列表中的第一个状态用作整体运行状况状态。如果没有任何 HealthIndicator 返回 StatusAggregator 已知的状态,则使用 UNKNOWN 状态。

你可以使用 HealthContributorRegistry 在运行时注册和注销健康指标。

Auto-configured HealthIndicators

如合适,Spring Boot 会自动配置下表中列出的 HealthIndicators。你还可以通过使用下表中列出的 key 配置 management.health.key.enabled,从而启用或禁用选定的指标:

Key Name Description

cassandra

{code-spring-boot-actuator-src}/cassandra/CassandraDriverHealthIndicator.java[CassandraDriverHealthIndicator]

检查 Cassandra 数据库是否正常运行。

couchbase

{code-spring-boot-actuator-src}/couchbase/CouchbaseHealthIndicator.java[CouchbaseHealthIndicator]

检查 Couchbase 集群是否正常运行。

db

{code-spring-boot-actuator-src}/jdbc/DataSourceHealthIndicator.java[DataSourceHealthIndicator]

检查是否可以获取与 DataSource 的连接。

diskspace

{code-spring-boot-actuator-src}/system/DiskSpaceHealthIndicator.java[DiskSpaceHealthIndicator]

检查磁盘空间是否不足。

elasticsearch

{code-spring-boot-actuator-src}/elasticsearch/ElasticsearchRestClientHealthIndicator.java[ElasticsearchRestClientHealthIndicator]

检查 Elasticsearch 集群是否正常运行。

hazelcast

{code-spring-boot-actuator-src}/hazelcast/HazelcastHealthIndicator.java[HazelcastHealthIndicator]

检查 Hazelcast 服务器是否正常运行。

influxdb

{code-spring-boot-actuator-src}/influx/InfluxDbHealthIndicator.java[InfluxDbHealthIndicator]

检查 InfluxDB 服务器是否正常运行。

jms

{code-spring-boot-actuator-src}/jms/JmsHealthIndicator.java[JmsHealthIndicator]

检查 JMS 代理是否正常运行。

ldap

{code-spring-boot-actuator-src}/ldap/LdapHealthIndicator.java[LdapHealthIndicator]

检查 LDAP 服务器是否正常运行。

mail

{code-spring-boot-actuator-src}/mail/MailHealthIndicator.java[MailHealthIndicator]

检查邮件服务器是否正常运行。

mongo

{code-spring-boot-actuator-src}/data/mongo/MongoHealthIndicator.java[MongoHealthIndicator]

检查 Mongo 数据库是否正在运行。

neo4j

{code-spring-boot-actuator-src}/neo4j/Neo4jHealthIndicator.java[Neo4jHealthIndicator]

检查 Neo4j 数据库是否正在运行。

ping

{code-spring-boot-actuator-src}/health/PingHealthIndicator.java[PingHealthIndicator]

Always responds with UP.

rabbit

{code-spring-boot-actuator-src}/amqp/RabbitHealthIndicator.java[RabbitHealthIndicator]

检查 Rabbit 服务器是否正在运行。

redis

{code-spring-boot-actuator-src}/data/redis/RedisHealthIndicator.java[RedisHealthIndicator]

检查 Redis 服务器是否正在运行。

可以通过设置 configprop:management.health.defaults.enabled[] 属性来禁用它们。

其他 HealthIndicators 是可用的,但默认情况下未启用:

Key Name Description

livenessstate

{code-spring-boot-actuator-src}/availability/LivenessStateHealthIndicator.java[LivenessStateHealthIndicator]

公开 “Liveness” 应用程序可用性状态。

readinessstate

{code-spring-boot-actuator-src}/availability/ReadinessStateHealthIndicator.java[ReadinessStateHealthIndicator]

公开 “Readiness” 应用程序可用性状态。

Writing Custom HealthIndicators

要提供自定义健康信息,可以注册实现 {code-spring-boot-actuator-src}/health/HealthIndicator.java[HealthIndicator] 接口的 Spring bean。您需要提供 health() 方法的实现并返回 Health 响应。Health 响应应包括一个状态,并且可以包含可选的要显示的附加详细信息。以下代码显示一个 HealthIndicator 实现示例:

给定 HealthIndicator 的标识符是 bean 的名称,但不带 HealthIndicator 后缀(如果存在)。在前面的示例中,健康信息可在名为 my 的条目中获得。

健康指示器通常通过 HTTP 调用,并且需要在任何连接超时之前做出响应。Spring Boot 会针对任何响应时间超过 10 秒的健康指示器记录警告消息。如果要配置此阀值,可以使用 configprop:management.endpoint.health.logging.slow-indicator-threshold[] 属性。

除了 Spring Boot 预定义的 {code-spring-boot-actuator-src}/health/Status.java[Status] 类型,Health 还可以返回表示新系统状态的自定义 Status。在这种情况下,还需要提供 {code-spring-boot-actuator-src}/health/StatusAggregator.java[StatusAggregator] 接口的自定义实现,或者必须使用 configprop:management.endpoint.health.status.order[] 配置属性来配置默认实现。

例如,假设一个新的 Status 在您的其中一个 HealthIndicator 实现中使用,其代码为 FATAL。要配置严重性顺序,请将以下属性添加到您的应用程序属性:

management:
  endpoint:
    health:
      status:
        order: "fatal,down,out-of-service,unknown,up"

响应中的 HTTP 状态代码反映了整体健康状况。默认情况下,OUT_OF_SERVICEDOWN 映射到 503。任何未映射的健康状态,包括 UP,都映射到 200。您可能还想通过 HTTP 访问健康端点时注册自定义状态映射。配置自定义映射会禁用 DOWNOUT_OF_SERVICE 的默认映射。要保留默认映射,必须显式配置它们,以及任何自定义映射。例如,以下属性将 FATAL 映射到 503(服务不可用),并保留 DOWNOUT_OF_SERVICE 的默认映射:

management:
  endpoint:
    health:
      status:
        http-mapping:
          down: 503
          fatal: 503
          out-of-service: 503

如果您需要更多控制,可以定义自己的 HttpCodeStatusMapper bean。

下表显示了内置状态的默认状态映射:

Status Mapping

DOWN

SERVICE_UNAVAILABLE (503)

OUT_OF_SERVICE

SERVICE_UNAVAILABLE (503)

UP

默认情况下没有映射,因此 HTTP 状态是 200

UNKNOWN

默认情况下没有映射,因此 HTTP 状态是 200

Reactive Health Indicators

对于响应应用程序,例如使用 Spring WebFlux 的应用程序,ReactiveHealthContributor 提供了一个非阻塞合约来获取应用程序的健康状况。类似于传统 HealthContributor,健康信息是从 {code-spring-boot-actuator-src}/health/ReactiveHealthContributorRegistry.java[ReactiveHealthContributorRegistry] (默认情况下,所有 {code-spring-boot-actuator-src}/health/HealthContributor.java[HealthContributor] 和 {code-spring-boot-actuator-src}/health/ReactiveHealthContributor.java[ReactiveHealthContributor] 实例均在您的 ApplicationContext 中定义)的内容中收集的。针对非响应式 API 进行检查的常规 HealthContributors 在弹性调度程序上执行。

在反应式应用程序中,你应该使用 ReactiveHealthContributorRegistry 在运行时注册和注销健康指标。如果你需要注册一个常规 HealthContributor,应该使用 ReactiveHealthContributor#adapt 来封装它。

要从反应式 API 提供自定义健康信息,你可以注册实现 {code-spring-boot-actuator-src}/health/ReactiveHealthIndicator.java[ReactiveHealthIndicator] 接口的 Spring bean。下面的代码展示了一个示例 ReactiveHealthIndicator 实现:

为了自动处理错误,考虑从 AbstractReactiveHealthIndicator 中扩展。

Auto-configured ReactiveHealthIndicators

当合适时,Spring Boot 会自动配置以下 ReactiveHealthIndicators

Key Name Description

cassandra

{code-spring-boot-actuator-src}/cassandra/CassandraDriverReactiveHealthIndicator.java[CassandraDriverReactiveHealthIndicator]

检查 Cassandra 数据库是否正常运行。

couchbase

{code-spring-boot-actuator-src}/couchbase/CouchbaseReactiveHealthIndicator.java[CouchbaseReactiveHealthIndicator]

检查 Couchbase 集群是否正常运行。

elasticsearch

{code-spring-boot-actuator-src}/data/elasticsearch/ElasticsearchReactiveHealthIndicator.java[ElasticsearchReactiveHealthIndicator]

检查 Elasticsearch 集群是否正常运行。

mongo

{code-spring-boot-actuator-src}/data/mongo/MongoReactiveHealthIndicator.java[MongoReactiveHealthIndicator]

检查 Mongo 数据库是否正在运行。

neo4j

{code-spring-boot-actuator-src}/neo4j/Neo4jReactiveHealthIndicator.java[Neo4jReactiveHealthIndicator]

检查 Neo4j 数据库是否正在运行。

redis

{code-spring-boot-actuator-src}/data/redis/RedisReactiveHealthIndicator.java[RedisReactiveHealthIndicator]

检查 Redis 服务器是否正在运行。

在必要时,反应式指标会替换常规指标。此外,任何没有明确处理的 HealthIndicator 都会自动封装。

Health Groups

有时候,将健康指标整理成可用于不同用途的分组很有用。

要创建一个健康指标分组,你可以使用 management.endpoint.health.group.<name> 属性,并为 includeexclude 指定一个健康指标 ID 列表。例如,为了创建一个仅包含数据库指标的分组,你可以定义以下内容:

management:
  endpoint:
    health:
      group:
        custom:
          include: "db"

然后,你可以通过点击 http://localhost:8080/actuator/health/custom 来查看结果。

类似地,为了创建一个将数据库指标从分组中排除、同时包含所有其他指标的分组,你可以定义以下内容:

management:
  endpoint:
    health:
      group:
        custom:
          exclude: "db"

默认情况下,如果一个健康分组包含或排除了不存在的健康指标,启动将会失败。要禁用此行为,将 configprop:management.endpoint.health.validate-group-membership[] 设置为 false

默认情况下,组会继承与系统健康相同的 StatusAggregatorHttpCodeStatusMapper 设置。不过,你也可以在组级别上定义这些设置。你还可以根据需要覆盖 show-detailsroles 属性:

management:
  endpoint:
    health:
      group:
        custom:
          show-details: "when-authorized"
          roles: "admin"
          status:
            order: "fatal,up"
            http-mapping:
              fatal: 500
              out-of-service: 500

如果你需要为分组注册自定义 StatusAggregatorHttpCodeStatusMapper bean 以用于分组,你可以使用 @Qualifier("groupname")

一个健康分组还可以包含/排除一个 CompositeHealthContributor。你还可以仅包含/排除 CompositeHealthContributor 的某个组件。这可以通过使用组件的全限定名称来实现,如下所示:

management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b"

在上述示例中,custom 分组将包含名称为 primaryHealthContributor,它是一个复合 test 的组件。这里,primary 本身是一个复合体,并且名称为 bHealthContributor 将从 custom 组中排除。

健康组可以使用主端口或管理端口上的额外路径。这在云环境中很有用,例如 Kubernetes,其中出于安全目的,通常为执行器端点使用单独的管理端口。由于主应用程序即使健康检查成功,也可能无法正常工作,拥有一个单独的端口可能会导致不可靠的健康检查。健康组可以通过以下方式配置额外路径:

management.endpoint.health.group.live.additional-path="server:/healthz"

这将使 live 健康组在 /healthz 处的主服务器端口上可用。前缀是必需的,它必须是 server:(代表主服务器端口)或 management:(代表管理端口(如果已配置))中的一个。路径必须是一个单一的路径部分。

DataSource Health

DataSource 健康指标展示了标准数据源和路由数据源 bean 的运行状况。路由数据源的运行状况包括其每个目标数据源的运行状况。在健康端点的响应中,每个路由数据源的目标都通过使用其路由键来命名。如果你不希望在指标输出中包含路由数据源,请将 configprop:management.health.db.ignore-routing-data-sources[] 设置为 true

Kubernetes Probes

部署在 Kubernetes 上的应用程序可以使用 Container Probes 提供其内部状态的信息。根据 your Kubernetes configuration,kubelet 会调用那些探测并对结果做出反应。

默认情况下,Spring Boot 会管理你的 Application Availability State。如果部署在 Kubernetes 环境中,执行器会从 ApplicationAvailability 接口中收集 “Liveness” 和 “Readiness” 信息,然后使用这些信息在专用 health indicators 中: LivenessStateHealthIndicatorReadinessStateHealthIndicator。这些指标显示在全局健康端点 ("/actuator/health") 上。它们还通过使用 health groups: "/actuator/health/liveness""/actuator/health/readiness" 公开为单独的 HTTP 探测。

然后,你可以使用以下端点信息配置你的 Kubernetes 基础设施:

livenessProbe:
  httpGet:
    path: "/actuator/health/liveness"
    port: <actuator-port>
  failureThreshold: ...
  periodSeconds: ...

readinessProbe:
  httpGet:
    path: "/actuator/health/readiness"
    port: <actuator-port>
  failureThreshold: ...
  periodSeconds: ...

<actuator-port> 应该设置为执行器端点可用的端口。如果是 "management.server.port" 属性已设置,则该端口可能是主 Web 服务器端口或单独的管理端口。

这些健康组仅在你应用程序 runs in a Kubernetes environment 时才会自动启用。你可以通过使用 configprop:management.endpoint.health.probes.enabled[] 配置属性在任何环境中启用它们。

如果应用程序启动的时间比配置的活跃时间段长,Kubernetes 会将 "startupProbe" 作为可能的解决方案提到。一般来说,此处并不一定需要 "startupProbe",因为在完成所有启动任务之前,"readinessProbe" 都会失败。这意味着在应用程序准备好之前,它不会收到流量。但是,如果你的应用程序启动时间很长,请考虑使用 "startupProbe" 确保 Kubernetes 不会在启动过程中关闭你的应用程序。请参见描述 how probes behave during the application lifecycle 的部分。

如果你的执行器端点部署在单独的管理上下文中,则这些端点不会与主应用程序使用相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序无法正常工作(例如,它无法接受新连接),探测检查也可能会成功。因此,最好在主服务器端口上启用 livenessreadiness 健康组。这可以通过设置以下属性来完成:

management.endpoint.health.probes.add-additional-paths=true

这将在主服务器端口上将 liveness 组设为可用于 /livez,将 readiness 组设为可用于 /readyz。路径可以使用每个组上的 additional-path 属性来自定义,请参阅 health groups 了解详情。

Checking External State With Kubernetes Probes

执行器将 “liveness” 和 “readiness” 探测配置为健康组。这意味着所有的 health groups features 都对它们可用。例如,你可以配置其他健康指标:

management:
  endpoint:
    health:
      group:
        readiness:
          include: "readinessState,customCheck"

默认情况下,Spring Boot 不会将其他健康指标添加到这些组中。

“liveness” 探测不应依赖于外部系统的运行状况检查。如果 liveness state of an application 已中断,Kubernetes 会通过重新启动应用程序实例来尝试解决该问题。这意味着,如果外部系统(例如数据库、Web API 或外部缓存)发生故障,Kubernetes 可能会重新启动所有应用程序实例并创建级联故障。

至于 “readiness” 探测,检查外部系统的选择必须由应用程序开发人员仔细做出。因此,Spring Boot 不会在准备就绪探测中包括任何其他运行状况检查。如果 readiness state of an application instance 未准备好,Kubernetes 不会将流量路由到该实例。某些外部系统可能不会被应用程序实例共享,在这种情况下,它们可以包含在准备就绪探测中。其他外部系统可能对应用程序不必要(应用程序可能有断路器和后备选项),在这种情况下,绝对不应包含这些外部系统。不幸的是,所有应用程序实例共享的外部系统很常见,你必须做出判断:将其包含在准备就绪探测中并希望在外部服务关闭时将应用程序排除在外或将其排除在外并处理堆栈中更高的故障,也许通过在调用方中使用断路器。

如果应用程序的所有实例都未准备就绪,则带 type=ClusterIPNodePort 的 Kubernetes 服务不接受任何传入连接。由于没有连接,所以没有 HTTP 错误响应(503 等)。带 type=LoadBalancer 的服务可能接受或不接受连接,具体取决于提供商。具有显式 ingress 的服务也会以取决于实现的方式响应——入口服务本身必须决定如何处理下游的 “connection refused”。在负载平衡器和入口的情况下,很可能是 HTTP 503。

此外,如果应用程序使用 Kubernetes autoscaling,它对从负载平衡器中移除应用程序的反应可能不同,具体取决于其自动伸缩器配置。

Application Lifecycle and Probe States

Kubernetes 探测支持的一个重要方面是它与应用程序生命周期的协调一致。AvailabilityState (也就是应用程序的内存内部状态)与实际探测(公开该状态)之间有显着差别。根据应用程序生命周期的阶段,该探测可能不可用。

Spring Boot 会发布 application events during startup and shutdown,并且探测可以监听此类事件并公开 AvailabilityState 信息。

下表显示了 AvailabilityState 和 HTTP 连接器在不同阶段的状态。

Spring Boot 应用程序启动时:

Startup phase LivenessState ReadinessState HTTP server Notes

Starting

BROKEN

REFUSING_TRAFFIC

Not started

Kubernetes 会检查“活跃状况”探测,如果该探测时间过长,会重新启动应用程序。

Started

CORRECT

REFUSING_TRAFFIC

Refuses requests

应用程序上下文得到刷新。应用程序执行启动任务,但尚未接收流量。

Ready

CORRECT

ACCEPTING_TRAFFIC

Accepts requests

启动任务已完成。应用程序正在接收流量。

Spring Boot 应用程序关闭时:

Shutdown phase Liveness State Readiness State HTTP server Notes

Running

CORRECT

ACCEPTING_TRAFFIC

Accepts requests

Shutdown has been requested.

Graceful shutdown

CORRECT

REFUSING_TRAFFIC

New requests are rejected

如果已启用,graceful shutdown processes in-flight requests

Shutdown complete

N/A

N/A

Server is shut down

应用程序上下文关闭且应用程序已关闭。

请参阅 Kubernetes container lifecycle section 了解更多有关 Kubernetes 部署的信息。

Application Information

应用程序信息公开从所有 {code-spring-boot-actuator-src}/info/InfoContributor.java[InfoContributor] bean(已在 ApplicationContext 中定义)收集的各种信息。Spring Boot 包含多个自动配置的 InfoContributor bean,您也可以编写自己的。

Auto-configured InfoContributors

在适当的时候,Spring 将自动配置以下 InfoContributor bean:

ID Name Description Prerequisites

build

{code-spring-boot-actuator-src}/info/BuildInfoContributor.java[BuildInfoContributor]

Exposes build information.

A META-INF/build-info.properties resource.

env

{code-spring-boot-actuator-src}/info/EnvironmentInfoContributor.java[EnvironmentInfoContributor]

公开名称以 info. 开头的任何属性 Environment

None.

git

{code-spring-boot-actuator-src}/info/GitInfoContributor.java[GitInfoContributor]

Exposes git information.

A git.properties resource.

java

{code-spring-boot-actuator-src}/info/JavaInfoContributor.java[JavaInfoContributor]

Exposes Java runtime information.

None.

os

{code-spring-boot-actuator-src}/info/OsInfoContributor.java[OsInfoContributor]

Exposes Operating System information.

None.

process

{code-spring-boot-actuator-src}/info/ProcessInfoContributor.java[ProcessInfoContributor]

Exposes process information.

None.

单独分发者的启用与否由其 management.info.<id>.enabled 属性控制。不同的分发者对此属性有不同的默认值,具体取决于其前提条件和它们公开信息的性质。

如果没有前置条件表明应启用它们,envjavaosprocess 分发者默认情况下处于禁用状态。可通过将 management.info.<id>.enabled 属性设置为 true 来启用每个分发者。

buildgit 信息分发者默认情况下处于启用状态。可通过将 management.info.<id>.enabled 属性设置为 false 来禁用每个分发者。或者,要禁用通常默认启用的所有分发者,将 configprop:management.info.defaults.enabled[] 属性设置为 false

Custom Application Information

env 分发者启用时,您可以通过设置 info.* Spring 属性来定制 info 终端公开的数据。所有 info 键下的 Environment 属性会自动公开。例如,您可以添加以下设置到 application.properties 文件:

info:
  app:
    encoding: "UTF-8"
    java:
      source: "17"
      target: "17"

您可以也 expand info properties at build time 那些值,而不是硬编码。 假设您使用 Maven,您可以这样重写前一个示例:

info:
  app:
    encoding: "@project.build.sourceEncoding@"
    java:
      source: "@java.version@"
      target: "@java.version@"

Git Commit Information

info 终端的另一个有用的功能是它能发布有关 git 源代码存储库在项目构建时的状态的信息。如果存在 GitProperties bean,您可以使用 info 终端公开这些属性。

如果类路径的根目录中存在 git.properties 文件,则会自动配置一个 GitProperties bean。请参阅“how to generate git information”了解更多详情。

默认情况下,此终端公开 git.branchgit.commit.idgit.commit.time 属性(如果存在)。如果您不希望在终端响应中出现任何这些属性,则需要从 git.properties 文件中排除这些属性。如果您想显示全部 git 信息(即 git.properties 的全部内容),请使用 configprop:management.info.git.mode[] 属性,如下所示:

management:
  info:
    git:
      mode: "full"

要从 info 终端中完全禁用 git 提交信息,请将 configprop:management.info.git.enabled[] 属性设置为 false,如下所示:

management:
  info:
    git:
      enabled: false

Build Information

如果 BuildProperties bean 可用,info 端点还可以发布有关你的构建的信息,只要 classpath 中提供 META-INF/build-info.properties 文件,情况即是如此。

Maven 和 Gradle 插件均可生成该文件,有关更多详细信息,请参阅“how to generate build information”。

Java Information

info 端点发布有关你的 Java 运行时环境的信息,有关更多详细信息,请参阅 JavaInfo

OS Information

info 端点发布有关你的操作系统的的信息,有关更多详细信息,请参阅 OsInfo

Process Information

info 端点发布有关你的进程的信息,有关更多详细信息,请参阅 ProcessInfo

Writing Custom InfoContributors

若要提供自定义应用程序信息,可以注册实现 {code-spring-boot-actuator-src}/info/InfoContributor.java[InfoContributor] 界面的 Spring bean。

以下示例包含一个具有单个值的 example 条目:

如果访问了 info 端点,应该会看到包含以下附加条目的响应:

{
	"example": {
		"key" : "value"
	}
}