Micrometer指标异常:仅部分指标在Prometheus中显示
问题根源和解决办法
遇到的问题
- 调试时能看到
EXEC_TIME计时器有数值,但Prometheus里找不到这个指标 SUCCESSFUL_REQUEST和FAILURE_REQUEST计数器,只有部分端点的指标能正常显示,剩下的完全看不到
逐个解决
1. EXEC_TIME指标在Prometheus不显示的问题
Prometheus对接Micrometer时,Timer类型的指标会自动生成_seconds_count、_seconds_sum这类衍生指标,不是直接显示原名称的指标。另外还有几种可能:
Metrics.EXEC_TIME的命名不符合Prometheus规范(仅允许字母、数字、下划线、冒号,且必须以字母开头)- Timer的创建方式不规范,导致Micrometer未正确注册指标
- Spring Boot的Prometheus端点未启用
修复操作:
- 先把
Metrics.EXEC_TIME改成符合规范的名字,比如endpoint_exec_time - 换用
Timer.builder()的方式创建Timer,注册逻辑更清晰:
public static <T> T meterEndpoint(MeterRegistry meterRegistry, Tags tags, Supplier<T> t) { return Timer.builder(Metrics.EXEC_TIME) .tags(tags) .register(meterRegistry) .record(() -> { try { T response = t.get(); meterRegistry.counter(Metrics.SUCCESSFUL_REQUEST, tags).increment(); return response; } catch (Exception ex) { log.error("Failed executing request with tags {}", tags, ex); Tags failureTags = tags.and("errorName", ex.getClass().getSimpleName()); meterRegistry.counter(Metrics.FAILURE_REQUEST, failureTags).increment(); throw ex; } }); }
- 检查配置文件,确保
management.endpoints.web.exposure.include=prometheus已经配置,且Actuator依赖正常引入
2. 计数器仅部分端点显示的问题
这里有两个核心问题:
- Micrometer的Tags是不可变对象:代码里
tags.and("errorName", ...)仅返回新的Tags实例,原tags对象不会被修改,导致异常请求的标签未生效;若多个请求复用同一tags对象,还会出现标签混乱 - 标签基数超限:如果
customer标签的取值过多(比如每个用户对应一个值),Prometheus默认会限制标签基数,超过阈值的指标会被直接丢弃
修复操作:
- 修正异常分支的标签处理逻辑,必须使用新的Tags实例:
catch (Exception ex) { log.error("Failed executing request with tags {}", tags, ex); // 生成新的Tags实例,避免修改原对象 Tags failureTags = tags.and("errorName", ex.getClass().getSimpleName()); meterRegistry.counter(Metrics.FAILURE_REQUEST, failureTags).increment(); throw ex; }
- 检查Prometheus配置,若存在
limit_labels这类限制标签基数的参数,可调整阈值,或对customer标签做降基数处理(比如合并高频值、过滤无效值) - 核对所有端点的
endpoint标签值,避免拼写错误(比如把update写成updat)导致指标分散无法识别
验证步骤
- 调用所有端点后,直接访问
/actuator/prometheus,搜索对应指标名确认是否存在 - 确保使用最新版的
micrometer-registry-prometheus依赖,避免版本兼容问题 - 查看应用日志,确认没有Micrometer或Prometheus提示丢弃指标的警告信息
内容的提问来源于stack exchange,提问作者Adam G
相关产品推荐
相关产品推荐

