Spring Boot 包含许多附加功能,可帮助您在将应用程序投入生产时监控和管理应用程序。您可以选择使用 HTTP 端点或 JMX 来管理和监控您的应用程序。审核、运行状况和指标收集也可以自动应用于您的应用程序。
1. 启用生产就绪功能
该spring-boot-actuator模块提供了 Spring Boot 的所有生产就绪功能。启用这些功能的推荐方法是添加对spring-boot-starter-actuator“Starter”的依赖项。
要将执行器添加到基于 Maven 的项目,请添加以下“Starter”依赖项:
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>对于 Gradle,请使用以下声明:
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}2. 端点
执行器端点允许您监视应用程序并与应用程序交互。Spring Boot 包含许多内置端点,并允许您添加自己的端点。例如,health端点提供基本的应用程序运行状况信息。
您可以启用或禁用每个单独的端点,并通过 HTTP 或 JMX 公开它们(使它们可以远程访问)。当端点同时启用和公开时,该端点被认为可用。内置端点仅在可用时才会自动配置。大多数应用程序选择通过 HTTP 公开,其中端点的 ID 和前缀/actuator映射到 URL。例如,默认情况下,health端点映射到/actuator/health.
以下与技术无关的端点可用:
| ID | 描述 | 
|---|---|
| 
 | 公开当前应用程序的审核事件信息。需要一颗 | 
| 
 | 显示应用程序中所有 Spring bean 的完整列表。 | 
| 
 | 公开可用的缓存。 | 
| 
 | 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 | 
| 
 | 显示所有的整理列表 | 
| 
 | 公开 Spring 的属性 | 
| 
 | 显示已应用的任何 Flyway 数据库迁移。需要一颗或多颗 | 
| 
 | 显示应用程序健康信息。 | 
| 
 | 显示 HTTP 交换信息(默认情况下,最近 100 个 HTTP 请求-响应交换)。需要一颗 | 
| 
 | 显示任意应用程序信息。 | 
| 
 | 显示 Spring 集成图。需要依赖于 | 
| 
 | 显示和修改应用程序中记录器的配置。 | 
| 
 | 显示已应用的任何 Liquibase 数据库迁移。需要一颗或多颗 | 
| 
 | 显示当前应用程序的“指标”信息。 | 
| 
 | 显示所有路径的整理列表 | 
| 
 | 显示有关 Quartz Scheduler 作业的信息。 | 
| 
 | 显示应用程序中的计划任务。 | 
| 
 | 允许从 Spring Session 支持的会话存储中检索和删除用户会话。需要一个使用 Spring Session 的基于 servlet 的 Web 应用程序。 | 
| 
 | 让应用程序正常关闭。仅在使用 jar 包装时有效。默认禁用。 | 
| 
 | 显示由 收集的启动步骤数据 | 
| 
 | 执行线程转储。 | 
如果您的应用程序是 Web 应用程序(Spring MVC、Spring WebFlux 或 Jersey),您可以使用以下附加端点:
| ID | 描述 | 
|---|---|
| 
 | 返回堆转储文件。在 HotSpot JVM 上, | 
| 
 | 返回日志文件的内容(如果已设置 | 
| 
 | 以可由 Prometheus 服务器抓取的格式公开指标。需要依赖于 | 
2.1. 启用端点
默认情况下,除 之外的所有端点shutdown均已启用。要配置端点的启用,请使用其management.endpoint.<id>.enabled属性。以下示例启用shutdown端点:
management.endpoint.shutdown.enabled=truemanagement:
  endpoint:
    shutdown:
      enabled: true如果您希望端点启用选择加入而不是选择退出,请将该management.endpoints.enabled-by-default属性设置为false并使用各个端点enabled属性来选择重新加入。以下示例启用该info端点并禁用所有其他端点:
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=truemanagement:
  endpoints:
    enabled-by-default: false
  endpoint:
    info:
      enabled: true| 禁用的端点将从应用程序上下文中完全删除。如果您只想更改公开端点的技术,请改用 include和exclude属性。 | 
2.2. 暴露端点
默认情况下,仅通过 HTTP 和 JMX 公开运行状况端点。由于端点可能包含敏感信息,因此您应该仔细考虑何时公开它们。
要更改公开的端点,请使用以下特定于技术include和exclude属性:
| 财产 | 默认 | 
|---|---|
| 
 | |
| 
 | 
 | 
| 
 | |
| 
 | 
 | 
该include属性列出了公开的端点的 ID。该exclude属性列出了不应公开的端点的 ID。财产exclude优先于include财产。您可以使用端点 ID 列表来配置include和属性。exclude
例如,要仅通过 JMX 公开health和info端点,请使用以下属性:
management.endpoints.jmx.exposure.include=health,infomanagement:
  endpoints:
    jmx:
      exposure:
        include: "health,info"*可用于选择所有端点。例如,要通过 HTTP 公开除env和beans端点之外的所有内容,请使用以下属性:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beansmanagement:
  endpoints:
    web:
      exposure:
        include: "*"
        exclude: "env,beans"| *在 YAML 中具有特殊含义,因此如果要包含(或排除)所有端点,请务必添加引号。 | 
| 如果您的应用程序公开暴露,我们强烈建议您也保护您的端点。 | 
| 如果您想在端点公开时实现自己的策略,您可以注册一个 EndpointFilterbean。 | 
2.3. 安全
出于安全目的,/health默认情况下仅通过 HTTP 公开端点。您可以使用该management.endpoints.web.exposure.include属性来配置公开的端点。
| 在设置之前 management.endpoints.web.exposure.include,请确保暴露的执行器不包含敏感信息,通过将它们放置在防火墙后面来保护它们,或者通过 Spring Security 之类的东西来保护它们。 | 
如果 Spring Security 位于类路径上并且不SecurityFilterChain存在其他 bean,则除/healthSpring Boot 自动配置之外的所有执行器都受到保护。如果您定义自定义SecurityFilterChainbean,Spring Boot 自动配置会退出并让您完全控制执行器访问规则。
如果您希望为 HTTP 端点配置自定义安全性(例如,仅允许具有特定角色的用户访问它们),Spring Boot 提供了一些方便的RequestMatcher对象,您可以将它们与 Spring Security 结合使用。
典型的 Spring Security 配置可能类似于以下示例:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint());
        http.authorizeHttpRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
        http.httpBasic(withDefaults());
        return http.build();
    }
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
            requests.anyRequest().hasRole("ENDPOINT_ADMIN")
        }
        http.httpBasic(withDefaults())
        return http.build()
    }
}
前面的示例用于EndpointRequest.toAnyEndpoint()将请求匹配到任何端点,然后确保所有端点都具有该ENDPOINT_ADMIN角色。上还提供了其他几种匹配器方法EndpointRequest。有关详细信息,请参阅 API 文档(HTML或PDF)。
如果您在防火墙后面部署应用程序,您可能希望无需身份验证即可访问所有执行器端点。您可以通过更改management.endpoints.web.exposure.include属性来实现此目的,如下所示:
management.endpoints.web.exposure.include=*management:
  endpoints:
    web:
      exposure:
        include: "*"此外,如果存在 Spring Security,您将需要添加自定义安全配置,以允许对端点进行未经身份验证的访问,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint());
        http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
        return http.build();
    }
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
            requests.anyRequest().permitAll()
        }
        return http.build()
    }
}
| 在前面的两个示例中,配置仅适用于执行器端点。由于 Spring Boot 的安全配置在存在任何 bean 的情况下都会完全退出,因此您需要使用适用于应用程序其余部分的规则来 SecurityFilterChain配置另一个bean。SecurityFilterChain | 
2.3.1. 跨站请求伪造保护
由于 Spring Boot 依赖于 Spring Security 的默认设置,因此默认情况下会打开 CSRF 保护。这意味着,当使用默认安全配置时,需要 a POST(关闭和记录器端点)、 aPUT或 a 的执行器端点会收到 403(禁止)错误。DELETE
| 我们建议仅当您创建非浏览器客户端使用的服务时才完全禁用 CSRF 保护。 | 
您可以在Spring Security 参考指南中找到有关 CSRF 保护的更多信息。
2.4. 配置端点
端点自动缓存对不带任何参数的读取操作的响应。要配置端点缓存响应的时间量,请使用其cache.time-to-live属性。以下示例将端点缓存的生存时间设置beans为 10 秒:
management.endpoint.beans.cache.time-to-live=10smanagement:
  endpoint:
    beans:
      cache:
        time-to-live: "10s"| 该 management.endpoint.<name>前缀唯一标识正在配置的端点。 | 
2.5. 执行器 Web 端点的超媒体
添加了一个“发现页面”,其中包含指向所有端点的链接。默认情况下,“发现页面”可用/actuator。
要禁用“发现页面”,请将以下属性添加到您的应用程序属性中:
management.endpoints.web.discovery.enabled=falsemanagement:
  endpoints:
    web:
      discovery:
        enabled: false配置自定义管理上下文路径后,“发现页面”会自动从/actuator管理上下文的根移动。例如,如果管理上下文路径为/management,则可从 获取发现页面/management。当管理上下文路径设置为 时/,发现页面将被禁用,以防止与其他映射发生冲突的可能性。
2.6。CORS 支持
跨域资源共享(CORS) 是一种W3C 规范,可让您以灵活的方式指定授权哪种跨域请求。如果您使用 Spring MVC 或 Spring WebFlux,您可以配置 Actuator 的 Web 端点来支持此类场景。
CORS 支持默认处于禁用状态,只有在设置该management.endpoints.web.cors.allowed-origins属性后才会启用。以下配置允许来自域的GET调用:POSTexample.com
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POSTmanagement:
  endpoints:
    web:
      cors:
        allowed-origins: "https://example.com"
        allowed-methods: "GET,POST"| 请参阅 CorsEndpointProperties参考资料 获取完整的选项列表。 | 
