Micrometer

Micrometer

Micrometer 是一款面向 JVM 指标采集框架,可以把应用里的各种运行数据统一采集出来,再输出到不同的监控系统里

作用

  • 解耦业务与监控后端:业务代码只依赖 Micrometer 标准 API,更换监控系统无需修改业务埋点代码。
  • 标准化指标类型:定义了 Counter、Timer、Gauge 等通用指标类型,覆盖绝大多数应用监控场景,统一了指标语义和采集方式。
  • 生态深度集成:与 Spring Boot Actuator 无缝整合,同时支持 Spring Cloud、Dubbo、Redis 等主流框架的自动埋点。

概念

  • Micrometer、Prometheus和Grafana关系

    • Micrometer:采集指标,提供统一的埋点 API
    • Prometheus:按照配置的间隔(通常 15s)主动抓取(Scrape)各个应用暴露的指标端点,将数据按时间序列持久化存储
    • Grafana:可视化仪表盘平台,将数据渲染成折线图、柱状图、热力图、数字仪表盘等丰富的可视化组件
  • 指标注册中心 MeterRegistry:MeterRegistry 是 Micrometer 的核心接口,负责创建、缓存和管理所有 Meter(指标),每一种监控后端都有对应的 Registry 实现

    Spring Boot会自动根据依赖注入对应类型的 MeterRegistry Bean,业务代码直接注入即可使用。

  • 度量指标 Meter

    指标类型 特性 典型适用场景
    Counter 单调递增,只能加不能减 请求次数、错误次数、订单创建数、异常计数
    Timer 同时统计事件次数 + 总耗时,内置百分位计算 接口响应耗时、方法执行时长、SQL 执行时间
    Gauge 瞬时值,可增可减,反映当前状态 队列积压长度、线程池活跃线程数、在线用户数、内存占用
    DistributionSummary 统计数值分布,支持百分位 响应体大小、订单金额、文件上传大小
    LongTaskTimer 统计正在执行中的长任务耗时 批量任务执行时长、大文件处理进度

使用实例

下面的是使用Windows平台及Docker Desktop

  1. 引入依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- 把micrometer指标转换为prometheus能识别的文本格式 -->
    <dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
  2. 开启指标暴露

    application.yml

    1
    2
    3
    4
    5
    management:
    endpoints:
    web:
    exposure:
    include: health,info,prometheus
  3. 访问http://localhost:8080/actuator/prometheus查看默认指标

  4. 自定义业务指标(两种方式)

    代码式埋点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    @Service
    public class OrderService {

    private final Counter orderCreateCounter;
    private final Timer createOrderTimer;
    private final AtomicInteger pendingOrderCount;

    // 构造方法中初始化指标(推荐:初始化时声明,业务中只使用)
    public OrderService(MeterRegistry registry) {
    // 1. 计数器:统计订单创建总数
    this.orderCreateCounter = Counter.builder("order.create.total")
    .description("订单创建总次数")
    .tag("type", "normal")
    .register(registry);

    // 2. 计时器:统计创建订单方法的耗时
    this.createOrderTimer = Timer.builder("order.create.duration")
    .description("订单创建耗时")
    .register(registry);

    // 3. 量规:统计待处理订单数量
    this.pendingOrderCount = new AtomicInteger(0);
    Gauge.builder("order.pending.count", pendingOrderCount, AtomicInteger::get)
    .description("待处理订单数")
    .register(registry);
    }

    public void createOrder() {
    // 计数器+1
    orderCreateCounter.increment();

    // 记录方法耗时
    createOrderTimer.record(() -> {
    // 执行业务逻辑
    pendingOrderCount.incrementAndGet();
    // ...
    });
    }
    }

    注解式埋点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RestController
    @RequestMapping("/api")
    public class ApiController {

    // 自动统计该接口的调用次数和耗时
    @Timed(value = "api.request.duration", description = "接口请求耗时")
    @Counted(value = "api.request.total", description = "接口请求总数")
    @GetMapping("/user")
    public String getUser() {
    return "user info";
    }
    }
  5. 部署Prometheus

    1. 写配置文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      # 全局配置
      global:
      scrape_interval: 15s # 全局默认抓取间隔:每15秒拉一次指标
      evaluation_interval: 15s # 告警规则评估间隔

      # 抓取任务配置
      scrape_configs:
      # 任务1:抓取 Prometheus 自身的指标(可选,方便验证服务是否正常)
      - job_name: 'prometheus'
      static_configs:
      - targets: ['localhost:8081'] # Prometheus暴露在主机的端口

      # 任务2:抓取你的 Spring Boot 应用指标(核心配置)
      - job_name: 'spring-boot-app'
      metrics_path: '/actuator/prometheus' # Micrometer 暴露的指标端点路径
      static_configs:
      # 重点:不能写 localhost:8080,必须用 host.docker.internal 指向 Windows 宿主机
      - targets: ['host.docker.internal:8080']
    2. docker部署

      将挂载的配置目录换成自己的

      1
      2
      3
      4
      5
      6
      7
      8
      docker run \
      -d \ # 后台守护模式启动容器,启动后不占用当前终端窗口
      --name prometheus \ # 为容器指定固定名称 prometheus,方便后续通过名称停止、查看日志等管理操作
      -p 8081:9090 \ # 端口映射:宿主机 8081 端口 → 容器内 9090 端口(Prometheus 默认服务端口),外部通过宿主机IP:8081访问Prometheus
      -v "C:/Users/ASUS/Desktop/prometheus.yml" \ # 挂载宿主机文件到容器(注:当前写法不完整,无法生效,见下方补充)
      --restart=always \ # 容器重启策略:容器意外退出、Docker服务重启时,都会自动重启该容器,保障服务持续可用
      prom/prometheus:latest \ # 指定启动容器使用的镜像:Prometheus 官方最新稳定版镜像
      --web.enable-lifecycle # Prometheus 进程启动参数:开启生命周期管理API,支持通过HTTP接口热重载配置,无需重启容器即可生效新的prometheus.yml
    3. 访问http://localhost:8081/,使用http_server_requests_seconds_count测试

  6. 可视化

    使用Grafana进行展示

    1. 部署Grafana

      1
      docker run -d --name grafana -p 3000:3000 --restart=always grafana/grafana:latest

      访问控制台http://localhost:3000/,账号密码默认admin

    2. Connections添加新的连接,选择Prometheus,之后修改Name以及server URL为Prometheus的URL

      1
      http://host.docker.internal:8081

      点击Save & test

    3. 选择Dashboard,找合适的面板来展示数据


Micrometer
http://xwww12.github.io/2026/06/19/后端/Micrometer/
作者
xw
发布于
2026年6月19日
许可协议