BeanDefinitionRegistryPostProcessor 实现隐藏了 prometheus 系统和 jvm 指标

问题描述 投票:0回答:1

我正在使用一个实现 BeanDefinitionRegistryPostProcessor 的类,以便我可以使用 postProcessBeanDefinitionRegistry 方法实例化 WebClient 类型 bean,将它们添加到注册表中,然后通过其他类中的 Autowired 和 Qualifier(nameBean) 使用它们。

一切正常,除了在普罗米修斯指标中我没有看到任何 jvm 或系统类型指标。

我有一个通过 re.test.pos.api.consumer.WebClientInstanceBuilderAutoConfiguration 从 META-INF/spring 调用的类。 该类调用 WebClientInstanceBuilder 类:

@Configuration
@EnableConfigurationProperties({ ConsumerProperties.class })
@ConditionalOnClass(WebClient.class)
@ConditionalOnBean(WebClient.Builder.class)
public class WebClientInstanceBuilderAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public WebClientInstanceBuilder webClientInstanceBuilder(Environment environment,
            WebClient.Builder webClientBuilder) {

        WebClientInstanceBuilder webClientInstanceBuilder = new WebClientInstanceBuilder(webClientBuilder);

        return webClientInstanceBuilder;
    }
}

我有一个WebClientInstanceBuilder类,它实现了BeanDefinitionRegistryPostProcessor,它的目标是在postProcessBeanDefinitionRegistry方法中实例化bean

public class WebClientInstanceBuilder implements BeanDefinitionRegistryPostProcessor {

    ConsumerProperties consumerProperties;
    WebClient.Builder webClientBuilder;

    public WebClientInstanceBuilder(WebClient.Builder webClientBuilder) {
        this.webClientBuilder   = webClientBuilder;
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

            String beanKey = "accountManagementWebClient";

            WebClient client = webClientBuilder.clone().baseUrl("https://test.api:8443/test")
                    .codecs( codecs -> {codecs.defaultCodecs();})
                    .build();

            GenericBeanDefinition definition = new GenericBeanDefinition();
            definition.setBeanClass(WebClient.class);
            definition.setInstanceSupplier(() -> client);
            registry.registerBeanDefinition(beanKey, definition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }

}

我有一个使用 bean accountManagementWebClient 的类

@Component
public class AccountManager {
    @Autowired
    @Qualifier("accountManagementWebClient")
    private WebClient accountWebClient;

    public String getAccountByBillingAccountId(String billingAccountId, String tumUserId) {

        WebClient theAccountWebClient = accountWebClient;

        try {
            return null;
        } catch (Exception ex) {
            throw ex;
        }

    }
}

除了普罗米修斯指标之外,一切都很好。 当我查看普罗米修斯指标时,我没有看到 JMV 指标。 我的 application.properties 我有:

management.server.port=4242
management.endpoints.web.exposure.include=*
management.metrics.enable.all=true

如果我删除 BeanDefinitionRegistryPostProcessor 的实现并继续使用另一个解决方案创建 WebClient Bean,我可以看到 Prometheus 的所有指标以及 jvm 和系统指标。 但在这种情况下,我在使用 @Autowired 检索 Bean 时遇到问题,因为不幸的是,一旦我删除 BeanDefinitionRegistryPostProcessor 的实现,Autowired 就会在实例化我的 bean 之前执行。

我尝试了很多事情但没有成功。

非常感谢

java spring spring-boot prometheus metrics
1个回答
0
投票

您不应该使用

BeanDefinitionRegistryPostProcessor
自定义 WebClient,而是可以这样做:

@Bean
WebClient accountWebClient(WebClient.Builder builder) {
    return builder.baseUrl("https://httpbin.org/get").build();
}
© www.soinside.com 2019 - 2024. All rights reserved.