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:

https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/ClientHttpRequestFactories.java#L215

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);
    };
}
0

There are 0 best solutions below