2.7. 实施自定义端点
如果添加@Bean用 注释,则任何用、、 或@Endpoint注释的方法都会自动通过 JMX 公开,并且在 Web 应用程序中也会通过 HTTP 公开。可以使用 Jersey、Spring MVC 或 Spring WebFlux 通过 HTTP 公开端点。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。@ReadOperation@WriteOperation@DeleteOperation
以下示例公开了返回自定义对象的读取操作:
@ReadOperation
public CustomData getData() {
    return new CustomData("test", 5);
}
@ReadOperation
fun getData(): CustomData {
    return CustomData("test", 5)
}
您还可以使用@JmxEndpoint或编写特定于技术的端点@WebEndpoint。这些端点仅限于各自的技术。例如,@WebEndpoint仅通过 HTTP 公开,而不通过 JMX 公开。
您可以使用@EndpointWebExtension和编写特定于技术的扩展@EndpointJmxExtension。这些注释允许您提供特定于技术的操作来增强现有端点。
最后,如果您需要访问特定于 Web 框架的功能,您可以实现 servlet 或 Spring@Controller和@RestController端点,但代价是它们无法通过 JMX 或使用不同的 Web 框架时可用。
2.7.1. 接收输入
端点上的操作通过其参数接收输入。当通过网络公开时,这些参数的值取自 URL 的查询参数和 JSON 请求正文。当通过 JMX 公开时,参数将映射到 MBean 操作的参数。默认情况下需要参数。@javax.annotation.Nullable通过使用或进行注释,可以将它们设为可选@org.springframework.lang.Nullable。
您可以将 JSON 请求正文中的每个根属性映射到端点的参数。考虑以下 JSON 请求正文:
{
    "name": "test",
    "counter": 42
}String name您可以使用它来调用采用和参数的写入操作int counter,如以下示例所示:
@WriteOperation
public void updateData(String name, int counter) {
    // injects "test" and 42
}
@WriteOperation
fun updateData(name: String?, counter: Int) {
    // injects "test" and 42
}
| 由于端点与技术无关,因此只能在方法签名中指定简单类型。特别是,不支持
使用 CustomData定义 aname和属性的类型来声明单个参数。counter | 
| 为了让输入映射到操作方法的参数,实现端点的 Java 代码应使用 进行编译 -parameters,实现端点的 Kotlin 代码应使用 进行编译-java-parameters。如果您使用 Spring Boot 的 Gradle 插件或者使用 Maven 和spring-boot-starter-parent. | 
2.7.2. 自定义 Web 端点
@Endpoint、@WebEndpoint、 或上的操作@EndpointWebExtension会使用 Jersey、Spring MVC 或 Spring WebFlux 通过 HTTP 自动公开。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。
小路
谓词的路径由端点的 ID 和 Web 公开端点的基本路径确定。默认基本路径是/actuator. 例如,ID 为 的端点sessions用作/actuator/sessions谓词中的路径。
您可以通过注释操作方法的一个或多个参数来进一步自定义路径@Selector。这样的参数作为路径变量添加到路径谓词中。当调用端点操作时,变量的值被传递到操作方法中。如果要捕获所有剩余的路径元素,可以添加@Selector(Match=ALL_REMAINING)到最后一个参数并使其成为与String[].
HTTP方式
谓词的HTTP方法由操作类型决定,如下表所示:
| 手术 | HTTP方式 | 
|---|---|
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
消耗
对于使用请求主体的@WriteOperation(HTTP ),谓词的子句是。对于所有其他操作,该子句为空。POSTconsumesapplication/vnd.spring-boot.actuator.v2+json, application/jsonconsumes
生产
谓词的子句可以由、、 和注释的属性produces确定。该属性是可选的。如果未使用,则自动确定该子句。produces@DeleteOperation@ReadOperation@WriteOperationproduces
如果操作方法返回voidor Void,则该produces子句为空。如果操作方法返回 a org.springframework.core.io.Resource,则produces子句为application/octet-stream。对于所有其他操作,produces子句是application/vnd.spring-boot.actuator.v2+json, application/json。
Web 端点响应状态
端点操作的默认响应状态取决于操作类型(读、写或删除)以及操作返回的内容(如果有)。
如果 a@ReadOperation返回一个值,则响应状态将为 200(OK)。如果它没有返回值,则响应状态将为 404(未找到)。
如果 a@WriteOperation或@DeleteOperation返回一个值,则响应状态将为 200(正常)。如果它不返回值,则响应状态将为 204(无内容)。
如果调用操作时没有指定参数或参数无法转换为所需类型,则不会调用该操作方法,并且响应状态将为 400(Bad Request)。
2.8. 健康资讯
您可以使用运行状况信息来检查正在运行的应用程序的状态。监控软件经常使用它在生产系统出现故障时向某人发出警报。端点公开的信息health取决于management.endpoint.health.show-details和management.endpoint.health.show-components属性,可以使用以下值之一进行配置:
| 姓名 | 描述 | 
|---|---|
| 
 | 细节永远不会显示。 | 
| 
 | 详细信息仅向授权用户显示。可以使用 来配置授权角色 | 
| 
 | 详细信息向所有用户显示。 | 
默认值为never。当用户担任一个或多个端点角色时,该用户被视为已获得授权。如果端点没有配置角色(默认),则所有经过身份验证的用户都被视为已授权。您可以使用属性来配置角色management.endpoint.health.roles。
| 如果您已保护您的应用程序并希望使用 always,您的安全配置必须允许经过身份验证和未经身份验证的用户访问运行状况端点。 | 
健康信息是从 a 的内容中收集的HealthContributorRegistry(默认情况下,HealthContributor是在您的 中定义的所有实例ApplicationContext)。Spring Boot 包含许多自动配置的HealthContributors,您也可以编写自己的。
AHealthContributor可以是 aHealthIndicator或 a CompositeHealthContributor。AHealthIndicator提供实际的健康信息,包括Status. ACompositeHealthContributor提供了 other 的组合HealthContributors。贡献者一起形成一个树结构来表示整个系统的健康状况。
默认情况下,最终的系统运行状况由 a 派生StatusAggregator,它HealthIndicator根据状态的有序列表对每个状态进行排序。排序列表中的第一个状态用作整体健康状态。如果 noHealthIndicator返回已知的状态StatusAggregator,UNKNOWN则使用状态。
| 您可以使用 HealthContributorRegistry在运行时注册和取消注册运行状况指示器。 | 
2.8.1. 自动配置的健康指标
在适当的情况下,Spring Boot 会自动配置HealthIndicators下表中列出的内容。您还可以通过配置来启用或禁用选定的指标management.health.key.enabled,key如下表所列:
| 钥匙 | 姓名 | 描述 | 
|---|---|---|
| 
 | 检查 Cassandra 数据库是否已启动。 | |
| 
 | 检查 Couchbase 集群是否已启动。 | |
| 
 | 
 | |
| 
 | 检查磁盘空间是否不足。 | |
| 
 | 检查 Elasticsearch 集群是否已启动。 | |
| 
 | 检查 Hazelcast 服务器是否已启动。 | |
| 
 | 检查 InfluxDB 服务器是否已启动。 | |
| 
 | 检查 JMS 代理是否已启动。 | |
| 
 | 检查 LDAP 服务器是否已启动。 | |
| 
 | 检查邮件服务器是否已启动。 | |
| 
 | 检查 Mongo 数据库是否已启动。 | |
| 
 | 检查 Neo4j 数据库是否已启动。 | |
| 
 | 始终以 响应 | |
| 
 | 检查 Rabbit 服务器是否已启动。 | |
| 
 | 检查 Redis 服务器是否已启动。 | 
| 您可以通过设置属性来禁用它们 management.health.defaults.enabled。 | 
其他HealthIndicators可用但默认情况下未启用:
| 钥匙 | 姓名 | 描述 | 
|---|---|---|
| 
 | 公开“Liveness”应用程序可用性状态。 | |
| 
 | 显示“Readiness”应用程序可用性状态。 | 
2.8.2. 编写自定义健康指标
要提供自定义健康信息,您可以注册实现该HealthIndicator接口的 Spring bean。您需要提供该方法的实现health()并返回Health响应。响应Health应包含状态,并且可以选择包含要显示的其他详细信息。以下代码显示了示例HealthIndicator实现:
@Component
public class MyHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }
    private int check() {
        // perform some specific health check
        return ...
    }
}
@Component
class MyHealthIndicator : HealthIndicator {
    override fun health(): Health {
        val errorCode = check()
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build()
        }
        return Health.up().build()
    }
    private fun check(): Int {
        // perform some specific health check
        return  ...
    }
}
| 给定的标识符 HealthIndicator是不带后缀的 bean 名称HealthIndicator(如果存在)。在前面的示例中,健康信息在名为 的条目中可用my。 | 
| 健康指示器通常通过 HTTP 调用,并且需要在任何连接超时之前做出响应。Spring Boot 将为任何响应时间超过 10 秒的健康指标记录一条警告消息。如果要配置此阈值,可以使用该 management.endpoint.health.logging.slow-indicator-threshold属性。 | 
除了 Spring Boot 的预定义Status类型之外,还可以返回表示新系统状态的Health自定义类型。Status在这种情况下,您还需要提供StatusAggregator接口的自定义实现,或者必须使用management.endpoint.health.status.order配置属性配置默认实现。
例如,假设您的实现之一正在使用Status代码为 的新代码。要配置严重性顺序,请将以下属性添加到应用程序属性中:FATALHealthIndicator
management.endpoint.health.status.order=fatal,down,out-of-service,unknown,upmanagement:
  endpoint:
    health:
      status:
        order: "fatal,down,out-of-service,unknown,up"响应中的 HTTP 状态代码反映了整体健康状况。默认情况下,OUT_OF_SERVICE和DOWN映射到 503。任何未映射的运行状况状态(包括 )UP都会映射到 200。如果您通过 HTTP 访问运行状况端点,您可能还需要注册自定义状态映射。DOWN配置自定义映射会禁用和 的默认映射OUT_OF_SERVICE。如果要保留默认映射,则必须显式配置它们以及任何自定义映射。例如,以下属性映射FATAL到 503(服务不可用)并保留DOWN和的默认映射OUT_OF_SERVICE:
management.endpoint.health.status.http-mapping.down=503
management.endpoint.health.status.http-mapping.fatal=503
management.endpoint.health.status.http-mapping.out-of-service=503management:
  endpoint:
    health:
      status:
        http-mapping:
          down: 503
          fatal: 503
          out-of-service: 503| 如果您需要更多控制,您可以定义自己的 HttpCodeStatusMapperbean。 | 
下表显示了内置状态的默认状态映射:
| 地位 | 测绘 | 
|---|---|
| 
 | 
 | 
| 
 | 
 | 
| 
 | 默认没有映射,所以HTTP状态是 | 
| 
 | 默认没有映射,所以HTTP状态是 | 
2.8.3. 反应性健康指标
对于反应式应用程序(例如使用 Spring WebFlux 的应用程序),ReactiveHealthContributor提供了用于获取应用程序运行状况的非阻塞契约。与传统的 类似HealthContributor,健康信息是从 a 的内容中收集的ReactiveHealthContributorRegistry(默认情况下,是在您的 中定义的所有HealthContributor和ReactiveHealthContributor实例ApplicationContext)。HealthContributors不检查反应式 API 的常规内容在弹性调度程序上执行。
| 在反应式应用程序中,您应该使用 ReactiveHealthContributorRegistry在运行时注册和取消注册运行状况指示器。如果你需要注册一个常规的HealthContributor,你应该用 包裹它ReactiveHealthContributor#adapt。 | 
要从反应式 API 提供自定义运行状况信息,您可以注册实现该ReactiveHealthIndicator接口的 Spring bean。以下代码显示了示例ReactiveHealthIndicator实现:
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
    @Override
    public Mono<Health> health() {
        return doHealthCheck().onErrorResume((exception) ->
            Mono.just(new Health.Builder().down(exception).build()));
    }
    private Mono<Health> doHealthCheck() {
        // perform some specific health check
        return ...
    }
}
@Component
class MyReactiveHealthIndicator : ReactiveHealthIndicator {
    override fun health(): Mono<Health> {
        return doHealthCheck()!!.onErrorResume { exception: Throwable? ->
            Mono.just(Health.Builder().down(exception).build())
        }
    }
    private fun doHealthCheck(): Mono<Health>? {
        // perform some specific health check
        return  ...
    }
}
| 要自动处理错误,请考虑从 AbstractReactiveHealthIndicator. | 
2.8.4. 自动配置的 ReactiveHealthIndicators
在适当的时候,Spring Boot 会自动配置以下内容ReactiveHealthIndicators:
| 钥匙 | 姓名 | 描述 | 
|---|---|---|
| 
 | 检查 Cassandra 数据库是否已启动。 | |
