How can Spring Boot's auto-configured PoolingHttpClientConnectionManager be binded to Micrometer while maintaining as much of Spring Boot's auto-configuration as possible?
Spring Boot auto-configures PoolingHttpClientConnectionManager as part of RestTemplateBuilder when httpclient5 is on the class path.
As seen here:
private static HttpClient createHttpClient(Duration readTimeout, SslBundle sslBundle) {
// [ truncated extra code ]
PoolingHttpClientConnectionManager connectionManager = connectionManagerBuilder
.useSystemProperties()
.build();
return HttpClientBuilder
.create()
.useSystemProperties()
.setConnectionManager(connectionManager)
.build();
}
I have not been able to get a hold of this PoolingHttpClientConnectionManager object to apply Micrometer's binder:
new PoolingHttpClientConnectionManagerMetricsBinder(connectionManager, "myPool")
.bindTo(registry);
I was hoping to somehow get access to the connectionManager object. I have a crude example working, using Reflection, but I was trying to find something more stable:
@Bean
public RestTemplateCustomizer myRestTemplateCustomizer(MeterRegistry meterRegistry) {
return restTemplate -> {
if(!(restTemplate.getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory)) {
return;
}
HttpClient httpClient =
((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory())
.getHttpClient();
Field field = httpClient.getClass().getDeclaredField("connManager");
field.setAccessible(true);
PoolingHttpClientConnectionManager manager =
(PoolingHttpClientConnectionManager) field.get(httpClient);
new PoolingHttpClientConnectionManagerMetricsBinder(manager, manager.toString())
.bindTo(meterRegistry);
};
}