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注解用法
- 确保引入AOP依赖(若未添加)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
- 在配置类开启AspectJ代理
@Configuration @EnableAspectJAutoProxy public class AopConfig { }
- 正确使用@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实例
- 构造注入
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自带的请求统计:
- 确保依赖齐全
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
- 配置application.yml暴露Prometheus端点
management: endpoints: web: exposure: include: prometheus metrics: tags: application: your-app-name # 自定义应用标签,方便多实例区分 web: server: request: autotime: enabled: true # 自动统计请求耗时
- 在Prometheus中查询指标:
使用http_server_requests_total{uri="/movies/director"}即可获取该接口的总访问量
验证步骤
- 多次调用目标API
- 访问
http://localhost:8080/actuator/prometheus,确认能看到对应指标 - 检查Prometheus配置文件(prometheus.yml)是否正确抓取Actuator端点:
scrape_configs: - job_name: 'spring-boot-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080']
- 重启Prometheus后,在UI(http://localhost:9090/)中查询指标即可看到统计数据
内容的提问来源于stack exchange,提问作者astar
相关产品推荐
相关产品推荐

