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

Prometheus Gauge值保留时长疑问:设置后未在Grafana显示

解决Micrometer Gauge指标在Grafana中不显示的问题

核心原因

Micrometer的Gauge默认是按需采集+依赖观测对象引用的,如果你只一次性设置值后再也不更新,大概率是因为后续Prometheus采集时,Gauge对应的观测对象被GC回收,或者没有触发采集逻辑,导致指标没被暴露。

具体解决方案

1. 改用持有的观测对象绑定Gauge

不要用Gauge.set()这类一次性设置的方法,而是定义一个全局持有类,保持对固定值的引用,让Micrometer每次采集都能拿到值:

// 定义全局持有类,保存应用启动信息
public static class AppMetricsHolder {
    private final long startupTimestamp;
    private final String gitCommitHash;

    public AppMetricsHolder(long startupTimestamp, String gitCommitHash) {
        this.startupTimestamp = startupTimestamp;
        this.gitCommitHash = gitCommitHash;
    }

    public long getStartupTimestamp() {
        return startupTimestamp;
    }

    public String getGitCommitHash() {
        return gitCommitHash;
    }
}

// 在ApplicationListener中初始化并绑定Gauge
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
    // 初始化持有类,填入实际的启动时间和Git提交信息
    AppMetricsHolder metricsHolder = new AppMetricsHolder(
        System.currentTimeMillis(),
        "a1b2c3d4..." // 实际Git提交哈希
    );

    MeterRegistry meterRegistry = event.getApplicationContext().getBean(MeterRegistry.class);

    // 绑定启动时间Gauge,添加业务标签
    Gauge.builder("application.startup.timestamp", metricsHolder, AppMetricsHolder::getStartupTimestamp)
        .tags("environment", "production", "app_name", "your-app")
        .register(meterRegistry);

    // Git提交信息建议用标签承载,Gauge值设为固定1(因为Gauge是数值型指标)
    Gauge.builder("application.git.commit", metricsHolder, h -> 1.0)
        .tags("commit_hash", metricsHolder.getGitCommitHash(), "environment", "production")
        .register(meterRegistry);
}

2. 先排查Prometheus采集是否正常

不要直接找Grafana,先访问应用的Prometheus端点(Spring Boot默认是/actuator/prometheus),搜索你定义的指标名:

  • 如果端点里找不到,说明是Micrometer配置问题,检查:
    • Spring Boot是否开启了端点暴露:management.endpoints.web.exposure.include=prometheus
    • MeterRegistry是否正确注入
  • 如果端点里能找到,再去Grafana刷新指标列表,或者检查Prometheus数据源的同步状态

3. 避免用Gauge存储字符串

Prometheus的Gauge是数值型指标,像Git提交哈希这类字符串,应该放到标签里,而不是Gauge的值中,这样既符合Prometheus的指标规范,也能正常被采集展示。

关键注意点

Micrometer的Gauge依赖对观测对象的强引用,只要持有类的实例不被GC回收,每次Prometheus采集时都会调用getter方法获取值,保证指标持续存在。一次性设置的Gauge因为没有持续引用,很容易被Micrometer的过期清理机制移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:05:18