| 
 | 检查 Couchbase 集群是否已启动。 | |
| 
 | 检查 Elasticsearch 集群是否已启动。 | |
| 
 | 检查 Mongo 数据库是否已启动。 | |
| 
 | 检查 Neo4j 数据库是否已启动。 | |
| 
 | 检查 Redis 服务器是否已启动。 | 
| 如有必要,反应性指标会取代常规指标。此外,任何 HealthIndicator未显式处理的内容都会自动包装。 | 
2.8.5。健康团体
有时,将健康指标组织成可用于不同目的的组很有用。
要创建运行状况指示器组,您可以使用management.endpoint.health.group.<name>属性并将运行状况指示器 ID 列表指定为include或exclude。例如,要创建仅包含数据库指标的组,您可以定义以下内容:
management.endpoint.health.group.custom.include=dbmanagement:
  endpoint:
    health:
      group:
        custom:
          include: "db"然后您可以通过点击 来检查结果localhost:8080/actuator/health/custom。
同样,要创建一个从组中排除数据库指标并包含所有其他指标的组,您可以定义以下内容:
management.endpoint.health.group.custom.exclude=dbmanagement:
  endpoint:
    health:
      group:
        custom:
          exclude: "db"默认情况下,如果运行状况组包含或排除不存在的运行状况指示器,启动将失败。要禁用此行为,请设置management.endpoint.health.validate-group-membership为false。
默认情况下,组继承与系统运行状况相同的StatusAggregator设置HttpCodeStatusMapper。但是,您也可以按组定义它们。如果需要,您还可以覆盖show-details和roles属性:
management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500
management.endpoint.health.group.custom.status.http-mapping.out-of-service=500management:
  endpoint:
    health:
      group:
        custom:
          show-details: "when-authorized"
          roles: "admin"
          status:
            order: "fatal,up"
            http-mapping:
              fatal: 500
              out-of-service: 500| @Qualifier("groupname")如果您需要注册自定义StatusAggregator或HttpCodeStatusMapperbean 以便与组一起使用,
则可以使用。 | 
健康组还可以包括/排除CompositeHealthContributor. 您还可以仅包含/排除CompositeHealthContributor. 这可以使用组件的完全限定名称来完成,如下所示:
management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b"在上面的示例中,custom组将包含 ,其HealthContributor名称primary是 复合 的一个组件test。这里,primary它本身是一个组合,HealthContributor带有该名称的b将被排除在custom组之外。
可以通过主端口或管理端口上的附加路径提供健康组。这在 Kubernetes 等云环境中非常有用,出于安全目的,为执行器端点使用单独的管理端口是很常见的。拥有单独的端口可能会导致运行状况检查不可靠,因为即使运行状况检查成功,主应用程序也可能无法正常工作。健康组可以配置额外的路径,如下所示:
management.endpoint.health.group.live.additional-path="server:/healthz"这将使live运行状况组在位于 的主服务器端口上可用/healthz。前缀是强制性的,并且必须是server:(表示主服务器端口)或management:(表示管理端口,如果已配置)。路径必须是单个路径段。
2.9. Kubernetes 探针
部署在 Kubernetes 上的应用程序可以通过Container Probes提供有关其内部状态的信息。根据您的 Kubernetes 配置,kubelet 调用这些探测器并对结果做出反应。
默认情况下,Spring Boot 管理您的应用程序可用性状态。如果部署在 Kubernetes 环境中,执行器会从界面收集“Liveness”和“Readiness”信息,并在专用运行状况指标ApplicationAvailability中使用该信息:和。这些指标显示在全球健康端点 ( ) 上。它们还通过使用健康组:和公开为单独的 HTTP 探针。LivenessStateHealthIndicatorReadinessStateHealthIndicator"/actuator/health""/actuator/health/liveness""/actuator/health/readiness"
然后,您可以使用以下端点信息配置 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 服务器端口或单独的管理端口。 | 
仅当应用程序在 Kubernetes 环境中运行时,这些运行状况组才会自动启用。您可以使用management.endpoint.health.probes.enabled配置属性在任何环境中启用它们。
| 如果应用程序的启动时间长于配置的活跃期,Kubernetes 会提到 "startupProbe"作为可能的解决方案。一般来说,"startupProbe"这里不一定需要,因为"readinessProbe"直到所有启动任务完成后才会失败。这意味着您的应用程序在准备就绪之前不会接收流量。但是,如果您的应用程序需要很长时间才能启动,请考虑使用 a"startupProbe"以确保 Kubernetes 不会在启动过程中终止您的应用程序。请参阅描述探针在应用程序生命周期中的行为方式的部分。 | 
如果您的 Actuator 端点部署在单独的管理上下文上,则端点不会使用与主应用程序相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序无法正常工作(例如,它无法接受新连接),探测检查也可能会成功。因此,在主服务器端口上提供liveness和健康组是一个好主意吗?readiness这可以通过设置以下属性来完成:
management.endpoint.health.probes.add-additional-paths=true这将使该组liveness在主服务器端口上可用。可以使用每个组上的属性来自定义路径,有关详细信息,请参阅运行状况组。/livezreadiness/readyzadditional-path
2.9.1. 使用 Kubernetes 探针检查外部状态
Actuator 将“liveness”和“readiness”探针配置为健康组。这意味着他们可以使用所有健康组功能。例如,您可以配置其他运行状况指标:
management.endpoint.health.group.readiness.include=readinessState,customCheckmanagement:
  endpoint:
    health:
      group:
        readiness:
          include: "readinessState,customCheck"默认情况下,Spring Boot 不会向这些组添加其他健康指标。
“活跃度”探测不应依赖于外部系统的健康检查。如果应用程序的活动状态被破坏,Kubernetes 会尝试通过重新启动应用程序实例来解决该问题。这意味着,如果外部系统(例如数据库、Web API 或外部缓存)发生故障,Kubernetes 可能会重新启动所有应用程序实例并造成级联故障。
对于“就绪”探测,应用程序开发人员必须谨慎选择检查外部系统。因此,Spring Boot 不会在就绪探针中包含任何额外的运行状况检查。如果应用程序实例的就绪状态未就绪,Kubernetes 不会将流量路由到该实例。某些外部系统可能不会被应用程序实例共享,在这种情况下,它们可以包含在就绪探针中。其他外部系统可能对应用程序不是必需的(应用程序可能有断路器和回退),在这种情况下绝对不应该包含它们。不幸的是,由所有应用程序实例共享的外部系统很常见,您必须做出判断:将其包含在就绪探针中,并期望当外部服务关闭时应用程序停止服务或将其排除在外并处理堆栈高层的故障,也许可以通过在调用者中使用断路器来处理。
| 如果应用程序的所有实例均未就绪,则 Kubernetes 服务接受 type=ClusterIP或NodePort不接受任何传入连接。由于没有连接,因此没有 HTTP 错误响应(503 等)。服务type=LoadBalancer可能接受也可能不接受连接,具体取决于提供商。具有显式入口的服务也会以取决于实现的方式进行响应 - 入口服务本身必须决定如何处理来自下游的“连接被拒绝”。在负载均衡器和入口的情况下,HTTP 503 很可能发生。 | 
此外,如果应用程序使用 Kubernetes自动缩放,它可能会对从负载均衡器中取出的应用程序做出不同的反应,具体取决于其自动缩放器配置。
2.9.2. 应用程序生命周期和探测状态
Kubernetes Probes 支持的一个重要方面是它与应用程序生命周期的一致性。AvailabilityState(应用程序的内存中内部状态)和实际探针(公开该状态)之间存在显着差异。根据应用程序生命周期的阶段,探测器可能不可用。
Spring Boot 在启动和关闭期间发布应用程序事件,探针可以侦听此类事件并公开AvailabilityState信息。
下表显示了AvailabilityStateHTTP 连接器在不同阶段的状态。
当 Spring Boot 应用程序启动时:
| 启动阶段 | 活跃状态 | 准备状态 | HTTP服务器 | 笔记 | 
|---|---|---|---|---|
| 开始 | 
 | 
 | 没有开始 | Kubernetes 检查“liveness”Probe,如果时间过长则重新启动应用程序。 | 
| 开始 | 
 | 
 | 拒绝请求 | 应用程序上下文已刷新。应用程序执行启动任务并且尚未接收流量。 | 
| 准备好 | 
 | 
 | 接受请求 | 启动任务完成。应用程序正在接收流量。 | 
当 Spring Boot 应用程序关闭时:
| 停机阶段 | 活性状态 | 准备状态 | HTTP服务器 | 笔记 | 
|---|---|---|---|---|
| 跑步 | 
 | 
 | 接受请求 | 已请求关闭。 | 
| 优雅关机 | 
 | 
 | 新请求被拒绝 | 如果启用,正常关闭会处理正在进行的请求。 | 
| 关机完成 | 不适用 | 不适用 | 服务器已关闭 | 应用程序上下文关闭并且应用程序关闭。 | 
| 有关 Kubernetes 部署的更多信息, 请参阅Kubernetes 容器生命周期部分。 | 
2.10. 应用信息
应用程序信息公开了从InfoContributor您的ApplicationContext. Spring Boot 包含许多自动配置的InfoContributorbean,您可以编写自己的 bean。
2.10.1. 自动配置的 InfoContributors
在适当的时候,Spring 会自动配置以下InfoContributorbean:
| ID | 姓名 | 描述 | 先决条件 | 
|---|---|---|---|
| 
 | 公开构建信息。 | 一个 | |
| 
 | 
 | 没有任何。 | |
| 
 | 公开 git 信息。 | 一个 | |
| 
 | 公开 Java 运行时信息。 | 没有任何。 | |
| 
 | 公开操作系统信息。 | 没有任何。 | 
是否启用单个贡献者由其属性控制management.info.<id>.enabled。不同的贡献者对此属性有不同的默认值,具体取决于他们的先决条件和他们公开的信息的性质。
由于没有任何先决条件表明应启用它们,因此默认情况下会禁用env、java和贡献者。每个都可以通过将其属性设置为 来os启用。management.info.<id>.enabledtrue
默认情况下启用 和 信息贡献者build。每个都可以通过将其属性git设置为 来禁用。或者,要禁用通常默认启用的每个贡献者,请将属性设置为。management.info.<id>.enabledfalsemanagement.info.defaults.enabledfalse
2.10.2. 定制申请信息
启用贡献者后,您可以通过设置Spring 属性来自env定义端点公开的数据。该密钥下的所有属性都会自动公开。例如,您可以将以下设置添加到您的文件中:infoinfo.*Environmentinfoapplication.properties
info.app.encoding=UTF-8
info.app.java.source=17
info.app.java.target=17info:
  app:
    encoding: "UTF-8"
    java:
      source: "17"
      target: "17"| 您还可以在构建时扩展信息属性,而不是对这些值进行硬编码。 假设您使用 Maven,您可以将前面的示例重写如下: Properties Yaml  | 
