You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3中Micrometer Counter指标在Prometheus不显示的求助

Spring Boot 3 + Micrometer/Prometheus 统计API总访问量解决方案

问题背景

在Spring Boot 3应用中集成Micrometer、Prometheus、Grafana做可观测性,已添加所需依赖,但尝试两种方法统计getMoviesOfDirector接口总访问量时,Prometheus UI中无法看到对应指标。

原方法问题分析

方法1:@Counted注解失效原因

  • @Counted依赖Spring AOP实现,若未引入AOP依赖或未开启AOP代理,注解不会生效
  • 若方法为内部调用(同一类中其他方法调用此方法),AOP代理不会触发,注解无法计数
  • 指标名称未遵循Prometheus规范(建议用下划线分隔,避免点号可能的解析问题)

方法2:手动创建Counter失效原因

  • 每次请求时新建Counter实例,虽Micrometer会复用同名指标,但代码位置错误(如方法内每次创建)可能导致计数逻辑异常
  • 未正确注入MeterRegistry,或未确保Counter实例全局复用

正确解决方案

方案1:修复@Counted注解用法

  1. 确保引入AOP依赖(若未添加)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 在配置类开启AspectJ代理
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
}
  1. 正确使用@Counted注解(确保方法被外部调用)
@Counted(
    value = "get_movies_of_director",
    description = "获取导演电影列表接口总访问次数",
    extraTags = {"endpoint", "/movies/director"}
)
@GetMapping("/movies/director")
public ResponseEntity<List<Movie>> getMoviesOfDirector(...) {
    // 业务逻辑
    return ResponseEntity.ok(...);
}

方案2:全局复用Counter实例

  1. 构造注入MeterRegistry,在类初始化时创建Counter
@RestController
public class MovieController {
    private final Counter getMoviesCounter;

    // 构造注入MeterRegistry
    public MovieController(MeterRegistry meterRegistry) {
        this.getMoviesCounter = Counter.builder("get_movies_of_director")
                .description("获取导演电影列表接口总访问次数")
                .register(meterRegistry);
    }

    @GetMapping("/movies/director")
    public ResponseEntity<List<Movie>> getMoviesOfDirector(...) {
        getMoviesCounter.increment();
        // 业务逻辑
        return ResponseEntity.ok(...);
    }
}

方案3:使用Actuator默认请求指标(最简便)

无需手动编码,利用Spring Boot Actuator自带的请求统计:

  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.yml暴露Prometheus端点
management:
  endpoints:
    web:
      exposure:
        include: prometheus
  metrics:
    tags:
      application: your-app-name # 自定义应用标签,方便多实例区分
    web:
      server:
        request:
          autotime:
            enabled: true # 自动统计请求耗时
  1. 在Prometheus中查询指标:
    使用http_server_requests_total{uri="/movies/director"}即可获取该接口的总访问量

验证步骤

  1. 多次调用目标API
  2. 访问http://localhost:8080/actuator/prometheus,确认能看到对应指标
  3. 检查Prometheus配置文件(prometheus.yml)是否正确抓取Actuator端点:
scrape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']
  1. 重启Prometheus后,在UI(http://localhost:9090/)中查询指标即可看到统计数据

内容的提问来源于stack exchange,提问作者astar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:43:12