Micrometer 核心概念 详解

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:发送到 InfluxDB
  • DatadogMeterRegistry:发送到 Datadog
  • SimpleMeterRegistry:内存中存储,用于测试

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.requests
  • jvm.memory.used
  • cache.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

四、最佳实践

  1. 合理使用标签:避免高基数标签(如用户ID、IP地址)。
  2. 优先使用自动指标:Spring Boot 已提供大量有用指标。
  3. 自定义指标要有业务意义:如订单创建数、支付成功率。
  4. 避免频繁创建 Meter:应缓存或复用。
  5. 使用 Timer 而非手动记录时间:避免精度和异常问题。
  6. 监控指标本身的健康:如 meter.registry.errors

五、总结

概念说明
Meter指标的基本单位
MeterRegistry管理所有 Meter 并导出数据
Counter递增计数器
Gauge当前瞬时值
Timer执行时间统计
DistributionSummary数值分布统计
Tag为指标添加维度
MeterBinder封装指标注册逻辑
MeterFilter控制度量行为

Micrometer 通过简洁的 API 和强大的后端支持,成为现代 Java 应用监控的事实标准。掌握其核心概念,有助于构建可观测性强、易于运维的系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值