Java应用监控:Micrometer库
现代Java应用需要持续监控性能、内存消耗、响应时间及其他关键参数。Micrometer是Java生态系统中事实上的标准指标收集库,它提供通用API,并支持将数据导出到Prometheus、Graphite和Datadog等流行监控系统。
什么是Micrometer,为什么需要它?
Micrometer是一个指标收集门面,类似于SLF4J是日志记录门面。它将应用程序代码与具体的监控系统解耦,允许在不更改业务逻辑的情况下切换后端。
该库的主要功能:
- 计数器(Counter) — 用于计数事件(例如,请求数量)。
- 计时器(Timer) — 用于测量操作执行时间。
- 仪表(Gauge) — 用于跟踪当前值(例如,线程池大小)。
- 分布摘要(DistributionSummary) — 用于分析值分布(例如,请求体大小)。
- 标签(Tags) — 用于向指标添加维度(例如,
endpoint、status)。
安装与配置
要在Maven项目中使用Micrometer,请在pom.xml中添加以下依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.12.0</version></dependency>如果您使用Spring Boot,只需添加启动器micrometer-registry-prometheus:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.12.0</version></dependency>之后,Spring Boot将自动配置MeterRegistry,并开放/actuator/prometheus端点用于收集指标。
使用示例
1. 创建请求计数器
一个简单的计算方法调用次数的示例:
import io.micrometer.core.instrument.Counter;import io.micrometer.core.instrument.MeterRegistry;
public class RequestCounter { private final Counter requestCounter;
public RequestCounter(MeterRegistry registry) { this.requestCounter = Counter.builder("api.requests") .tag("endpoint", "/users") .description("Total number of requests to /users") .register(registry); }
public void handleRequest() { requestCounter.increment(); // 业务逻辑 }}2. 使用计时器测量执行时间
使用Timer.Sample测量代码块的执行时间:
import io.micrometer.core.instrument.Timer;import io.micrometer.core.instrument.MeterRegistry;
public class RequestTimer { private final Timer requestTimer;
public RequestTimer(MeterRegistry registry) { this.requestTimer = Timer.builder("api.response.time") .tag("endpoint", "/data") .publishPercentiles(0.95, 0.99) .register(registry); }
public String processRequest() { Timer.Sample sample = Timer.start(registry); try { // 模拟延迟 Thread.sleep(100); return "OK"; } catch (InterruptedException e) { Thread.currentThread().interrupt(); return "ERROR"; } finally