2.10.3. Git 提交信息
端点的另一个有用功能是它能够在项目构建时info发布有关源代码存储库状态的信息。git如果GitPropertiesbean 可用,您可以使用info端点来公开这些属性。
| 如果类路径根目录下有可用文件,则
bean GitProperties会自动配置。更多详情git.properties请参见“如何生成git信息”。 | 
默认情况下,端点公开git.branch、git.commit.id和git.commit.time属性(如果存在)。如果您不希望端点响应中出现任何这些属性,则需要将它们从文件中排除git.properties。如果要显示完整的git信息(即完整内容git.properties),请使用该management.info.git.mode属性,如下:
management.info.git.mode=fullmanagement:
  info:
    git:
      mode: "full"要完全禁用来自端点的 git 提交信息info,请将management.info.git.enabled属性设置为false,如下所示:
management.info.git.enabled=falsemanagement:
  info:
    git:
      enabled: false2.10.4. 构建信息
如果BuildPropertiesbean 可用,info端点还可以发布有关您的构建的信息。如果META-INF/build-info.properties类路径中存在可用文件,就会发生这种情况。
| Maven 和 Gradle 插件都可以生成该文件。有关更多详细信息, 请参阅“如何生成构建信息”。 | 
2.10.5。爪哇信息
端点info发布有关您的 Java 运行时环境的信息,请参阅JavaInfo参考资料 获取更多详细信息。
2.10.6。操作系统信息
端点info发布有关您的操作系统的信息,请参阅OsInfo参考资料 获取更多详细信息。
2.10.7。编写自定义 InfoContributors
要提供自定义应用程序信息,您可以注册实现该InfoContributor接口的 Spring bean。
以下示例提供example具有单个值的条目:
@Component
public class MyInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("example", Collections.singletonMap("key", "value"));
    }
}
@Component
class MyInfoContributor : InfoContributor {
    override fun contribute(builder: Info.Builder) {
        builder.withDetail("example", Collections.singletonMap("key", "value"))
    }
}
如果您到达info端点,您应该会看到包含以下附加条目的响应:
{
    "example": {
        "key" : "value"
    }
}3. 通过HTTP进行监控和管理
如果您正在开发 Web 应用程序,Spring Boot Actuator 会自动配置所有启用的端点以通过 HTTP 公开。默认约定是使用id前缀为 的端点/actuator作为 URL 路径。例如,health暴露为/actuator/health.
| Spring MVC、Spring WebFlux 和 Jersey 原生支持 Actuator。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。 | 
3.1. 自定义管理端点路径
有时,自定义管理端点的前缀很有用。例如,您的应用程序可能已用于/actuator其他目的。您可以使用该management.endpoints.web.base-path属性更改管理端点的前缀,如以下示例所示:
management.endpoints.web.base-path=/managemanagement:
  endpoints:
    web:
      base-path: "/manage"前面的application.properties示例将端点从 更改/actuator/{id}为/manage/{id}(例如,/manage/info)。
| 除非管理端口已配置为使用不同的 HTTP 端口公开端点, management.endpoints.web.base-path否则是相对于server.servlet.context-path(对于 servlet Web 应用程序)或spring.webflux.base-path(对于反应式 Web 应用程序)而言的。如果management.server.port已配置,management.endpoints.web.base-path则相对于management.server.base-path。 | 
如果要将端点映射到不同的路径,可以使用该management.endpoints.web.path-mapping属性。
以下示例重新映射/actuator/health为/healthcheck:
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheckmanagement:
  endpoints:
    web:
      base-path: "/"
      path-mapping:
        health: "healthcheck"3.2. 自定义管理服务器端口
对于基于云的部署来说,使用默认 HTTP 端口公开管理端点是明智的选择。但是,如果您的应用程序在您自己的数据中心内运行,您可能更愿意使用不同的 HTTP 端口来公开端点。
您可以设置该management.server.port属性来更改 HTTP 端口,如以下示例所示:
management.server.port=8081management:
  server:
    port: 8081| 在 Cloud Foundry 上,默认情况下,应用程序仅在端口 8080 上接收 HTTP 和 TCP 路由请求。如果您想在 Cloud Foundry 上使用自定义管理端口,则需要显式设置应用程序的路由以将流量转发到自定义端口。 | 
3.3. 配置管理特定的 SSL
当配置为使用自定义端口时,您还可以通过使用各种属性为其配置管理服务器自己的 SSL management.server.ssl.*。例如,这样做可以让管理服务器通过 HTTP 可用,而主应用程序使用 HTTPS,如以下属性设置所示:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=falseserver:
  port: 8443
  ssl:
    enabled: true
    key-store: "classpath:store.jks"
    key-password: "secret"
management:
  server:
    port: 8080
    ssl:
      enabled: false或者,主服务器和管理服务器都可以使用 SSL,但具有不同的密钥存储,如下所示:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secretserver:
  port: 8443
  ssl:
    enabled: true
    key-store: "classpath:main.jks"
    key-password: "secret"
management:
  server:
    port: 8080
    ssl:
      enabled: true
      key-store: "classpath:management.jks"
      key-password: "secret"3.4. 自定义管理服务器地址
您可以通过设置属性来自定义管理端点可用的地址management.server.address。如果您只想侦听内部或面向操作的网络或仅侦听来自localhost.
| 仅当端口与主服务器端口不同时,您才能侦听不同的地址。 | 
以下示例application.properties不允许远程管理连接:
management.server.port=8081
management.server.address=127.0.0.1management:
  server:
    port: 8081
    address: "127.0.0.1"3.5. 禁用 HTTP 端点
如果您不想通过 HTTP 公开端点,可以将管理端口设置为-1,如以下示例所示:
management.server.port=-1management:
  server:
    port: -1您还可以通过使用该management.endpoints.web.exposure.exclude属性来实现此目的,如以下示例所示:
management.endpoints.web.exposure.exclude=*management:
  endpoints:
    web:
      exposure:
        exclude: "*"4. 通过JMX进行监控和管理
Java 管理扩展 (JMX) 提供了监视和管理应用程序的标准机制。默认情况下,此功能未启用。spring.jmx.enabled您可以通过将配置属性设置为 来打开它true。Spring Boot 公开了最合适的MBeanServer作为 ID 为 的 bean mbeanServer。任何使用 Spring JMX 注释(@ManagedResource、@ManagedAttribute或@ManagedOperation)注释的 bean 都会暴露给它。
如果您的平台提供了标准MBeanServer,则 Spring Boot 会使用该标准,并在必要时默认为 VM MBeanServer。如果这一切都失败了,MBeanServer就会创建一个新的。
请参阅JmxAutoConfiguration课程以了解更多详细信息。
默认情况下,Spring Boot 还将管理端点公开为org.springframework.boot域下的 JMX MBean。要完全控制 JMX 域中的端点注册,请考虑注册您自己的EndpointObjectNameFactory实现。
4.1. 自定义 MBean 名称
MBean 的名称通常是从id端点生成的。例如,health端点公开为org.springframework.boot:type=Endpoint,name=Health.
如果您的应用程序包含多个 Spring ApplicationContext,您可能会发现名称冲突。要解决此问题,您可以将该spring.jmx.unique-names属性设置为true以便 MBean 名称始终是唯一的。
您还可以自定义公开端点的 JMX 域。以下设置显示了在 中执行此操作的示例application.properties:
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myappspring:
  jmx:
    unique-names: true
management:
  endpoints:
    jmx:
      domain: "com.example.myapp"5. 可观察性
可观察性是从外部观察正在运行的系统的内部状态的能力。它由日志记录、指标和跟踪三大支柱组成。
对于指标和跟踪,Spring Boot 使用Micrometer Observation。要创建您自己的观察结果(这将导致指标和跟踪),您可以注入一个ObservationRegistry.
@Component
public class MyCustomObservation {
    private final ObservationRegistry observationRegistry;
    public MyCustomObservation(ObservationRegistry observationRegistry) {
        this.observationRegistry = observationRegistry;
    }
    public void doSomething() {
        Observation.createNotStarted("doSomething", this.observationRegistry)
            .lowCardinalityKeyValue("locale", "en-US")
            .highCardinalityKeyValue("userId", "42")
            .observe(() -> {
                // Execute business logic here
            });
    }
}
| 低基数标签将添加到指标和跟踪中,而高基数标签将仅添加到跟踪中。 | 
Beans的类型ObservationPredicate,GlobalObservationConvention会ObservationHandler自动注册上的ObservationRegistry。您还可以注册任意数量的ObservationRegistryCustomizerbean 来进一步配置注册表。
有关更多详细信息,请参阅千分尺观察文档。
| 可以使用单独的项目配置 JDBC 和 R2DBC 的可观察性。对于 JDBC,Datasource Micrometer 项目提供了一个 Spring Boot 启动器,它在调用 JDBC 操作时自动创建观察。请在参考文档中阅读有关它的更多信息。对于 R2DBC,R2DBC 观察的 Spring Boot 自动配置为 R2DBC 查询调用创建观察。 | 
接下来的部分将提供有关日志记录、指标和跟踪的更多详细信息。
6. 记录仪
Spring Boot Actuator 能够在运行时查看和配置应用程序的日志级别。您可以查看整个列表或单个记录器的配置,该配置由显式配置的日志记录级别以及日志记录框架赋予的有效日志记录级别组成。这些级别可以是以下级别之一:
- 
TRACE
- 
DEBUG
- 
INFO
- 
WARN
- 
ERROR
- 
FATAL
- 
OFF
- 
null
null表示没有显式配置。
7. 指标
Spring Boot Actuator 为Micrometer提供依赖管理和自动配置,Micrometer 是一个支持众多监控系统的应用程序指标外观,包括:
7.1. 入门
Spring Boot 自动配置组合MeterRegistry,并为在类路径上找到的每个受支持的实现添加一个注册表。在运行时类路径中依赖于micrometer-registry-{system}Spring Boot 足以配置注册表。
大多数注册表都有共同的功能。例如,即使 Micrometer 注册表实现位于类路径上,您也可以禁用特定注册表。以下示例禁用 Datadog:
management.datadog.metrics.export.enabled=falsemanagement:
  datadog:
    metrics:
      export:
        enabled: false您还可以禁用所有注册表,除非注册表特定属性另有说明,如以下示例所示:
management.defaults.metrics.export.enabled=falsemanagement:
  defaults:
    metrics:
      export:
        enabled: falseSpring Boot 还会将任何自动配置的注册表添加到类上的全局静态复合注册表中Metrics,除非您明确告诉它不要这样做:
