《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 监控指标 Metrics 阅读笔记

《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的使用文档来测试,此处不再赘述。

java 复制代码
    @Autowired
    private MeterRegistry meterRegistry;

    private Counter counter;

    @PostConstruct
    public void init(){
        counter = meterRegistry.counter("product_controller_counter", "method", "selectProduct");
    }
java 复制代码
counter.increment();

15.3.3 基于场景的指标

当 Spring Boot 整合官方提供的启动场景后,大多数场景中会一同引入相应场景的监控指标,比如引入 WebMvc 的场景启动器后,Spring Boot Actuator 提供的监控指标信息中会多出一组以 tomcat 开头的嵌入式 Tomcat 指标,以及一些其他与 WebMvc 相关的场景指标,本节会针对几种常用的场景进行简单介绍。

  1. 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 请求中必然可以收集到的指标。



java 复制代码
package com.yangjunbo.monitoring.config;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import java.time.Duration;

/**
 * ClassName: RestTemplateConfig
 * Package: com.yangjunbo.monitoring.config
 * Description: RestTemplate 配置类,使用 RestTemplateBuilder 构造并注册到 IOC 容器
 *
 * @Author 杨钧博
 * @Create 2026/8/3 10:00
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

    /**
     * 通过 RestTemplateBuilder 构造 RestTemplate 并注册到 IOC 容器
     * Spring Boot 会自动注入 RestTemplateBuilder 实例
     */
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder
                // 设置连接超时时间
                .connectTimeout(Duration.ofSeconds(5))
                // 设置读取超时时间
                .readTimeout(Duration.ofSeconds(10))
                .build();
    }
}
java 复制代码
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/test")
    public void test(){
        restTemplate.getForObject("https://www.baidu.com",String.class);
    }
  1. JDBC
    当整合 JDBC 场景后,我们最关心的指标是 DataSource 的状态和指标,比如数据源中的连接池大小、当前活跃的线程、最大线程数量等。当引入 spring-boot-starter-jdbc 场景启动器并配置数据源的信息后,再次访问 /actuator/metrics,即可看到返回的监控指标中多出一组 hikaricp 开头和一组 jdbc 开头的指标,这些就是 JDBC 场景下我们可以获取的监控指标信息。

  2. Redis
    与整合 JDBC 场景类似,当整合 Spring Data Redis 场景后,默认 Spring Boot 选择使用 Lettuce 作为 Redis 的连接工具,所以 Actuator 的监控指标中会多出一组 lettuce 开头的指标,通过它们可以得知 Lettuce 的相关监控信息。
相关推荐
leikooo9 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz10 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
by2099910 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
沙漠之主10 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐11 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合11 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI11 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记11 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI12 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰13 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++