文章目录
-
- 摘要
- [1. 引言:为什么需要指标监控?](#1. 引言:为什么需要指标监控?)
-
- [1.1 监控的本质](#1.1 监控的本质)
- [1.2 Spring Boot 的监控演进](#1.2 Spring Boot 的监控演进)
- [2. 核心组件解析](#2. 核心组件解析)
-
- [2.1 Micrometer:指标采集的"门面"](#2.1 Micrometer:指标采集的“门面”)
- [2.2 Spring Boot Actuator:暴露监控端点](#2.2 Spring Boot Actuator:暴露监控端点)
- [3. 快速上手:集成 Prometheus 监控](#3. 快速上手:集成 Prometheus 监控)
-
- [3.1 添加依赖](#3.1 添加依赖)
- [3.2 配置 Actuator](#3.2 配置 Actuator)
- [3.3 访问指标](#3.3 访问指标)
- [4. 自动采集的内置指标](#4. 自动采集的内置指标)
- [5. 自定义业务指标](#5. 自定义业务指标)
-
- [5.1 使用 MeterRegistry 注入](#5.1 使用 MeterRegistry 注入)
- [5.2 动态 Gauge 示例(监控队列长度)](#5.2 动态 Gauge 示例(监控队列长度))
- [6. 构建完整监控体系:Prometheus + Grafana](#6. 构建完整监控体系:Prometheus + Grafana)
-
- [6.1 Prometheus 配置](#6.1 Prometheus 配置)
- [6.2 Grafana 可视化](#6.2 Grafana 可视化)
- [7. 生产环境最佳实践](#7. 生产环境最佳实践)
-
- [✅ 推荐做法](#✅ 推荐做法)
- [❌ 避免陷阱](#❌ 避免陷阱)
- [8. 高级话题](#8. 高级话题)
-
- [8.1 多注册中心支持](#8.1 多注册中心支持)
- [8.2 指标采样与过滤](#8.2 指标采样与过滤)
- [8.3 与 OpenTelemetry 集成](#8.3 与 OpenTelemetry 集成)
- [9. 总结](#9. 总结)
摘要
在现代云原生架构中,应用可观测性(Observability)已成为保障系统稳定性、性能和可维护性的核心能力。其中,指标(Metrics) 作为可观测性的三大支柱之一(另两者为日志 Logs 和链路追踪 Traces),提供了对系统运行状态的量化洞察。
Spring Boot 通过 Micrometer 与 Actuator 的深度集成,为开发者提供了开箱即用的指标采集能力,并能无缝对接 Prometheus、Datadog、InfluxDB 等主流监控后端。
本文将系统性地讲解 Spring Boot 中指标收集的原理、核心组件、常用指标类型、自定义指标实现方式,并结合 Prometheus + Grafana 构建完整的监控可视化体系。内容涵盖生产环境最佳实践、性能调优建议及常见陷阱规避,帮助开发者构建专业级的应用监控能力。
1. 引言:为什么需要指标监控?
1.1 监控的本质
"你无法管理你无法衡量的东西。" ------ 彼得·德鲁克
在分布式系统中,仅靠日志排查问题效率低下。指标提供了一种聚合、实时、可告警的视角,用于回答以下关键问题:
- 系统当前负载如何?(CPU、内存、线程)
- 接口响应是否变慢?(HTTP 延迟、错误率)
- 数据库连接池是否耗尽?
- 缓存命中率是否下降?
- JVM 是否频繁 Full GC?
1.2 Spring Boot 的监控演进
早期 Spring Boot 1.x 依赖 spring-boot-starter-actuator 提供 /metrics 端点,但缺乏标准化和扩展性。
从 Spring Boot 2.0 起,官方引入 Micrometer 作为统一的指标门面(类似 SLF4J 之于日志),实现了:
- 多后端适配:一套代码对接多种监控系统
- 维度标签化(Tagging):支持按服务、实例、接口等维度聚合
- 自动指标采集:JVM、Tomcat、DataSource、Cache 等开箱即用
2. 核心组件解析
2.1 Micrometer:指标采集的"门面"
Micrometer 是一个指标门面库,定义了统一的 API,屏蔽底层监控系统的差异。
-
Meter 类型:
Counter:单调递增计数器(如请求总数)Timer:记录事件耗时与频率(如接口响应时间)Gauge:瞬时值(如当前活跃线程数、队列长度)DistributionSummary:分布统计(如请求体大小)
-
标签(Tags) :键值对,用于多维筛选与聚合
示例:
http.server.requests{method="GET", uri="/api/users", status="200"}
2.2 Spring Boot Actuator:暴露监控端点
spring-boot-starter-actuator 提供了 /actuator/metrics、/actuator/prometheus 等端点,用于对外暴露指标数据。
默认启用的关键端点:
/actuator/health:健康检查/actuator/info:应用信息/actuator/metrics:指标列表与查询/actuator/prometheus:Prometheus 格式指标(需引入 micrometer-registry-prometheus)
3. 快速上手:集成 Prometheus 监控
3.1 添加依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
3.2 配置 Actuator
yaml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus # 暴露 prometheus 端点
endpoint:
health:
show-details: always
metrics:
tags:
application: ${spring.application.name} # 全局标签
3.3 访问指标
启动应用后,访问:
http://localhost:8080/actuator/prometheus
输出示例:
prometheus
# HELP http_server_requests_seconds
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{application="user-service",method="GET",uri="/api/users",status="200",} 125.0
http_server_requests_seconds_sum{application="user-service",method="GET",uri="/api/users",status="200",} 2.345
# HELP jvm_memory_used_bytes
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{application="user-service",area="heap",id="G1 Eden Space",} 1.23E8
4. 自动采集的内置指标
Spring Boot + Micrometer 自动采集以下维度指标:
| 类别 | 关键指标 | 说明 |
|---|---|---|
| JVM | jvm.memory.used, jvm.gc.pause |
内存使用、GC 暂停时间 |
| Tomcat | tomcat.threads.busy, tomcat.sessions.active |
线程池、会话数 |
| HTTP Server | http.server.requests |
请求次数、延迟、错误率 |
| DataSource | jdbc.connections.active, jdbc.connections.max |
连接池使用情况 |
| Cache | cache.gets, cache.puts |
缓存命中/未命中统计 |
| Logback | logback.events |
日志级别事件计数 |
提示 :可通过
/actuator/metrics查看所有可用指标名称。
5. 自定义业务指标
5.1 使用 MeterRegistry 注入
java
@Service
public class OrderService {
private final Counter orderCreatedCounter;
private final Timer orderProcessTimer;
public OrderService(MeterRegistry meterRegistry) {
this.orderCreatedCounter = Counter.builder("orders.created")
.description("Total number of orders created")
.tag("status", "success")
.register(meterRegistry);
this.orderProcessTimer = Timer.builder("orders.process.duration")
.description("Time taken to process an order")
.tag("type", "standard")
.register(meterRegistry);
}
public void createOrder(Order order) {
orderCreatedCounter.increment();
orderProcessTimer.record(() -> {
// 业务逻辑
processOrder(order);
});
}
}
5.2 动态 Gauge 示例(监控队列长度)
java
@Component
public class TaskQueueMonitor {
public TaskQueueMonitor(MeterRegistry meterRegistry, TaskQueue queue) {
Gauge.builder("task.queue.size", queue, q -> q.size())
.description("Current size of task queue")
.register(meterRegistry);
}
}
6. 构建完整监控体系:Prometheus + Grafana
6.1 Prometheus 配置
在 prometheus.yml 中添加 Job:
yaml
scrape_configs:
- job_name: 'user-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
6.2 Grafana 可视化
- 导入官方 JVM (Micrometer) 面板(ID: 4701)
- 创建自定义面板:
- 查询:
rate(http_server_requests_seconds_count{uri="/api/orders"}[5m]) - 展示:每秒订单创建速率
- 查询:
- 设置告警规则(如错误率 > 1% 持续 5 分钟)
7. 生产环境最佳实践
✅ 推荐做法
- 全局标签注入 :通过
management.metrics.tags添加env、region、version等维度 - 限制指标数量:避免高基数标签(如用户 ID),防止监控系统爆炸
- 启用健康检查 :结合
/actuator/health实现 Kubernetes Liveness/Readiness Probe - 敏感端点保护 :通过 Spring Security 限制
/actuator访问权限 - 定期清理旧指标:配置 Prometheus retention period
❌ 避免陷阱
- 不要记录 PII 数据:指标中禁止包含用户手机号、身份证等
- 避免高频更新 Gauge:Gauge 应反映状态,而非事件流
- 慎用 Histogram vs Summary:Prometheus 推荐使用 Histogram(支持分位数聚合)
8. 高级话题
8.1 多注册中心支持
Micrometer 支持同时上报多个后端:
java
@Bean
MeterRegistry customRegistry() {
CompositeMeterRegistry composite = new CompositeMeterRegistry();
composite.add(new PrometheusMeterRegistry(PrometheusConfig.DEFAULT));
composite.add(new DatadogMeterRegistry(datadogConfig, Clock.SYSTEM));
return composite;
}
8.2 指标采样与过滤
通过 MeterFilter 实现:
java
@Bean
public MeterFilter ignoreHealthCheckRequests() {
return MeterFilter.deny(id ->
id.getName().equals("http.server.requests") &&
"/actuator/health".equals(id.getTag("uri"))
);
}
8.3 与 OpenTelemetry 集成
未来趋势是统一 Metrics、Logs、Traces。Spring Boot 3+ 已支持 OpenTelemetry,可通过 opentelemetry-exporter-prometheus 替代 Micrometer。
9. 总结
指标监控不是"锦上添花",而是现代应用的基础设施。Spring Boot 通过 Micrometer + Actuator,将复杂的监控体系简化为几行配置和标准 API。
核心价值总结:
- 开箱即用:自动采集 JVM、Web、DB 等关键指标
- 标准化:统一 API,无缝切换监控后端
- 可扩展:轻松注入业务指标,实现全链路可观测
- 生产就绪:支持标签、过滤、安全、告警等企业级需求
构建完善的指标监控体系,不仅能快速定位性能瓶颈,更能驱动架构优化与容量规划,是迈向 SRE(站点可靠性工程)的重要一步。
版权声明:本文为作者原创,转载请注明出处。