为什么我看不到 WebClient 的所有 Spring Prometheus 指标

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

当我尝试从配置文件(application.properties)动态创建 WebClient 时,一些 Prometheus 指标消失,例如 jvm 指标

我使用Spring Boot 2.7.0,jdk 17。

1/ 首先我加载有关执行器指标的配置 为此,我有一个 spring.factories,其中包含

org.springframework.boot.env.EnvironmentPostProcessor=re.test.pos.api.actuator.LoadActuatorDefaultProperties

在 LoadActuatorDefaultProperties 类中,我在环境中加载 acutator-default.properties 的内容,其中包含例如:


    management.server.port=4242
    management.endpoint.health.show-details=always
    management.endpoints.web.exposure.include=*

    management.endpoints.jmx.exposure.exclude=*
    spring.jmx.enabled=true

    management.endpoint.health.probes.enabled=true

2/ 第二次,我使用“re.test.pos.api.consumer.WebClientInstanceBuilderAutoConfiguration”来创建一个 WebClientInstanceBuilder,其配置包含在 application.properties 中,其中包含例如:

    xoapi.consumer.services.accountManagement.url=https://test.api:8443/test
    xoapi.consumer.services.accountManagement.headers[Content-Type]=application/json
    xoapi.consumer.services.accountManagement.headers[Accept-Language]=fr

我的目标是检索以 xoapi.consumer 开头的参数并将它们推送到 ConsumerProperties 类中。 之后,WebClientInstanceBuilderAutoConfiguration 类加载 ConsumerProperties 并使用此类命令实例化 WebClientInstanceBuilder 和 WebClient.Builder :

    return serviceBuilder.baseUrl(service.getUrl()).defaultHeaders(httpHeaders -> {
            service.getHeaders().forEach(httpHeaders::add);
        }).codecs( codecs -> {
            codecs.defaultCodecs().maxInMemorySize(this.maxInMemorySize.intValue());
        });

3/ 之后,当我在浏览器中尝试 URL http://localhost:4242/actuator/prometheus 时,我会看到下一个指标:


executor_active_threads{name="applicationTaskExecutor",} 0.0
executor_pool_size_threads{name="applicationTaskExecutor",} 0.0
tomcat_sessions_alive_max_seconds 0.0
tomcat_sessions_expired_sessions_total 0.0
tomcat_sessions_created_sessions_total 0.0
executor_queued_tasks{name="applicationTaskExecutor",} 0.0
executor_queue_remaining_tasks{name="applicationTaskExecutor",} 2.147483647E9
application_started_time_seconds{main_application_class="re.test.pos.api.PointsOfSaleApiApplication",} 9.399
tomcat_sessions_rejected_sessions_total 0.0
executor_completed_tasks_total{name="applicationTaskExecutor",} 0.0
tomcat_sessions_active_max_sessions 0.0
executor_pool_core_threads{name="applicationTaskExecutor",} 8.0
executor_pool_max_threads{name="applicationTaskExecutor",} 2.147483647E9
application_ready_time_seconds{main_application_class="re.test.pos.api.PointsOfSaleApiApplication",} 9.433
tomcat_sessions_active_current_sessions 0.0

4/ 在 application.properties 中,如果我添加注释:


#xoapi.consumer.services.accountManagement.url=https://test.api:8443/test
#xoapi.consumer.services.accountManagement.headers[Content-Type]=application/json
#xoapi.consumer.services.accountManagement.headers[Accept-Language]=fr

由于不再有任何用于创建 WebClient 的关联配置,因此 WebClientInstanceBuilderAutoConfiguration 类不再尝试实例化 WebClient。

在这种情况下,如果我在浏览器中尝试 URL http://localhost:4242/actuator/prometheus,我会看到很多指标,比上面的示例更多。例如,我看到 jvm 指标:


process_cpu_usage 0.1100376909902195
executor_pool_max_threads{name="applicationTaskExecutor",} 2.147483647E9
jvm_threads_live_threads 37.0
tomcat_sessions_rejected_sessions_total 0.0
jvm_threads_states_threads{state="runnable",} 10.0
jvm_threads_states_threads{state="blocked",} 0.0
jvm_threads_states_threads{state="waiting",} 22.0
jvm_threads_states_threads{state="timed-waiting",} 5.0
jvm_threads_states_threads{state="new",} 0.0
jvm_threads_states_threads{state="terminated",} 0.0
jvm_gc_memory_promoted_bytes_total 6495232.0
tomcat_sessions_alive_max_seconds 0.0
jvm_gc_memory_allocated_bytes_total 7.1303168E7
executor_pool_size_threads{name="applicationTaskExecutor",} 0.0
....

5/问题:

为什么我创建 WebClient 后看不到所有指标?

6/ 这是一个包含代码的 zip 文件 文字

解压存档并运行 mvn clean install 之后=>运行 java -jar target\pos-api-1.0.1.jar

java spring prometheus webclient metrics
1个回答
0
投票

不确定

WebClient
是如何实例化的,但是,如果您依赖
WebClient.Builder
 提供的 
WebClientAutoConfiguration
bean,指标应该开箱即用。

在 Spring Boot 2.7.x 内部,指标是使用

MetricsWebClientCustomizer
将过滤器函数 (
MetricsWebClientFilterFunction
) 附加到
WebClient.Builder
来初始化的。

您可以“镜像”此逻辑并向您的客户端显式添加相应的过滤器,但推荐使用

WebClient.Builder

一种可能的解决方案是创建工厂并使用它来实例化

WebClient

@Component
public class WebClientFactory {
    private final WebClient.Builder webClientBuilder;

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

    public WebClient get(String baseUrl) {
        // we need to clone builder otherwise filters will be accumulated from different clients
        return webClientBuilder.clone()
                .baseUrl(baseUrl)
                .build();
    }
}

这种方法的优点是,您可以在工厂中添加更多横切逻辑(通用过滤器、超时设置等),使所有客户端“继承”相同的设置。

© www.soinside.com 2019 - 2024. All rights reserved.