Spring Boot 集成 Prometheus 的核心是通过 Micrometer 抽象层以非侵入方式采集自定义业务指标,推荐使用 AOP 或注解自动织入;需引入 spring-boot-starter-actuator 和 micrometer-registry-prometheus 依赖,配置暴露 /actuator/prometheus 端点,并按场景选用 Counter、Gauge、Timer 或 DistributionSummary 指标类型。

在 Spring Boot 中集成 Prometheus 收集自定义业务指标,核心是借助 Micrometer 统一指标抽象层,把业务逻辑中的关键行为(如方法调用、耗时、成功/失败次数)转化为可被 Prometheus 抓取的时序数据。整个过程不依赖侵入式埋点,推荐用 AOP 或注解方式自动织入,兼顾可维护性和可观测性。
添加必要依赖
确保项目引入以下 Maven 依赖:
- spring-boot-starter-actuator:提供监控端点基础能力
- micrometer-registry-prometheus:将 Micrometer 指标自动转换为 Prometheus 格式并暴露 /actuator/prometheus 端点
Spring Boot 2.7+ 和 3.x 版本会自动配置 Micrometer,无需手动注册 MeterRegistry bean。
启用并暴露 Prometheus 端点
在 application.yml 中配置:
management:
endpoints:
web:
exposure:
include: "health,prometheus,metrics" # 只暴露必要端点更安全
endpoint:
prometheus:
scrape-interval: 15s # 可选,控制指标刷新频率
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
profile: ${spring.profiles.active}
启动后访问 http://localhost:8080/actuator/prometheus,应能看到以 # TYPE 开头的指标文本,含 jvm_、http_server_requests 等默认指标。
定义和使用自定义指标
Micrometer 提供四类基础指标类型,按场景选用:
- Counter(计数器):只增不减,适合统计「成功下单次数」「支付失败次数」
- Gauge(瞬时值):反映当前状态,如「当前待处理订单数」「缓存命中率」
- Timer(计时器):记录耗时分布(含 count、sum、max、percentiles),适合「接口响应时间」「DB 查询耗时」
- DistributionSummary(分布摘要):类似 Timer,但不绑定时间单位,适合「订单金额分布」「文件大小分布」
示例:在 Service 方法中注入并使用 Timer 记录下单耗时:
@Service
public class OrderService {
private final Timer orderCreateTimer;
<pre class="brush:java;toolbar:false;">public OrderService(MeterRegistry registry) {
this.orderCreateTimer = Timer.builder("order.create.time")
.description("Time taken to create an order")
.tag("status", "success")
.register(registry);
}
public Order createOrder(OrderRequest req) {
return orderCreateTimer.record(() -> {
// 实际业务逻辑
return doCreate(req);
});
}
}
该指标最终在 Prometheus 中表现为:order_create_time_seconds_count、order_create_time_seconds_sum、order_create_time_seconds_max 等。
用 AOP 自动埋点(推荐)
避免在每个方法里手写 record(),可定义切面统一采集:
- 创建自定义注解
@MethodMetrics(name = "user.login") - 切面拦截带该注解的方法,自动用 Timer 记录执行耗时,并用 Counter 统计调用次数
- 支持通过注解参数动态打标签,例如
@MethodMetrics(tags = {"type=mobile", "v=2.1"})
这样业务代码完全无感知,指标采集与逻辑解耦,上线后也能灵活开关或调整粒度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











