当我尝试从配置文件(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
不确定
WebClient
是如何实例化的,但是,如果您依赖 WebClient.Builder
提供的
WebClientAutoConfiguration
bean,指标应该开箱即用。
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();
}
}
这种方法的优点是,您可以在工厂中添加更多横切逻辑(通用过滤器、超时设置等),使所有客户端“继承”相同的设置。