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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:46:13