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

Spring-kafka下GC或消费者重平衡时Kafka lag gauge指标被回收问题咨询

Kafka消费者Lag指标返回NaN问题解决方案

该问题是Micrometer Kafka指标模块的已知问题,大量使用Spring Cloud Stream集成spring-kafka的开发者都遇到过相同情况,核心原因是旧版本Micrometer对kafka消费者lag的Gauge指标使用弱引用持有,当发生GC或者消费者重平衡时,若没有其他强引用持有Gauge实例,指标就会被回收,监控端返回NaN,对依赖lag做自动扩缩容的业务影响很大。

可通过以下三种方案解决:

  • 方案1:升级Micrometer到官方修复版本
    这个是最稳妥的官方修复方案,Micrometer 1.8.0及以上版本已经调整了Kafka消费者lag指标的引用策略,默认使用强引用持有Gauge实例,只要消费者实例存活就不会被GC回收。你可以对应升级依赖版本:
    • Spring Boot 2.6.x及以上版本默认集成的Micrometer已经符合版本要求,直接升级Spring Boot即可
    • 若无法升级Spring Boot大版本,可以单独在pom.xml或build.gradle中指定Micrometer的版本为1.8.x+,注意要和当前Spring Boot版本做兼容校验
  • 方案2:手动强引用持有Lag指标实例
    若暂时无法升级依赖,可以通过自定义配置将lag指标实例存入全局强引用集合,避免被GC回收,代码示例如下:
    import io.micrometer.core.instrument.Gauge;
    import io.micrometer.core.instrument.MeterRegistry;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Configuration
    public class KafkaMetricsConfig {
        // 全局强引用集合,持有lag指标实例
        private static final List<Gauge> KAFKA_LAG_GAUGES = new ArrayList<>();
    
        @Bean
        public MeterRegistryCustomizer<MeterRegistry> kafkaLagMetricsHolder() {
            return registry -> registry.config().onMeterAdded(meter -> {
                if (meter.getId().getName().startsWith("kafka.consumer.lag")) {
                    KAFKA_LAG_GAUGES.add((Gauge) meter);
                }
            });
        }
    }
    
    该配置会监听所有指标的注册事件,将lag类型的Gauge存入全局静态集合,只要应用进程不停止,实例就不会被GC回收。
  • 方案3:配置MeterFilter修改引用策略
    你也可以通过MeterFilter直接修改lag指标的引用类型为强引用,示例配置如下:
    import io.micrometer.core.instrument.Meter;
    import io.micrometer.core.instrument.config.MeterFilter;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MetricsConfig {
        @Bean
        public MeterFilter kafkaLagStrongReferenceFilter() {
            return new MeterFilter() {
                @Override
                public Meter.Id map(Meter.Id id) {
                    if (id.getName().startsWith("kafka.consumer.lag")) {
                        return id.withStrongReference(true);
                    }
                    return id;
                }
            };
        }
    }
    

注意:消费者重平衡过程中lag指标出现短暂波动属于正常现象,只要重平衡完成后指标可以正常返回数值就不属于GC回收问题,以上方案仅解决指标被GC后持续返回NaN的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:39:03