动态创建WebClient后Spring Prometheus部分指标消失问题
从你的描述和代码包来看,问题出在自定义WebClient.Builder的配置类与Micrometer JVM指标自动配置的加载顺序或Bean依赖冲突,具体可能是以下情况之一:
WebClient自动配置被覆盖导致Micrometer关联Bean未初始化
Spring Boot的WebClientAutoConfiguration会自动配置默认的WebClient.Builder,并关联Micrometer的MetricsWebClientCustomizer等Bean。当你通过WebClientInstanceBuilderAutoConfiguration自定义WebClient.Builder的Bean时,WebClientAutoConfiguration会因@ConditionalOnMissingBean注解被跳过加载。虽然这本身不影响JVM指标,但如果你的自定义配置类中未正确引入所有必要的WebClient自定义器,可能间接导致Micrometer的全局指标注册逻辑未被触发。EnvironmentPostProcessor的属性加载顺序问题
你通过EnvironmentPostProcessor加载actuator-default.properties,如果该配置文件中包含management.metrics.enable.jvm=true这类关键配置,但在application.properties中因WebClient相关配置的存在,导致属性源优先级变化,使得该配置未被正确生效。或者你的EnvironmentPostProcessor实现中,将属性源添加到了较低优先级的位置(比如addLast),被其他属性覆盖。Bean初始化顺序导致JVM指标未注册
自定义WebClient.Builder的Bean初始化过早,导致Micrometer的JvmMetricsBean还未完成注册,而后续的指标收集逻辑因依赖缺失未触发。
针对上述可能的原因,按以下步骤排查和修复:
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

