Micrometer
Micrometer
Micrometer 是一款面向 JVM 指标采集框架,可以把应用里的各种运行数据统一采集出来,再输出到不同的监控系统里
作用
- 解耦业务与监控后端:业务代码只依赖 Micrometer 标准 API,更换监控系统无需修改业务埋点代码。
- 标准化指标类型:定义了 Counter、Timer、Gauge 等通用指标类型,覆盖绝大多数应用监控场景,统一了指标语义和采集方式。
- 生态深度集成:与 Spring Boot Actuator 无缝整合,同时支持 Spring Cloud、Dubbo、Redis 等主流框架的自动埋点。
概念
Micrometer、Prometheus和Grafana关系:
- Micrometer:采集指标,提供统一的埋点 API
- Prometheus:按照配置的间隔(通常 15s)主动抓取(Scrape)各个应用暴露的指标端点,将数据按时间序列持久化存储
- Grafana:可视化仪表盘平台,将数据渲染成折线图、柱状图、热力图、数字仪表盘等丰富的可视化组件
指标注册中心 MeterRegistry:MeterRegistry 是 Micrometer 的核心接口,负责创建、缓存和管理所有 Meter(指标),每一种监控后端都有对应的 Registry 实现
Spring Boot会自动根据依赖注入对应类型的 MeterRegistry Bean,业务代码直接注入即可使用。
度量指标 Meter
指标类型 特性 典型适用场景 Counter 单调递增,只能加不能减 请求次数、错误次数、订单创建数、异常计数 Timer 同时统计事件次数 + 总耗时,内置百分位计算 接口响应耗时、方法执行时长、SQL 执行时间 Gauge 瞬时值,可增可减,反映当前状态 队列积压长度、线程池活跃线程数、在线用户数、内存占用 DistributionSummary 统计数值分布,支持百分位 响应体大小、订单金额、文件上传大小 LongTaskTimer 统计正在执行中的长任务耗时 批量任务执行时长、大文件处理进度
使用实例
下面的是使用Windows平台及Docker Desktop
引入依赖
1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 把micrometer指标转换为prometheus能识别的文本格式 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>开启指标暴露
application.yml:1
2
3
4
5management:
endpoints:
web:
exposure:
include: health,info,prometheus访问
http://localhost:8080/actuator/prometheus查看默认指标自定义业务指标(两种方式)
代码式埋点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39@Service
public class OrderService {
private final Counter orderCreateCounter;
private final Timer createOrderTimer;
private final AtomicInteger pendingOrderCount;
// 构造方法中初始化指标(推荐:初始化时声明,业务中只使用)
public OrderService(MeterRegistry registry) {
// 1. 计数器:统计订单创建总数
this.orderCreateCounter = Counter.builder("order.create.total")
.description("订单创建总次数")
.tag("type", "normal")
.register(registry);
// 2. 计时器:统计创建订单方法的耗时
this.createOrderTimer = Timer.builder("order.create.duration")
.description("订单创建耗时")
.register(registry);
// 3. 量规:统计待处理订单数量
this.pendingOrderCount = new AtomicInteger(0);
Gauge.builder("order.pending.count", pendingOrderCount, AtomicInteger::get)
.description("待处理订单数")
.register(registry);
}
public void createOrder() {
// 计数器+1
orderCreateCounter.increment();
// 记录方法耗时
createOrderTimer.record(() -> {
// 执行业务逻辑
pendingOrderCount.incrementAndGet();
// ...
});
}
}注解式埋点
1
2
3
4
5
6
7
8
9
10
11
12@RestController
@RequestMapping("/api")
public class ApiController {
// 自动统计该接口的调用次数和耗时
@Timed(value = "api.request.duration", description = "接口请求耗时")
@Counted(value = "api.request.total", description = "接口请求总数")
@GetMapping("/user")
public String getUser() {
return "user info";
}
}部署Prometheus
写配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 全局配置
global:
scrape_interval: 15s # 全局默认抓取间隔:每15秒拉一次指标
evaluation_interval: 15s # 告警规则评估间隔
# 抓取任务配置
scrape_configs:
# 任务1:抓取 Prometheus 自身的指标(可选,方便验证服务是否正常)
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:8081'] # Prometheus暴露在主机的端口
# 任务2:抓取你的 Spring Boot 应用指标(核心配置)
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus' # Micrometer 暴露的指标端点路径
static_configs:
# 重点:不能写 localhost:8080,必须用 host.docker.internal 指向 Windows 宿主机
- targets: ['host.docker.internal:8080']docker部署
将挂载的配置目录换成自己的
1
2
3
4
5
6
7
8docker run \
-d \ # 后台守护模式启动容器,启动后不占用当前终端窗口
--name prometheus \ # 为容器指定固定名称 prometheus,方便后续通过名称停止、查看日志等管理操作
-p 8081:9090 \ # 端口映射:宿主机 8081 端口 → 容器内 9090 端口(Prometheus 默认服务端口),外部通过宿主机IP:8081访问Prometheus
-v "C:/Users/ASUS/Desktop/prometheus.yml" \ # 挂载宿主机文件到容器(注:当前写法不完整,无法生效,见下方补充)
--restart=always \ # 容器重启策略:容器意外退出、Docker服务重启时,都会自动重启该容器,保障服务持续可用
prom/prometheus:latest \ # 指定启动容器使用的镜像:Prometheus 官方最新稳定版镜像
--web.enable-lifecycle # Prometheus 进程启动参数:开启生命周期管理API,支持通过HTTP接口热重载配置,无需重启容器即可生效新的prometheus.yml访问
http://localhost:8081/,使用http_server_requests_seconds_count测试
可视化
使用Grafana进行展示
部署Grafana
1
docker run -d --name grafana -p 3000:3000 --restart=always grafana/grafana:latest访问控制台
http://localhost:3000/,账号密码默认adminConnections添加新的连接,选择Prometheus,之后修改Name以及server URL为Prometheus的URL1
http://host.docker.internal:8081点击
Save & test选择Dashboard,找合适的面板来展示数据
Micrometer
http://xwww12.github.io/2026/06/19/后端/Micrometer/