management.metrics.use-global-registry=falsemanagement:
  metrics:
    use-global-registry: false在向注册表注册任何计量之前,您可以注册任意数量的MeterRegistryCustomizerbean 来进一步配置注册表,例如应用通用标签:
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return (registry) -> registry.config().commonTags("region", "us-east-1");
    }
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
    @Bean
    fun metricsCommonTags(): MeterRegistryCustomizer<MeterRegistry> {
        return MeterRegistryCustomizer { registry ->
            registry.config().commonTags("region", "us-east-1")
        }
    }
}
您可以通过更具体地了解通用类型来将自定义应用于特定的注册表实现:
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
    @Bean
    public MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
        return (registry) -> registry.config().namingConvention(this::name);
    }
    private String name(String name, Meter.Type type, String baseUnit) {
        return ...
    }
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
    @Bean
    fun graphiteMetricsNamingConvention(): MeterRegistryCustomizer<GraphiteMeterRegistry> {
        return MeterRegistryCustomizer { registry: GraphiteMeterRegistry ->
            registry.config().namingConvention(this::name)
        }
    }
    private fun name(name: String, type: Meter.Type, baseUnit: String?): String {
        return  ...
    }
}
Spring Boot 还配置了内置检测,您可以通过配置或专用注释标记来控制它们。
7.2. 支持的监控系统
本节简要介绍每个受支持的监控系统。
7.2.1. 应用光学
默认情况下,AppOptics 注册表会定期将指标推送到api.appoptics.com/v1/measurements. 要将指标导出到 SaaS AppOptics,必须提供您的 API 令牌:
management.appoptics.metrics.export.api-token=YOUR_TOKENmanagement:
  appoptics:
    metrics:
      export:
        api-token: "YOUR_TOKEN"7.2.2. 阿特拉斯
默认情况下,指标会导出到本地计算机上运行的Atlas 。您可以提供Atlas 服务器的位置:
management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publishmanagement:
  atlas:
    metrics:
      export:
        uri: "https://atlas.example.com:7101/api/v1/publish"7.2.3. 数据狗
management.datadog.metrics.export.api-key=YOUR_KEYmanagement:
  datadog:
    metrics:
      export:
        api-key: "YOUR_KEY"如果您另外提供应用程序密钥(可选),则还将导出仪表描述、类型和基本单位等元数据:
management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEYmanagement:
  datadog:
    metrics:
      export:
        api-key: "YOUR_API_KEY"
        application-key: "YOUR_APPLICATION_KEY"默认情况下,指标会发送到 Datadog US站点( api.datadoghq.com)。如果您的 Datadog 项目托管在其他站点之一,或者您需要通过代理发送指标,请相应配置 URI:
management.datadog.metrics.export.uri=https://api.datadoghq.eumanagement:
  datadog:
    metrics:
      export:
        uri: "https://api.datadoghq.eu"您还可以更改将指标发送到 Datadog 的时间间隔:
management.datadog.metrics.export.step=30smanagement:
  datadog:
    metrics:
      export:
        step: "30s"7.2.4. Dynatrace
Dynatrace 提供了两个指标摄取 API,这两个 API 都是针对Micrometer实现的。您可以在此处找到有关 Micrometer 指标摄取的 Dynatrace 文档。命名空间中的配置属性仅在导出到Timeseries v1 APIv1时适用。命名空间中的配置属性仅在导出到Metrics v2 API时适用。请注意,此集成一次只能导出到API 的或版本,这是首选。如果在命名空间中设置了(v1 所需但 v2 中未使用),则指标将导出到端点。否则,假设。v2v1v2v2device-idv1v1v2
v2 API
您可以通过两种方式使用 v2 API。
自动配置
Dynatrace 自动配置适用于由 OneAgent 或 Dynatrace Operator for Kubernetes 监控的主机。
本地 OneAgent:如果主机上运行 OneAgent,指标会自动导出到本地 OneAgent 采集端点。摄取端点将指标转发到 Dynatrace 后端。
Dynatrace Kubernetes Operator:在安装了 Dynatrace Operator 的 Kubernetes 中运行时,注册表将自动从 Operator 获取端点 URI 和 API 令牌。
这是默认行为,除了依赖于io.micrometer:micrometer-registry-dynatrace.
手动配置
如果没有可用的自动配置,则需要Metrics v2 API的端点和 API 令牌。API令牌必须具有“提取指标”( metrics.ingest) 权限集。我们建议将令牌的范围限制为这一权限。您必须确保端点 URI 包含路径(例如,/api/v2/metrics/ingest):
Metrics API v2 摄取端点的 URL 根据您的部署选项而有所不同:
- 
软件即服务: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest
- 
托管部署: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest
下面的示例使用example环境 ID 配置指标导出:
management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKENmanagement:
  dynatrace:
    metrics:
      export:
        uri: "https://example.live.dynatrace.com/api/v2/metrics/ingest"
        api-token: "YOUR_TOKEN"使用 Dynatrace v2 API 时,可以使用以下可选功能(更多详细信息可以在Dynatrace 文档中找到):
- 
指标键前缀:设置添加到所有导出的指标键之前的前缀。 
- 
使用 Dynatrace 元数据丰富:如果 OneAgent 或 Dynatrace 运算符正在运行,请使用其他元数据(例如,有关主机、进程或 Pod 的元数据)丰富指标。 
- 
默认维度:指定添加到所有导出指标的键值对。如果使用 Micrometer 指定具有相同键的标签,它们将覆盖默认尺寸。 
- 
使用 Dynatrace 摘要工具:在某些情况下,Micrometer Dynatrace 注册表创建的指标被拒绝。在 Micrometer 1.9.x 中,通过引入 Dynatrace 特定的摘要工具解决了这个问题。设置此切换可 false强制 Micrometer 回退到 1.9.x 之前的默认行为。仅当从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题时才应使用它。
可以不指定 URI 和 API 令牌,如以下示例所示。在这种情况下,使用自动配置的端点:
management.dynatrace.metrics.export.v2.metric-key-prefix=your.key.prefix
management.dynatrace.metrics.export.v2.enrich-with-dynatrace-metadata=true
management.dynatrace.metrics.export.v2.default-dimensions.key1=value1
management.dynatrace.metrics.export.v2.default-dimensions.key2=value2
management.dynatrace.metrics.export.v2.use-dynatrace-summary-instruments=truemanagement:
  dynatrace:
    metrics:
      export:
        # Specify uri and api-token here if not using the local OneAgent endpoint.
        v2:
          metric-key-prefix: "your.key.prefix"
          enrich-with-dynatrace-metadata: true
          default-dimensions:
            key1: "value1"
            key2: "value2"
          use-dynatrace-summary-instruments: true # (default: true)v1 API(旧版)
Dynatrace v1 API 指标注册表使用Timeseries v1 API定期将指标推送到配置的 URI 。为了与现有设置向后兼容,当device-id设置 时(v1 需要,但 v2 中不使用),指标将导出到 Timeseries v1 端点。要将指标导出到Dynatrace,必须提供您的 API 令牌、设备 ID 和 URI:
management.dynatrace.metrics.export.uri=https://{your-environment-id}.live.dynatrace.com
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management.dynatrace.metrics.export.v1.device-id=YOUR_DEVICE_IDmanagement:
  dynatrace:
    metrics:
      export:
        uri: "https://{your-environment-id}.live.dynatrace.com"
        api-token: "YOUR_TOKEN"
        v1:
          device-id: "YOUR_DEVICE_ID"对于 v1 API,您必须指定不带路径的基本环境 URI,因为 v1 端点路径是自动添加的。
与版本无关的设置
除了 API 端点和令牌之外,您还可以更改将指标发送到 Dynatrace 的时间间隔。默认导出间隔为60s。以下示例将导出间隔设置为 30 秒:
management.dynatrace.metrics.export.step=30smanagement:
  dynatrace:
    metrics:
      export:
        step: "30s"您可以在Micrometer 文档和Dynatrace 文档中找到有关如何为 Micrometer 设置 Dynatrace 导出器的更多信息。
7.2.5. 松紧带
默认情况下,指标会导出到本地计算机上运行的Elastic 。您可以使用以下属性提供要使用的弹性服务器的位置:
management.elastic.metrics.export.host=https://elastic.example.com:8086management:
  elastic:
    metrics:
      export:
        host: "https://elastic.example.com:8086"7.2.6。神经节
默认情况下,指标会导出到本地计算机上运行的Ganglia 。您可以提供Ganglia 服务器主机和端口,如以下示例所示:
management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649management:
  ganglia:
    metrics:
      export:
        host: "ganglia.example.com"
        port: 96497.2.7. 石墨
默认情况下,指标会导出到本地计算机上运行的Graphite 。您可以提供Graphite 服务器主机和端口,如以下示例所示:
management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004management:
  graphite:
    metrics:
      export:
         host: "graphite.example.com"
         port: 9004Micrometer 提供了一个默认值HierarchicalNameMapper,用于控制如何将维度计量表 ID映射到平面分层名称。
| 要控制此行为,请定义您的 Java Kotlin  | 
7.2.8. 胡米奥
默认情况下,Humio 注册表会定期将指标推送到cloud.humio.com。要将指标导出到 SaaS Humio,您必须提供 API 令牌:
management.humio.metrics.export.api-token=YOUR_TOKENmanagement:
  humio:
    metrics:
      export:
        api-token: "YOUR_TOKEN"您还应该配置一个或多个标签来识别指标推送到的数据源:
management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=bmanagement:
  humio:
    metrics:
      export:
        tags:
          alpha: "a"
          bravo: "b"7.2.9. 涌入
默认情况下,指标将导出到使用默认配置在本地计算机上运行的Influx v1 实例。要将指标导出到 InfluxDB v2,请配置org、bucket和token写入指标的身份验证。您可以通过以下方式提供要使用的Influx 服务器的位置:
management.influx.metrics.export.uri=https://influx.example.com:8086management:
  influx:
    metrics:
      export:
        uri: "https://influx.example.com:8086"7.2.10. 吉米克斯
Micrometer 提供了到JMX 的分层映射,主要作为一种廉价且可移植的本地查看指标的方式。默认情况下,指标导出到metricsJMX 域。您可以使用以下方式提供要使用的域:
management.jmx.metrics.export.domain=com.example.app.metricsmanagement:
  jmx:
    metrics:
      export:
        domain: "com.example.app.metrics"Micrometer 提供了一个默认值HierarchicalNameMapper,用于控制如何将维度计量表 ID映射到平面分层名称。
| 要控制此行为,请定义您的 Java Kotlin  | 
7.2.11. Kairos数据库
默认情况下,指标将导出到本地计算机上运行的KairosDB 。您可以通过以下方式提供要使用的KairosDB 服务器的位置:
management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapointsmanagement:
  kairos:
    metrics:
      export:
        uri: "https://kairosdb.example.com:8080/api/v1/datapoints"7.2.12. 新遗物
management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_IDmanagement:
  newrelic:
    metrics:
      export:
        api-key: "YOUR_KEY"
        account-id: "YOUR_ACCOUNT_ID"您还可以更改将指标发送到 New Relic 的时间间隔:
management.newrelic.metrics.export.step=30smanagement:
  newrelic:
    metrics:
      export:
        step: "30s"默认情况下,指标通过 REST 调用发布,但如果类路径上有 Java Agent API,您也可以使用它:
management.newrelic.metrics.export.client-provider-type=insights-agentmanagement:
  newrelic:
    metrics:
      export:
        client-provider-type: "insights-agent"最后,您可以通过定义自己的 bean 来完全控制NewRelicClientProvider。
