Java 应用接入 Prometheus 监控(Spring Boot 实战)
Spring Boot 接入 Prometheus:Micrometer + Actuator 暴露 /actuator/prometheus、JVM 默认指标解读、Counter/Gauge/Timer 自定义埋点与生产配置要点。
Spring Boot 接入 Prometheus 的正确路径是 Micrometer(指标门面)+ Actuator(端点暴露):Spring 生态的官方组合,JVM 与应用的常用指标开箱即得。
第一步:依赖与配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
# application.properties
management.endpoints.web.exposure.include=health,metrics,prometheus
management.endpoint.prometheus.enabled=true
启动后 http://localhost:8080/actuator/prometheus 即可抓取。
默认白送的指标
依赖一加上,JVM 与应用的核心指标自动暴露:
jvm_memory_used_bytes(堆/非堆)、jvm_gc_pause_seconds(GC 停顿)jvm_threads_live_threads(线程数)、process_cpu_usagehttp_server_requests_seconds(HTTP 请求数与耗时直方图——Web 应用的 RED 指标已经自动埋好了)
Prometheus 抓取配置:
scrape_configs:
- job_name: spring-app
metrics_path: /actuator/prometheus
static_configs:
- targets: ['app:8080']
自定义业务指标
Counter:累计计数
@Component
public class OrderMetrics {
private final Counter ordersTotal;
public OrderMetrics(MeterRegistry registry) {
this.ordersTotal = Counter.builder("orders_total")
.description("Total orders")
.tag("channel", "web")
.register(registry);
}
public void onOrderCreated() { ordersTotal.increment(); }
}
Gauge:瞬时值
Gauge.builder("shopping_cart_active_items", cartService, CartService::activeItemCount)
.register(registry);
Timer:耗时与分布
Timer paymentTimer = Timer.builder("payment_duration_seconds")
.publishPercentileHistogram(true) // 暴露 histogram 桶,服务端可算 P99
.register(registry);
paymentTimer.record(() -> processPayment(order));
务必开 publishPercentileHistogram(true)——默认 Timer 只暴露 count/sum/max,开了这个才能用 histogram_quantile 算分位数。
生产要点
- Actuator 端点别裸奔:
/actuator/prometheus只对内网开放,或用独立 management 端口(management.server.port=9091)隔离; - 标签基数:URL 用路由模板(
uri=/users/{id},Micrometer 默认已处理);别往 tag 里塞业务 ID; - JVM 指标盯什么:老年代占用趋势(内存泄漏)、GC 停顿 P99、线程数突增(线程泄漏)——这三个是 Java 应用最高频的退化信号。
观测云对照
Java 是观测云 APM 支持最成熟的语言之一:-javaagent 探针一行启动参数接入,请求链路、慢 SQL、异常堆栈、JVM 指标全部自动采集,多数场景不需要手写 Micrometer 埋点;已有的 Micrometer/Prometheus 指标可由 DataKit 抓取汇聚,与 APM 链路数据关联——从"接口 P99 变慢"一键下钻到具体 Span 和 SQL。
常见问题(FAQ)
Q:Micrometer 和直接用 Prometheus Java 客户端有什么区别?
A:Micrometer 是门面(类似 SLF4J 之于日志),Spring Boot 自动装配全靠它;切换后端(Prometheus→其他)不用改代码。直接用 Prometheus 客户端则绑死实现。Spring 项目一律走 Micrometer。
Q:JVM 堆一直涨是内存泄漏吗?
A:不一定——先确认 Full GC 后是否回落。看 jvm_memory_used_bytes{area="heap"} 在 GC 后的"底"是否逐次抬高:底越来越高才是真泄漏,配合堆 dump 分析。
Q:能看到 Tomcat 线程池状态吗?
A:能,tomcat_threads_busy_threads、tomcat_threads_config_max_threads 默认暴露——busy 接近 max 就是线程池打满的前兆。