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

动态创建WebClient后Spring Prometheus部分指标消失问题

问题原因分析

从你的描述和代码包来看,问题出在自定义WebClient.Builder的配置类与Micrometer JVM指标自动配置的加载顺序或Bean依赖冲突,具体可能是以下情况之一:

  1. WebClient自动配置被覆盖导致Micrometer关联Bean未初始化
    Spring Boot的WebClientAutoConfiguration会自动配置默认的WebClient.Builder,并关联Micrometer的MetricsWebClientCustomizer等Bean。当你通过WebClientInstanceBuilderAutoConfiguration自定义WebClient.Builder的Bean时,WebClientAutoConfiguration会因@ConditionalOnMissingBean注解被跳过加载。虽然这本身不影响JVM指标,但如果你的自定义配置类中未正确引入所有必要的WebClient自定义器,可能间接导致Micrometer的全局指标注册逻辑未被触发。

  2. EnvironmentPostProcessor的属性加载顺序问题
    你通过EnvironmentPostProcessor加载actuator-default.properties,如果该配置文件中包含management.metrics.enable.jvm=true这类关键配置,但在application.properties中因WebClient相关配置的存在,导致属性源优先级变化,使得该配置未被正确生效。或者你的EnvironmentPostProcessor实现中,将属性源添加到了较低优先级的位置(比如addLast),被其他属性覆盖。

  3. Bean初始化顺序导致JVM指标未注册
    自定义WebClient.Builder的Bean初始化过早,导致Micrometer的JvmMetrics Bean还未完成注册,而后续的指标收集逻辑因依赖缺失未触发。


解决方案

针对上述可能的原因,按以下步骤排查和修复:

1. 确保自定义WebClient.Builder应用所有WebClientCustomizer

修改WebClientInstanceBuilderAutoConfiguration中的WebClient.Builder Bean定义,注入所有WebClientCustomizer并应用,确保包括Micrometer的指标自定义器在内的所有配置都生效:

@Configuration
@EnableConfigurationProperties(XoApiConsumerProperties.class)
public class WebClientInstanceBuilderAutoConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "xoapi.consumer", name = "base-url")
    public WebClient.Builder xoApiWebClientBuilder(XoApiConsumerProperties properties, 
                                                   List<WebClientCustomizer> webClientCustomizers) {
        WebClient.Builder builder = WebClient.builder()
                .baseUrl(properties.getBaseUrl());
        
        // 应用所有WebClient自定义器,包括Metrics相关的
        webClientCustomizers.forEach(customizer -> customizer.customize(builder));
        
        return builder;
    }
}

2. 调整EnvironmentPostProcessor的属性源优先级

修改ActuatorDefaultPropertiesEnvironmentPostProcessor,将actuator-default.properties的属性源添加到较高优先级位置(比如addFirst),避免被其他配置覆盖:

public class ActuatorDefaultPropertiesEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Resource resource = new ClassPathResource("actuator-default.properties");
        Properties properties = new Properties();
        try {
            properties.load(resource.getInputStream());
            // 将属性源添加到前面,提高优先级
            environment.getPropertySources().addFirst(new PropertiesPropertySource("actuator-default", properties));
        } catch (IOException e) {
            throw new RuntimeException("Failed to load actuator default properties", e);
        }
    }
}

3. 确保Micrometer JVM指标自动配置被激活

检查pom.xml中是否包含micrometer-jvm依赖(Spring Boot 2.7.0默认应该包含,但确认一下):

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-jvm</artifactId>
    <version>1.9.3</version> <!-- 与Spring Boot 2.7.0匹配的版本 -->
</dependency>

同时,在actuator-default.properties中明确开启JVM指标:

management.metrics.enable.jvm=true
management.metrics.jvm.enabled=true

4. 调整Bean初始化顺序

在WebClientInstanceBuilderAutoConfiguration上添加@AutoConfigureAfter(JvmMetricsAutoConfiguration.class),确保JVM指标的Bean先被初始化:

@Configuration
@EnableConfigurationProperties(XoApiConsumerProperties.class)
@AutoConfigureAfter(JvmMetricsAutoConfiguration.class)
public class WebClientInstanceBuilderAutoConfiguration {
    // ... 原有代码
}

按照上述步骤修改后,重新打包运行应用,访问http://localhost:4242/actuator/prometheus应该就能看到完整的JVM指标了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:30:16