7.2.13. 开放式遥测
默认情况下,指标将导出到本地计算机上运行的OpenTelemetry 。您可以通过以下方式提供要使用的OpenTelemetry 指标端点的位置:
management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metricsmanagement:
  otlp:
    metrics:
      export:
        url: "https://otlp.example.com:4318/v1/metrics"7.2.14. 普罗米修斯
Prometheus希望抓取或轮询各个应用程序实例的指标。Spring Boot 提供了一个执行器端点来/actuator/prometheus以适当的格式呈现Prometheus 抓取。
| 默认情况下,端点不可用,必须公开。有关更多详细信息, 请参阅公开端点。 | 
以下示例scrape_config添加到prometheus.yml:
scrape_configs:
  - job_name: "spring"
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: ["HOST:PORT"]还支持Prometheus Exemlars 。要启用此功能,SpanContextSupplier应该存在一个 bean。如果您使用Micrometer Tracing,系统会自动为您配置该功能,但如果您愿意,您可以随时创建自己的配置。请检查Prometheus Docs,因为此功能需要在 Prometheus 端显式启用,并且仅支持使用OpenMetrics格式。
对于可能存在时间不够长而无法被抓取的临时作业或批处理作业,您可以使用Prometheus Pushgateway支持将指标公开给 Prometheus。要启用 Prometheus Pushgateway 支持,请将以下依赖项添加到您的项目中:
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_pushgateway</artifactId>
</dependency>当类路径上存在 Prometheus Pushgateway 依赖项并且该management.prometheus.metrics.export.pushgateway.enabled属性设置为 时true,PrometheusPushGatewayManager会自动配置 bean。它管理将指标推送到 Prometheus Pushgateway。
PrometheusPushGatewayManager您可以使用 下的属性来调整management.prometheus.metrics.export.pushgateway。对于高级配置,您还可以提供自己的PrometheusPushGatewayManagerbean。
7.2.15. 信号FX
management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKENmanagement:
  signalfx:
    metrics:
      export:
        access-token: "YOUR_ACCESS_TOKEN"您还可以更改将指标发送到 SignalFx 的时间间隔:
management.signalfx.metrics.export.step=30smanagement:
  signalfx:
    metrics:
      export:
        step: "30s"7.2.16. 简单的
Micrometer 附带一个简单的内存后端,如果没有配置其他注册表,该后端会自动用作后备。这使您可以查看指标端点中收集了哪些指标。
一旦您使用任何其他可用后端,内存后端就会自行禁用。您还可以显式禁用它:
management.simple.metrics.export.enabled=falsemanagement:
  simple:
    metrics:
      export:
        enabled: false7.2.17. 堆栈驱动程序
Stackdriver 注册表会定期将指标推送到Stackdriver。要将指标导出到 SaaS Stackdriver,您必须提供您的 Google Cloud 项目 ID:
management.stackdriver.metrics.export.project-id=my-projectmanagement:
  stackdriver:
    metrics:
      export:
        project-id: "my-project"您还可以更改指标发送到 Stackdriver 的时间间隔:
management.stackdriver.metrics.export.step=30smanagement:
  stackdriver:
    metrics:
      export:
        step: "30s"7.2.18. 统计D
StatsD 注册表急切地将指标通过 UDP 推送到 StatsD 代理。默认情况下,指标将导出到本地计算机上运行的StatsD代理。您可以通过以下方式提供要使用的 StatsD 代理主机、端口和协议:
management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udpmanagement:
  statsd:
    metrics:
      export:
        host: "statsd.example.com"
        port: 9125
        protocol: "udp"您还可以更改要使用的 StatsD 线路协议(默认为 Datadog):
management.statsd.metrics.export.flavor=etsymanagement:
  statsd:
    metrics:
      export:
        flavor: "etsy"7.2.19. 波前
management.wavefront.api-token=YOUR_API_TOKENmanagement:
  wavefront:
    api-token: "YOUR_API_TOKEN"或者,您可以在环境中使用 Wavefront sidecar 或内部代理将指标数据转发到 Wavefront API 主机:
management.wavefront.uri=proxy://localhost:2878management:
  wavefront:
    uri: "proxy://localhost:2878"| 如果您将指标发布到 Wavefront 代理(如Wavefront 文档中所述),则主机必须采用以下 proxy://HOST:PORT格式。 | 
您还可以更改将指标发送到 Wavefront 的时间间隔:
management.wavefront.metrics.export.step=30smanagement:
  wavefront:
    metrics:
      export:
        step: "30s"7.3. 支持的指标和仪表
Spring Boot 为多种技术提供自动计量注册。在大多数情况下,默认值提供了可以发布到任何支持的监控系统的合理指标。
7.3.1. JVM 指标
自动配置通过使用核心 Micrometer 类来启用 JVM Metrics。JVM 指标以计量名称发布jvm.。
提供了以下 JVM 指标:
- 
各种内存和缓冲池详细信息 
- 
与垃圾收集相关的统计信息 
- 
线程利用率 
- 
加载和卸载的类的数量 
- 
JVM版本信息 
- 
JIT编译时间 
7.3.2. 系统指标
自动配置通过使用核心 Micrometer 类来启用系统指标。system.系统指标以、process.和disk.Meter 名称发布。
提供以下系统指标:
- 
CPU指标 
- 
文件描述符指标 
- 
正常运行时间指标(应用程序运行的时间量和绝对启动时间的固定指标) 
- 
可用磁盘空间 
7.3.3. 应用程序启动指标
自动配置公开应用程序启动时间指标:
- 
application.started.time:启动应用程序所需的时间。
- 
application.ready.time:应用程序准备好服务请求所需的时间。
指标由应用程序类的完全限定名称标记。
7.3.5。任务执行和调度指标
只要底层可用,自动配置就可以检测所有可用的ThreadPoolTaskExecutorBean 。指标由执行器的名称标记,该名称源自 bean 名称。ThreadPoolTaskSchedulerThreadPoolExecutor
7.3.6。Spring MVC 指标
自动配置可以检测 Spring MVC 控制器和功能处理程序处理的所有请求。默认情况下,生成的指标名称为http.server.requests。您可以通过设置属性来自定义名称management.observations.http.server.requests.name。
有关生成的观察结果的更多信息,请参阅Spring 框架参考文档。
要添加到默认标签,请提供从包@Bean扩展的标签。要替换默认标签,请提供实现.DefaultServerRequestObservationConventionorg.springframework.http.server.observation@BeanServerRequestObservationConvention
| 在某些情况下,Web 控制器中处理的异常不会记录为请求指标标签。应用程序可以通过将已处理的异常设置为请求属性来选择加入并记录异常。 | 
默认情况下,所有请求都会被处理。要自定义过滤器,请提供@Bean实现FilterRegistrationBean<WebMvcMetricsFilter>.
7.3.7. Spring WebFlux 指标
自动配置可以检测由 Spring WebFlux 控制器和功能处理程序处理的所有请求。默认情况下,生成的指标名称为http.server.requests。您可以通过设置属性来自定义名称management.observations.http.server.requests.name。
有关生成的观察结果的更多信息,请参阅Spring 框架参考文档。
要添加到默认标签,请提供从包@Bean扩展的标签。要替换默认标签,请提供实现.DefaultServerRequestObservationConventionorg.springframework.http.server.reactive.observation@BeanServerRequestObservationConvention
| 在某些情况下,控制器和处理程序函数中处理的异常不会记录为请求指标标记。应用程序可以通过将已处理的异常设置为请求属性来选择加入并记录异常。 | 
7.3.8. 泽西岛服务器指标
自动配置支持对 Jersey JAX-RS 实现处理的所有请求进行检测。默认情况下,生成的指标名称为http.server.requests。您可以通过设置属性来自定义名称management.observations.http.server.requests.name。
默认情况下,Jersey 服务器指标标记有以下信息:
| 标签 | 描述 | 
|---|---|
| 
 | 处理请求时引发的任何异常的简单类名称。 | 
