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

调用Gauge.inc()后Prometheus /metrics页面指标未更新求助

问题排查与解决

核心问题原因

你直接使用Prometheus原生的Gauge API创建指标并注册到PrometheusRegistry(通过registry.getPrometheusRegistry()),但Spring Boot整合的是Micrometer监控体系,PrometheusMeterRegistry是Micrometer对外的标准入口,直接操作底层原生Prometheus Registry会导致指标无法被Micrometer正确追踪和暴露。

另外还有两种可能的次要因素:

  • 你的Bean被多次实例化(比如作用域设为prototype),调用inc()的实例和初始化Gauge的实例不是同一个
  • 初始化Gauge时出现未捕获的异常(比如registry注入失败),导致Gauge实例为null,调用inc()无实际效果

解决方案

方案1:使用Micrometer标准API创建Gauge(推荐)

放弃原生Prometheus Gauge,改用Micrometer的API来创建和维护指标,这是Spring Boot监控的标准实践:

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class PaymentMetrics {

    private final AtomicInteger paymentsTriedCount = new AtomicInteger(0);
    private final AtomicInteger paymentsCreatedCount = new AtomicInteger(0);

    @Autowired
    private MeterRegistry meterRegistry;

    @PostConstruct
    public void initGauge() {
        // 绑定指标到原子变量,由Micrometer自动维护数值
        Gauge.builder("payments_tried", paymentsTriedCount, AtomicInteger::get)
                .description("How many payments was sent to PaymentServices to be created")
                .register(meterRegistry);

        Gauge.builder("payments_created", paymentsCreatedCount, AtomicInteger::get)
                .description("How many payments sent to PaymentServices were created")
                .register(meterRegistry);
    }

    // 业务方法中更新计数
    public void markPaymentTried() {
        paymentsTriedCount.incrementAndGet();
    }

    public void markPaymentCreated() {
        paymentsCreatedCount.incrementAndGet();
    }
}

方案2:若必须使用原生Prometheus API(不推荐)

如果一定要用原生Gauge,需要确保指标被Micrometer同步识别,或强制刷新采集逻辑:

@PostConstruct
public void initGauge() {
    paymentsTriedGauge = Gauge.build().name("payments_tried")
            .help("How many payments was sent to PaymentServices to be created")
            .register(registry.getPrometheusRegistry());

    paymentsCreated = Gauge.build().name("payments_created")
            .help("How many payments sent to PaymentServices were created")
            .register(registry.getPrometheusRegistry());
    
    // 强制触发Micrometer与原生Registry的指标同步
    registry.scrape();
}

额外排查步骤

  1. 检查Bean作用域:确保你的Metrics Bean是默认的singleton作用域(Spring默认配置),避免多次实例化导致指标实例不统一
  2. 日志验证:在initGauge()和调用inc()的方法中添加日志,确认Gauge实例不为null,且inc()确实被执行
  3. 依赖检查:确保spring-boot-starter-actuator和micrometer-registry-prometheus依赖正确引入,版本与Spring Boot版本匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:16