> 技术文档 > Java 度量库 Micrometer 介绍及使用示例_java micrometer

Java 度量库 Micrometer 介绍及使用示例_java micrometer


Micrometer 介绍及使用示例

什么是 Micrometer?

Micrometer 是一个为 Java 应用提供的度量工具库,它提供了简单、统一的接口来记录应用指标,支持多种监控系统。Micrometer 类似于 SLF4J,但它不是用于日志记录,而是用于应用指标收集。

主要特点

  1. 供应商中立:支持多种监控系统(Prometheus, Atlas, Graphite, InfluxDB 等)
  2. 维度度量:支持标签(tags)的多维度度量
  3. 丰富的度量类型:计数器、计时器、计量器、长任务计时器等
  4. 与 Spring 生态良好集成:特别是 Spring Boot Actuator

核心概念

度量类型

  1. Counter(计数器):记录单调递增的值,如请求次数
  2. Gauge(计量器):记录瞬时值,如内存使用量
  3. Timer(计时器):记录短时任务的耗时和频率
  4. DistributionSummary(分布摘要):记录事件的分布情况,如响应大小
  5. LongTaskTimer(长任务计时器):记录长时间运行任务的耗时

关键组件

  • MeterRegistry:度量的注册中心,核心接口
  • Meter:具体的度量实例
  • Tag/Label:用于多维度分类的标签

使用示例

1. 基本依赖配置

对于 Maven 项目:

<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.10.0</version> </dependency>

2. 简单计数器示例

import io.micrometer.core.instrument.Counter;import io.micrometer.core.instrument.Metrics;public class CounterExample { public static void main(String[] args) { // 获取或创建计数器 Counter counter = Metrics.counter(\"my.counter\", \"tag1\", \"value1\"); // 递增计数器 counter.increment(); counter.increment(2.5); System.out.println(\"Counter value: \" counter.count()); }}

3. 计时器使用示例

import io.micrometer.core.instrument.Timer;import io.micrometer.core.instrument.Metrics;public class TimerExample { private static final Timer requestTimer = Metrics.timer(\"http.requests\", \"uri\", \"/api/users\"); public void handleRequest() { // 记录方法执行时间 requestTimer.record(() -> { // 模拟业务处理 try { Thread.sleep(100 + (long)(Math.random() * 100)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); // 或者手动记录 Timer.Sample sample = Timer.start(); try { // 业务逻辑 Thread.sleep(50); } finally { sample.stop(requestTimer); } }}

4. 计量器(Gauge)示例

import io.micrometer.core.instrument.Gauge;import io.micrometer.core.instrument.Metrics;public class GaugeExample { private static double temperature = 20.0; public static void main(String[] args) { // 注册计量器 Gauge.builder(\"system.temperature\", () -> temperature) .tags(\"location\", \"server.room1\") .register(Metrics.globalRegistry);  // 模拟温度变化 for (int i = 0; i < 10; i++) { temperature += Math.random() * 2 - 1; // -1到1之间的随机变化 try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }}

5. 与 Prometheus 集成

添加依赖:

<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.10.0</version></dependency>

示例代码:

import io.micrometer.prometheus.PrometheusConfig;import io.micrometer.prometheus.PrometheusMeterRegistry;import io.micrometer.core.instrument.Counter;public class PrometheusExample { public static void main(String[] args) { // 创建Prometheus注册表 PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); // 创建计数器 Counter counter = registry.counter(\"my.prom.counter\"); counter.increment(); // 获取Prometheus格式的指标数据 String scrape = registry.scrape(); System.out.println(scrape); }}

6. Spring Boot 集成示例

在 Spring Boot 应用中,Micrometer 已经自动集成:

  1. 添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId></dependency>
  1. 配置 application.properties:
management.endpoints.web.exposure.include=health,info,prometheusmanagement.metrics.tags.application=my-application
  1. 自定义指标:
import io.micrometer.core.instrument.Counter;import io.micrometer.core.instrument.MeterRegistry;import org.springframework.stereotype.Component;@Componentpublic class MyService { private final Counter myCounter; public MyService(MeterRegistry registry) { myCounter = registry.counter(\"my.service.calls\"); } public void doWork() { myCounter.increment(); // 业务逻辑 }}

最佳实践

  1. 合理使用标签:利用标签进行多维度分析,但避免高基数标签
  2. 命名规范:使用点分隔的小写单词(如 http.requests
  3. 避免频繁创建指标:重用 Meter 实例
  4. 选择合适的度量类型:根据场景选择计数器、计时器等
  5. 监控关键业务指标:而不仅仅是技术指标

Micrometer 为 Java 应用提供了强大而灵活的度量能力,能够帮助开发者轻松实现应用监控并与各种监控系统集成。