Micrometer 指标采集

在 Java 生态中,Micrometer 是事实上的指标采集标准 API。它将 Spring Boot、Dropwizard Metrics 等框架的指标抽象为统一接口,允许开发者编写一次指标代码,同时输出到 Prometheus、Datadog、CloudWatch 等多个监控系统。Micrometer 的定位类似于 SLF4J 在日志领域的作用——解耦应用代码与监控后端。

Micrometer 的核心概念是 Meter(计量器),它是所有指标的抽象基类。根据测量类型不同,Meters 分为:Counter、Gauge、Timer、DistributionSummary、LongTaskTimer、MultiGauge 等。每种 Meter 对应特定的测量场景。

核心 API 使用

Micrometer 的 API 设计简洁直观。以下是四种基本 Meter 的使用示例:

// Counter:统计请求数量
Counter counter = Metrics.counter("http.requests", "method", "GET", "status", "200");
counter.increment();

// Gauge:监控当前值(需要提供 Supplier)
AtomicInteger activeRequests = new AtomicInteger(0);
Metrics.gauge("http.active_requests", activeRequests);

// Timer:统计耗时分布
Timer timer = Metrics.timer("http.request.duration");
timer.record(() -> {
    // 业务逻辑
});

// DistributionSummary:统计大小分布
DistributionSummary summary = Metrics.summary("http.response.size", "endpoint", "/api/users");
summary.record(responseSize);

标签设计规范

标签(Tags/Labels)是 Micrometer 中最重要的概念,決定了指标的维度划分。良好的标签设计应该遵循以下规范:

层次分明:使用多级标签而非单一复合标签。好的设计:uri="/api/users"status="200";不好的设计:uri_status="/api/users-200"。多级标签支持灵活的组合查询,而复合标签无法拆分。

基数可控:避免高基数字段作为标签值,如用户 ID、会话 ID。标签基数过高会导致 Prometheus 的内存压力急剧上升。一个标签的基数应该与其分析价值相匹配:服务名、端点名是低基数的,分析价值高;用户 ID 是高基数的,不应作为标签。

命名统一:使用点分隔的全小写命名,如 http.server.requests。避免混合大小写或驼峰命名。