| 
 | 请求的方法(例如, | 
| 
 | 请求的结果基于响应的状态代码。1xx 是 | 
| 
 | 响应的 HTTP 状态代码(例如, | 
| 
 | 如果可能的话,在变量替换之前请求的 URI 模板(例如, | 
要自定义标签,请提供@Bean实现JerseyTagsProvider.
7.3.9. HTTP 客户端指标
RestTemplateSpring Boot Actuator 管理和的检测WebClient。为此,您必须注入自动配置的构建器并使用它来创建实例:
- 
RestTemplateBuilder为了RestTemplate
- 
WebClient.Builder为了WebClient
您还可以手动应用负责此检测的定制器,即ObservationRestTemplateCustomizer和ObservationWebClientCustomizer。
默认情况下,生成的指标名称为http.client.requests。您可以通过设置属性来自定义名称management.observations.http.client.requests.name。
有关生成的观察结果的更多信息,请参阅Spring 框架参考文档。
要在使用时自定义标签RestTemplate,请提供从包中@Bean实现的。要在使用时自定义标签,请提供从包中实现的。ClientRequestObservationConventionorg.springframework.http.client.observationWebClient@BeanClientRequestObservationConventionorg.springframework.web.reactive.function.client
7.3.10. 雄猫指标
MBeanRegistry仅当启用时,自动配置才会启用 Tomcat 的检测。默认情况下,该功能MBeanRegistry处于禁用状态,但您可以通过设置server.tomcat.mbeanregistry.enabled为 来启用它true。
Tomcat 指标以计量名称发布tomcat.。
7.3.11. 缓存指标
自动配置可以Cache在启动时对所有可用实例进行检测,指标前缀为cache. 缓存检测针对一组基本指标进行了标准化。另外,还提供特定于缓存的指标。
支持以下缓存库:
- 
缓存2k 
- 
咖啡因 
- 
榛卡斯特 
- 
任何兼容的 JCache (JSR-107) 实现 
- 
雷迪斯 
指标通过缓存的名称和CacheManager源自 bean 名称的 名称进行标记。
| 只有在启动时配置的缓存才会绑定到注册表。对于缓存配置中未定义的缓存,例如在启动阶段后动态创建或以编程方式创建的缓存,需要显式注册。提供了Bean CacheMetricsRegistrar来简化该过程。 | 
7.3.14. 数据源指标
自动配置可以使用DataSource前缀为 的指标来检测所有可用对象jdbc.connections。数据源检测结果会产生表示池中当前活动、空闲、允许的最大连接数和允许的最小连接数的仪表。
DataSource指标还通过基于 bean 名称的计算名称进行标记。
| 默认情况下,Spring Boot 为所有支持的数据源提供元数据。 DataSourcePoolMetadataProvider如果您喜欢的数据源不受支持,您可以添加其他bean。请参阅DataSourcePoolMetadataProvidersConfiguration示例。 | 
此外,Hikari 特定的指标也通过hikaricp前缀公开。每个指标都由池的名称标记(您可以使用 控制它spring.datasource.name)。
7.3.15. 休眠指标
如果org.hibernate.orm:hibernate-micrometer位于类路径上,则所有启用了EntityManagerFactory统计信息的可用 Hibernate 实例都会使用名为 的指标进行检测hibernate。
指标还通过 的名称进行标记EntityManagerFactory,该名称源自 bean 名称。
要启用统计信息,标准 JPA 属性hibernate.generate_statistics必须设置为true。您可以在自动配置上启用它EntityManagerFactory:
spring.jpa.properties[hibernate.generate_statistics]=truespring:
  jpa:
    properties:
      "[hibernate.generate_statistics]": true7.3.16. Spring数据存储库指标
自动配置可以检测所有 Spring DataRepository方法调用。默认情况下,生成的指标名称为spring.data.repository.invocations。您可以通过设置属性来自定义名称management.metrics.data.repository.metric-name。
接口和方法支持包@Timed中的注释。如果您不想记录所有调用的指标,则可以设置为并专门使用注释。io.micrometer.core.annotationRepositoryRepositorymanagement.metrics.data.repository.autotime.enabledfalse@Timed
| 注释 @Timed为该longTask = true方法启用了长任务计时器。长任务计时器需要单独的指标名称,并且可以与短任务计时器堆叠。 | 
默认情况下,与存储库调用相关的指标带有以下信息标记:
| 标签 | 描述 | 
|---|---|
| 
 | 源的简单类名 | 
| 
 | 
 | 
| 
 | 结果状态 (  | 
| 
 | 调用引发的任何异常的简单类名称。 | 
要替换默认标签,请提供@Bean实现RepositoryTagsProvider.
7.3.18. Spring 集成指标
只要bean 可用, Spring Integration 就会自动提供Micrometer 支持。MeterRegistry指标以计量名称发布spring.integration.。
7.3.19. 卡夫卡指标
自动配置分别为自动配置的消费者工厂和生产者工厂注册了MicrometerConsumerListener和MicrometerProducerListener。它还注册了一个KafkaStreamsMicrometerListenerfor StreamsBuilderFactoryBean。有关更多详细信息,请参阅Spring Kafka 文档的Micrometer Native Metrics部分。
7.3.20. MongoDB 指标
本节简要介绍 MongoDB 的可用指标。
MongoDB 命令指标
自动配置将 a 注册MongoMetricsCommandListener到自动配置的MongoClient.
mongodb.driver.commands为向底层 MongoDB 驱动程序发出的每个命令创建一个名为 的计时器指标。默认情况下,每个指标都标记有以下信息:
| 标签 | 描述 | 
|---|---|
| 
 | 发出的命令的名称。 | 
| 
 | 命令发送到的集群的标识符。 | 
| 
 | 命令发送到的服务器的地址。 | 
| 
 | 命令的结果 ( | 
要替换默认的指标标签,请定义一个MongoCommandTagsProviderbean,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class MyCommandTagsProviderConfiguration {
    @Bean
    public MongoCommandTagsProvider customCommandTagsProvider() {
        return new CustomCommandTagsProvider();
    }
}
@Configuration(proxyBeanMethods = false)
class MyCommandTagsProviderConfiguration {
    @Bean
    fun customCommandTagsProvider(): MongoCommandTagsProvider? {
        return CustomCommandTagsProvider()
    }
}
要禁用自动配置的命令指标,请设置以下属性:
management.metrics.mongo.command.enabled=falsemanagement:
  metrics:
    mongo:
      command:
        enabled: falseMongoDB 连接池指标
自动配置将 a 注册MongoMetricsConnectionPoolListener到自动配置的MongoClient.
为连接池创建以下计量指标:
- 
mongodb.driver.pool.size报告连接池的当前大小,包括空闲和正在使用的成员。
- 
mongodb.driver.pool.checkedout报告当前正在使用的连接数。
- 
mongodb.driver.pool.waitqueuesize报告池中连接的等待队列的当前大小。
默认情况下,每个指标都标记有以下信息:
| 标签 | 描述 | 
|---|---|
| 
 | 连接池对应的集群的标识。 | 
| 
 | 连接池对应的服务器地址。 | 
要替换默认的指标标签,请定义一个MongoConnectionPoolTagsProviderbean:
@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {
    @Bean
    public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
        return new CustomConnectionPoolTagsProvider();
    }
}
@Configuration(proxyBeanMethods = false)
class MyConnectionPoolTagsProviderConfiguration {
    @Bean
    fun customConnectionPoolTagsProvider(): MongoConnectionPoolTagsProvider {
        return CustomConnectionPoolTagsProvider()
    }
}
要禁用自动配置的连接池指标,请设置以下属性:
management.metrics.mongo.connectionpool.enabled=falsemanagement:
  metrics:
    mongo:
      connectionpool:
        enabled: false7.3.21. 码头指标
自动配置ThreadPool通过使用 Micrometer 的来绑定 Jetty 的指标JettyServerThreadPoolMetrics。JettyConnector实例的指标通过使用 Micrometer 进行绑定JettyConnectionMetrics,并且当server.ssl.enabled设置为时true,使用 Micrometer 进行绑定JettySslHandshakeMetrics。
7.3.22. @定时注释支持
@Timed要在 Spring Boot 不直接支持的地方使用它,请参阅Micrometer 文档。
7.3.23. Redis 指标
自动配置MicrometerCommandLatencyRecorder为自动配置的LettuceConnectionFactory. 有关更多详细信息,请参阅Lettuce 文档的微米度量部分。
7.4. 注册自定义指标
要注册自定义指标,请注入MeterRegistry您的组件:
@Component
public class MyBean {
    private final Dictionary dictionary;
    public MyBean(MeterRegistry registry) {
        this.dictionary = Dictionary.load();
        registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size());
    }
}
@Component
class MyBean(registry: MeterRegistry) {
    private val dictionary: Dictionary
    init {
        dictionary = Dictionary.load()
        registry.gauge("dictionary.size", Tags.empty(), dictionary.words.size)
    }
}
如果您的指标依赖于其他 bean,我们建议您使用 aMeterBinder来注册它们:
public class MyMeterBinderConfiguration {
    @Bean
    public MeterBinder queueSize(Queue queue) {
        return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
    }
}
class MyMeterBinderConfiguration {
    @Bean
    fun queueSize(queue: Queue): MeterBinder {
        return MeterBinder { registry ->
            Gauge.builder("queueSize", queue::size).register(registry)
        }
    }
}
使用 aMeterBinder可确保设置正确的依赖关系,并且在检索度量值时该 Bean 可用。MeterBinder如果您发现跨组件或应用程序重复检测一组指标,那么实施也可能很有用。
| 默认情况下,所有 MeterBinderbean 的指标都会自动绑定到 Spring 管理的MeterRegistry. | 
7.5。自定义单独的指标
如果您需要将自定义应用到特定Meter实例,可以使用该io.micrometer.core.instrument.config.MeterFilter界面。
例如,如果要将所有以 开头的仪表 ID 的mytag.region标签重命名为,您可以执行以下操作:mytag.areacom.example
@Configuration(proxyBeanMethods = false)
public class MyMetricsFilterConfiguration {
    @Bean
    public MeterFilter renameRegionTagMeterFilter() {
        return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
    }
}
@Configuration(proxyBeanMethods = false)
class MyMetricsFilterConfiguration {
    @Bean
    fun renameRegionTagMeterFilter(): MeterFilter {
        return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area")
    }
}
| 默认情况下,所有 MeterFilterbean 都会自动绑定到 Spring 管理的MeterRegistry. 确保使用 Spring 管理的MeterRegistry方法而不是Metrics. 它们使用非 Spring 管理的全局注册表。 | 
7.5.1. 常用标签
通用标签一般用于对运行环境进行维度钻取,如主机、实例、区域、堆栈等。Commons 标签应用于所有仪表并且可以进行配置,如以下示例所示:
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prodmanagement:
  metrics:
    tags:
      region: "us-east-1"
      stack: "prod"前面的示例分别向所有值为和 的仪表添加region和标签。stackus-east-1prod
| 如果您使用 Graphite,常用标签的顺序很重要。由于使用这种方法无法保证公共标签的顺序,因此建议 Graphite 用户定义自定义标签 MeterFilter。 | 
7.5.2. 每米属性
除了MeterFilterBean 之外,您还可以使用属性在每米的基础上应用一组有限的自定义。使用 Spring Boot 将每米的自定义应用于PropertiesMeterFilter以给定名称开头的任何米 ID。以下示例过滤掉 ID 以 开头的所有仪表example.remote。
management.metrics.enable.example.remote=falsemanagement:
  metrics:
    enable:
      example:
        remote: false以下属性允许按米进行定制:
| 财产 | 描述 | 
|---|---|
| 
 | 是否接受具有特定ID的电表。不被接受的仪表将从 中过滤掉 | 
| 
 | 是否发布适合计算可聚合(跨维度)百分位近似值的直方图。 | 
| 
 | 通过限制预期值的范围来发布更少的直方图桶。 | 
| 
 | 发布在您的应用程序中计算的百分位数值 | 
| 
 | 通过将最近的样本累积在环形缓冲区中,为最近的样本赋予更大的权重,这些缓冲区在可配置的到期后轮换,并具有可配置的缓冲区长度。 | 
| 
 | 发布累积直方图,其中包含由您的服务级别目标定义的存储桶。 | 
percentiles-histogram有关、percentiles和背后概念的更多详细信息slo,请参阅千分尺文档的“直方图和百分位数”部分。
7.6。指标端点
Spring Boot 提供了一个metrics端点,您可以通过诊断方式使用该端点来检查应用程序收集的指标。默认情况下,端点不可用,必须公开。有关更多详细信息,请参阅公开端点。
导航至/actuator/metrics显示可用仪表名称的列表。您可以通过提供特定仪表的名称作为选择器来深入查看有关特定仪表的信息 - 例如,/actuator/metrics/jvm.memory.max。
| 您在此处使用的名称应与代码中使用的名称相匹配,而不是针对其所发送到的监控系统进行命名约定标准化后的名称。换句话说,如果由于其蛇形命名约定 | 
tag=KEY:VALUE您还可以在 URL 末尾添加任意数量的查询参数,以按维度深入了解仪表 — 例如, /actuator/metrics/jvm.memory.max?tag=area:nonheap.
| 报告的测量结果是与仪表名称和已应用的任何标签匹配的所有仪表的统计数据的总和。在前面的示例中,返回的 | 
8. 追踪
Spring Boot Actuator 为Micrometer Tracing提供依赖管理和自动配置,Micrometer Tracing 是流行跟踪器库的外观。
| 要了解有关微米追踪功能的更多信息,请参阅其参考文档。 | 
8.2. 入门
我们需要一个可用于开始跟踪的示例应用程序。就我们的目的而言,简单的“Hello World!” “ getting-started.html ”部分中介绍的 Web 应用程序就足够了。我们将使用 OpenTelemetry 跟踪器和 Zipkin 作为跟踪后端。
回顾一下,我们的主要应用程序代码如下所示:
@RestController
@SpringBootApplication
public class MyApplication {
    private static final Log logger = LogFactory.getLog(MyApplication.class);
    @RequestMapping("/")
    String home() {
        logger.info("home() has been called");
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
| 该方法中添加了一条记录器语句 home(),这在后面会很重要。 | 
现在我们必须添加以下依赖项:
- 
org.springframework.boot:spring-boot-starter-actuator
- 
io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。
- 
io.opentelemetry:opentelemetry-exporter-zipkin-向 Zipkin报告痕迹。
添加以下应用程序属性:
management.tracing.sampling.probability=1.0management:
  tracing:
    sampling:
      probability: 1.0默认情况下,Spring Boot 仅对 10% 的请求进行采样,以防止跟踪后端不堪重负。此属性将其切换为 100%,以便每个请求都发送到跟踪后端。
为了收集和可视化跟踪,我们需要一个正在运行的跟踪后端。我们在这里使用 Zipkin 作为跟踪后端。Zipkin 快速入门指南提供了如何在本地启动 Zipkin 的说明。
Zipkin 运行后,您可以启动您的应用程序。
如果您打开 Web 浏览器localhost:8080,您应该看到以下输出:
Hello World!
在幕后,为 HTTP 请求创建了一个观察,该观察又桥接到 OpenTelemetry,后者向 Zipkin 报告新的跟踪。
现在打开 Zipkin UI,localhost:9411然后按“运行查询”按钮列出所有收集的跟踪。您应该看到一条痕迹。按“显示”按钮查看该跟踪的详细信息。
| logging.pattern.level您可以通过将属性
设置为在日志中包含当前跟踪和跨度 ID%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}] | 
8.3. 传播痕迹
要通过网络自动传播跟踪,请使用自动配置RestTemplateBuilder或WebClient.Builder构建客户端。
| 如果您在不使用自动配置的构建器的情况下创建 WebClient或RestTemplate,则自动跟踪传播将不起作用! | 
8.4. 追踪器实现
由于 Micrometer Tracer 支持多种跟踪器实现,因此 Spring Boot 可能存在多种依赖项组合。
所有跟踪器实现都需要org.springframework.boot:spring-boot-starter-actuator依赖项。
8.4.1. 使用 Zipkin 进行 OpenTelemetry
使用 OpenTelemetry 进行跟踪并向 Zipkin 报告需要以下依赖项:
- 
io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。
- 
io.opentelemetry:opentelemetry-exporter-zipkin- 向 Zipkin 报告痕迹。
使用management.zipkin.tracing.*配置属性来配置向 Zipkin 的报告。
8.4.2. 使用波前的 OpenTelemetry
使用 OpenTelemetry 进行跟踪并向 Wavefront 报告需要以下依赖项:
- 
io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。
- 
io.micrometer:micrometer-tracing-reporter-wavefront- 向 Wavefront 报告痕迹。
使用management.wavefront.*配置属性配置向 Wavefront 的报告。
8.4.3. 使用 OTLP 的 OpenTelemetry
使用 OpenTelemetry 进行跟踪并使用 OTLP 进行报告需要以下依赖项:
- 
io.micrometer:micrometer-tracing-bridge-otel- 将 Micrometer Observation API 桥接到 OpenTelemetry。
- 
io.opentelemetry:opentelemetry-exporter-otlp- 向可接受 OTLP 的收集器报告跟踪。
使用management.otlp.tracing.*配置属性来配置使用 OTLP 的报告。
8.4.4. OpenZipkin 勇敢与 Zipkin
使用 OpenZipkin Brave 进行跟踪并向 Zipkin 报告需要以下依赖项:
- 
io.micrometer:micrometer-tracing-bridge-brave- 将千分尺观察 API 桥接至 Brave。
- 
io.zipkin.reporter2:zipkin-reporter-brave- 向 Zipkin 报告痕迹。
| 如果您的项目不使用 Spring MVC 或 Spring WebFlux, io.zipkin.reporter2:zipkin-sender-urlconnection则也需要依赖项。 | 
使用management.zipkin.tracing.*配置属性来配置向 Zipkin 的报告。
8.6。创建自定义跨度
您可以通过开始观察来创建自己的跨度。为此,请注入ObservationRegistry您的组件:
@Component
class CustomObservation {
    private final ObservationRegistry observationRegistry;
    CustomObservation(ObservationRegistry observationRegistry) {
        this.observationRegistry = observationRegistry;
    }
    void someOperation() {
        Observation observation = Observation.createNotStarted("some-operation", this.observationRegistry);
        observation.lowCardinalityKeyValue("some-tag", "some-value");
        observation.observe(() -> {
            // Business logic ...
        });
    }
}
这将创建一个名为“some-operation”的观察,其标签为“some-tag=some-value”。
| 如果您想创建跨度而不创建指标,则需要使用Micrometer 的
较低级别 TracerAPI 。 | 
8.7. 行李
您可以使用TracerAPI 创建行李:
@Component
class CreatingBaggage {
    private final Tracer tracer;
    CreatingBaggage(Tracer tracer) {
        this.tracer = tracer;
    }
    void doSomething() {
        try (BaggageInScope scope = this.tracer.createBaggageInScope("baggage1", "value1")) {
            // Business logic
        }
    }
}
此示例创建名为baggage1value 的行李value1。如果您使用 W3C 传播,则行李会自动通过网络传播。如果您使用 B3 传播,行李不会自动传播。要通过网络手动传播行李,请使用management.tracing.baggage.remote-fields配置属性(这也适用于 W3C)。对于上面的示例,将此属性设置为会baggage1生成 HTTP header baggage1: value1。
如果要将行李传播到 MDC,请使用management.tracing.baggage.correlation.fields配置属性。对于上面的示例,设置此属性将baggage1生成名为 的 MDC 条目baggage1。
9. 审计
一旦 Spring Security 发挥作用,Spring Boot Actuator 就有一个灵活的审计框架来发布事件(默认情况下,“身份验证成功”、“失败”和“访问被拒绝”异常)。此功能对于报告和实施基于身份验证失败的锁定策略非常有用。
AuditEventRepository您可以通过在应用程序配置中提供 bean 类型来启用审核。为了方便起见,Spring Boot 提供了InMemoryAuditEventRepository.
InMemoryAuditEventRepository功能有限,我们建议仅将其用于开发环境。对于生产环境,请考虑创建您自己的替代AuditEventRepository实现。
10. 记录 HTTP 交换
HttpExchangeRepository您可以通过在应用程序配置中提供 bean 类型来启用 HTTP 交换的记录。为了方便起见,Spring Boot 提供了InMemoryHttpExchangeRepository,默认情况下,它存储最后 100 个请求-响应交换。
InMemoryHttpExchangeRepository与跟踪解决方案相比,它是有限的,我们建议仅将其用于开发环境。对于生产环境,我们建议使用生产就绪的跟踪或可观察性解决方案,例如 Zipkin 或 OpenTelemetry。或者,您可以创建自己的HttpExchangeRepository.
您可以使用httpexchanges端点来获取有关存储在HttpExchangeRepository.
11. 过程监控
在该spring-boot模块中,您可以找到两个类来创建通常对进程监控有用的文件:
- 
ApplicationPidFileWriter创建一个包含应用程序 PID 的文件(默认情况下,位于应用程序目录中,文件名为application.pid)。
- 
WebServerPortFileWriter创建一个或多个文件,其中包含正在运行的 Web 服务器的端口(默认情况下,位于应用程序目录中,文件名为application.port)。
默认情况下,这些编写器未激活,但您可以启用它们:
12.Cloud Foundry 支持
Spring Boot 的执行器模块包括额外的支持,当您部署到兼容的 Cloud Foundry 实例时会激活这些支持。该/cloudfoundryapplication路径为所有 bean 提供了替代的安全路由@Endpoint。
扩展支持允许使用 Spring Boot 执行器信息来增强 Cloud Foundry 管理 UI(例如可用于查看已部署应用程序的 Web 应用程序)。例如,应用程序状态页面可以包括完整的运行状况信息,而不是典型的“正在运行”或“已停止”状态。
| /cloudfoundryapplication普通用户无法直接访问
该路径。要使用端点,您必须在请求中传递有效的 UAA 令牌。 | 
12.1。禁用扩展 Cloud Foundry 执行器支持
如果您想完全禁用/cloudfoundryapplication端点,可以将以下设置添加到您的application.properties文件中:
management.cloudfoundry.enabled=falsemanagement:
  cloudfoundry:
    enabled: false12.2. Cloud Foundry 自签名证书
默认情况下,端点的安全验证/cloudfoundryapplication会对各种 Cloud Foundry 服务进行 SSL 调用。如果您的 Cloud Foundry UAA 或 Cloud Controller 服务使用自签名证书,您需要设置以下属性:
management.cloudfoundry.skip-ssl-validation=truemanagement:
  cloudfoundry:
    skip-ssl-validation: true12.3。自定义上下文路径
如果服务器的上下文路径已配置为 以外的任何内容/,则 Cloud Foundry 端点在应用程序的根目录下不可用。例如,如果server.servlet.context-path=/app,则 Cloud Foundry 端点在 处可用/app/cloudfoundryapplication/*。
如果您希望 Cloud Foundry 端点始终在 处可用/cloudfoundryapplication/*,无论服务器的上下文路径如何,您都需要在应用程序中显式配置它。配置有所不同,具体取决于所使用的 Web 服务器。对于Tomcat,可以添加以下配置:
@Configuration(proxyBeanMethods = false)
public class MyCloudFoundryConfiguration {
    @Bean
    public TomcatServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
                super.prepareContext(host, initializers);
                StandardContext child = new StandardContext();
                child.addLifecycleListener(new Tomcat.FixContextListener());
                child.setPath("/cloudfoundryapplication");
                ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
                child.addServletContainerInitializer(initializer, Collections.emptySet());
                child.setCrossContext(true);
                host.addChild(child);
            }
        };
    }
    private ServletContainerInitializer getServletContextInitializer(String contextPath) {
        return (classes, context) -> {
            Servlet servlet = new GenericServlet() {
                @Override
                public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                    ServletContext context = req.getServletContext().getContext(contextPath);
                    context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
                }
            };
            context.addServlet("cloudfoundry", servlet).addMapping("/*");
        };
    }
}
@Configuration(proxyBeanMethods = false)
class MyCloudFoundryConfiguration {
    @Bean
    fun servletWebServerFactory(): TomcatServletWebServerFactory {
        return object : TomcatServletWebServerFactory() {
            override fun prepareContext(host: Host, initializers: Array<ServletContextInitializer>) {
                super.prepareContext(host, initializers)
                val child = StandardContext()
                child.addLifecycleListener(FixContextListener())
                child.path = "/cloudfoundryapplication"
                val initializer = getServletContextInitializer(contextPath)
                child.addServletContainerInitializer(initializer, emptySet())
                child.crossContext = true
                host.addChild(child)
            }
        }
    }
    private fun getServletContextInitializer(contextPath: String): ServletContainerInitializer {
        return ServletContainerInitializer { classes: Set<Class<*>?>?, context: ServletContext ->
            val servlet: Servlet = object : GenericServlet() {
                @Throws(ServletException::class, IOException::class)
                override fun service(req: ServletRequest, res: ServletResponse) {
                    val servletContext = req.servletContext.getContext(contextPath)
                    servletContext.getRequestDispatcher("/cloudfoundryapplication").forward(req, res)
                }
            }
            context.addServlet("cloudfoundry", servlet).addMapping("/*")
        }
    }
}
13. 接下来读什么
您可能想阅读有关图形工具的信息,例如Graphite。
否则,您可以继续阅读“部署选项”或跳到有关 Spring Boot构建工具插件的一些深入信息。