《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 监控指标 Metrics 阅读笔记
一 参考资料
二 笔记总结
15.3 监控指标 Metrics
除了监控端点,Spring Boot Actuator 提供的另一项核心生产级特性是监控指标 (Metrics)。监控指标通常用于监控应用和服务器的某些具体指标值。
15.3.1 内置指标
Spring Boot Actuator 给我们提供了非常多的监控端点,此外我们还可以通过访问 metrics 端点获得当前的监控指标 (Metrics),比如此时我们访问 /actuator/metrics 端点,就可以得到非常多的监控指标名称。
要想使用这些监控指标,我们可以直接复制其中某个指标的名称,并追加在 /actuator/metrics 请求后面,例如要获取当前 CPU 的内核数量,可以访问 /actuator/metrics/system.cpu.count,发送请求后可以得到 JSON 数据,这里面有指标的描述、指标的单位、当前指标的参数值等。
15.3.2 自定义指标
除了使用 Spring Boot Actuator 提供的内置指标,在实际的项目开发中我们可能还需要自己来扩展一些监控指标,用于了解应用的运行情况和状态,此时就需要自定义监控指标。从 Spring Boot 2.x 开始 Spring Boot Actuator 选择使用 Micrometer 完成监控指标信息的收集( Micrometer 由 Pivotal 公司开发),我们可以选择的一个监控指标扩展方式是利用 Micrometer 提供的一个名为 MeterRegistry 的 API。下面通过一个简单的示例进行演示。
假设有一个业务接口,我们需要监控的是这个接口的调用次数,那么编码的方式就是利用 MeterRegistry 的计数功能来逐次累加。
除了频数监控外,MeterRegistry 还支持聚合统计、耗时监控等。关于更多使用方式,读者可以参照 Spring Boot 的官方文档,结合 Micrometer的使用文档来测试,此处不再赘述。
@AutowiredprivateMeterRegistrymeterRegistry;privateCountercounter;@PostConstructpublicvoidinit(){counter=meterRegistry.counter("product_controller_counter","method","selectProduct");}counter.increment();15.3.3 基于场景的指标
当 Spring Boot 整合官方提供的启动场景后,大多数场景中会一同引入相应场景的监控指标,比如引入 WebMvc 的场景启动器后,Spring Boot Actuator 提供的监控指标信息中会多出一组以 tomcat 开头的嵌入式 Tomcat 指标,以及一些其他与 WebMvc 相关的场景指标,本节会针对几种常用的场景进行简单介绍。
- WebMvc
WebMvc 中包含的场景指标大体分为两个部分:嵌入式 Web 的指标;HTTP 服务端与客户端的指标。嵌入式 Tomcat 的性能指标主要是会话信息,我们可以得到 Tomcat 内部会话的数量、最大值等;而 HTTP 服务端与客户端的指标中我们可以得知当前应用的接口被请求的次数、总耗时、最大耗时等,对应指标的名称是 http.server.requests。如果访问 /actuator/ metrics/http.server.requests 请求,则会收到一组响应数据。
WebMvc 模块中的客户端主要指 RestTemplate,Spring Boot Actuator 也可以对 RestTemplate 进行监控,只需要使用 RestTemplateBuilder 构造 RestTemplate 并将其注册到 IOC 容器(注意直接通过 new 操作得来的 RestTemplate 不会被 Spring Boot Actuator 监控收集信息)。比如我们编写一个配置类注册 RestTemplate 到 IOC 容器,并使用 RestTemplate 请求百度的首页。
随后重启应用,多次访问 /test 请求后再访问 /actuator/metrics,即可在监控指标中发现一个名为 http.client.requests 的指标,这就是 HTTP 客户端的监控指标。对比 http.client.requests 和 http.server.requests 返回的内容,可以发现两者记录的内容中有部分是重叠的,这部分本来就是HTTP 请求中必然可以收集到的指标。
packagecom.yangjunbo.monitoring.config;importorg.springframework.boot.web.client.RestTemplateBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;importjava.time.Duration;/** * ClassName: RestTemplateConfig * Package: com.yangjunbo.monitoring.config * Description: RestTemplate 配置类,使用 RestTemplateBuilder 构造并注册到 IOC 容器 * * @Author 杨钧博 * @Create 2026/8/3 10:00 * @Version 1.0 */@ConfigurationpublicclassRestTemplateConfig{/** * 通过 RestTemplateBuilder 构造 RestTemplate 并注册到 IOC 容器 * Spring Boot 会自动注入 RestTemplateBuilder 实例 */@BeanpublicRestTemplaterestTemplate(RestTemplateBuilderbuilder){returnbuilder// 设置连接超时时间.connectTimeout(Duration.ofSeconds(5))// 设置读取超时时间.readTimeout(Duration.ofSeconds(10)).build();}}@AutowiredprivateRestTemplaterestTemplate;@GetMapping("/test")publicvoidtest(){restTemplate.getForObject("https://www.baidu.com",String.class);}- JDBC
当整合 JDBC 场景后,我们最关心的指标是 DataSource 的状态和指标,比如数据源中的连接池大小、当前活跃的线程、最大线程数量等。当引入 spring-boot-starter-jdbc 场景启动器并配置数据源的信息后,再次访问 /actuator/metrics,即可看到返回的监控指标中多出一组 hikaricp 开头和一组 jdbc 开头的指标,这些就是 JDBC 场景下我们可以获取的监控指标信息。 - Redis
与整合 JDBC 场景类似,当整合 Spring Data Redis 场景后,默认 Spring Boot 选择使用 Lettuce 作为 Redis 的连接工具,所以 Actuator 的监控指标中会多出一组 lettuce 开头的指标,通过它们可以得知 Lettuce 的相关监控信息。