Micrometer 是一个用于监控和度量(Metrics)的 Java 库,广泛用于 Spring Boot 2.x 及以上版本中,作为应用性能监控(APM)的基础组件。它为开发者提供了一套统一的 API,用于收集应用的运行时指标(如计数器、计时器、仪表等),并支持将这些指标导出到多种监控系统(如 Prometheus、Graphite、InfluxDB、Datadog 等)。
下面详细讲解 Micrometer 的核心概念:
一、Micrometer 的核心目标
Micrometer 的设计目标是:
- 提供统一的 API 来收集应用指标。
- 解耦监控后端(如 Prometheus)与应用代码。
- 支持多监控系统(通过不同的 MeterRegistry 实现)。
- 高性能、低开销。
二、核心概念详解
1. Meter(度量器)
Meter 是 Micrometer 中最基本的抽象,表示一个具体的度量指标。每个 Meter 都有:
- 名称(name)
- 标签(tags)
- 类型(counter, timer, gauge, etc.)
- 时间戳和值
Meter 不是直接创建的,而是通过
MeterRegistry创建。
2. MeterRegistry(度量注册表)
MeterRegistry 是 Micrometer 的核心组件,负责:
- 创建和管理所有的 Meter。
- 将指标数据导出到后端监控系统(如 Prometheus)。
- 提供统一的 API 来注册和访问指标。
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("application", "my-app");
}
常见的 MeterRegistry 实现:
PrometheusMeterRegistry:导出为 Prometheus 格式InfluxMeterRegistry:发送到 InfluxDBDatadogMeterRegistry:发送到 DatadogSimpleMeterRegistry:内存中存储,用于测试
3. Meter 的类型(核心指标类型)
Micrometer 提供了多种 Meter 类型,对应不同的监控场景:
(1)Counter(计数器)
- 用途:单调递增的计数器,用于记录事件发生的次数。
- 特点:只能增加,不能减少(
increment())。 - 适用场景:HTTP 请求次数、错误数、消息消费数等。
Counter counter = Counter.builder("http.requests")
.tag("method", "GET")
.register(registry);
counter.increment();
(2)Gauge(仪表)
- 用途:测量当前瞬时值(如内存使用量、队列大小)。
- 特点:可增可减,反映当前状态。
- 注意:Gauge 通常通过回调函数获取值。
List<String> queue = new LinkedList<>();
Gauge.builder("queue.size", queue, List::size)
.register(registry);
⚠️ 不要用于高频更新的值(性能开销大)
(3)Timer(计时器)
- 用途:记录操作的执行时间(如 HTTP 请求耗时)。
- 特点:记录时间分布(max、mean、percentiles、histogram)。
- 内部使用
DistributionSummary+ 时间单位。
Timer timer = Timer.builder("http.server.requests")
.tag("uri", "/api/users")
.register(registry);
timer.record(Duration.ofMillis(100));
也可使用 time() 方法简化:
timer.record(() -> {
// 执行业务逻辑
});
(4)DistributionSummary(分布摘要)
- 用途:记录事件的大小或数量的分布(如请求体大小、响应字节数)。
- 特点:不关心时间,只关心数值分布(count、total、max、percentiles)。
DistributionSummary summary = DistributionSummary.builder("request.size")
.register(registry);
summary.record(1024); // 记录请求大小
(5)LongTaskTimer(长任务计时器)
- 用途:测量长时间运行的任务(如批处理、异步任务)。
- 特点:记录正在运行的任务数量和持续时间。
LongTaskTimer timer = LongTaskTimer.builder("batch.job.duration")
.register(registry);
LongTaskTimer.Sample sample = timer.start();
// 执行任务
sample.stop();
(6)FunctionCounter / FunctionTimer / FunctionGauge
- 用途:基于已有对象的值自动暴露为指标。
- 特点:无需手动更新,通过函数回调自动获取值。
Queue<String> queue = new ConcurrentLinkedQueue<>();
FunctionGauge.builder("queue.size", queue, q -> q.size())
.register(registry);
推荐使用
FunctionGauge而非手动Gauge,更安全高效。
4. Tag(标签)
- 作用:为指标添加维度,实现多维数据切片分析。
- 格式:键值对(key=value),如
status=200,method=GET - 重要性:Prometheus 等系统依赖标签进行查询和聚合。
registry.counter("requests", "method", "GET", "status", "200");
✅ 建议:
- 标签值不应无限增长(避免“标签爆炸”)。
- 使用有意义的标签名(如
uri,status,exception)。
5. Naming Convention(命名规范)
Micrometer 推荐使用 小写 + 点分隔 的命名方式,例如:
http.server.requestsjvm.memory.usedcache.evictions
避免使用大写、特殊字符或下划线。
6. 自动指标(Auto-configured Metrics)
Spring Boot 自动配置了许多开箱即用的指标,例如:
- JVM 相关:
jvm.memory.used,jvm.threads.live - HTTP 请求:
http.server.requests - Tomcat 连接池:
tomcat.threads.busy - 缓存:
cache.gets,cache.puts - 数据库连接池:
hikari.connections.active
这些指标由 MeterBinder 自动注册。
7. MeterBinder(度量绑定器)
用于封装一组相关指标的注册逻辑。Spring Boot 中很多自动指标都是通过 MeterBinder 实现的。
@Component
public class CustomMetricsBinder implements MeterBinder {
private final AtomicInteger activeUsers = new AtomicInteger(0);
@Override
public void bindTo(MeterRegistry registry) {
Gauge.builder("users.active", activeUsers, AtomicInteger::get)
.register(registry);
}
}
8. MeterFilter(度量过滤器)
用于控制哪些指标被注册、重命名、添加标签、拒绝等。
@Bean
public MeterFilter meterFilter() {
return MeterFilter.deny(id -> id.getName().startsWith("jvm."));
}
常用操作:
MeterFilter.accept():允许MeterFilter.deny():拒绝MeterFilter.rename():重命名MeterFilter.commonTags():添加通用标签
三、与 Prometheus 集成示例
# application.yml
management:
endpoints:
web:
exposure:
include: prometheus
metrics:
export:
prometheus:
enabled: true
访问 /actuator/prometheus 即可看到指标:
http_server_requests_seconds_count{method="GET",uri="/api/users",status="200"} 42.0
http_server_requests_seconds_max{method="GET",uri="/api/users",status="200"} 0.123
四、最佳实践
- 合理使用标签:避免高基数标签(如用户ID、IP地址)。
- 优先使用自动指标:Spring Boot 已提供大量有用指标。
- 自定义指标要有业务意义:如订单创建数、支付成功率。
- 避免频繁创建 Meter:应缓存或复用。
- 使用 Timer 而非手动记录时间:避免精度和异常问题。
- 监控指标本身的健康:如
meter.registry.errors。
五、总结
| 概念 | 说明 |
|---|---|
Meter | 指标的基本单位 |
MeterRegistry | 管理所有 Meter 并导出数据 |
Counter | 递增计数器 |
Gauge | 当前瞬时值 |
Timer | 执行时间统计 |
DistributionSummary | 数值分布统计 |
Tag | 为指标添加维度 |
MeterBinder | 封装指标注册逻辑 |
MeterFilter | 控制度量行为 |
Micrometer 通过简洁的 API 和强大的后端支持,成为现代 Java 应用监控的事实标准。掌握其核心概念,有助于构建可观测性强、易于运维的系统。
951

被折叠的 条评论
为什么被折叠?



