-
Notifications
You must be signed in to change notification settings - Fork 41.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support Monitoring of HttpClient with HttpComponentsClientHttpRequestFactoryBuilder #44643
Comments
You can configure your own @Configuration(proxyBeanMethods = false)
public class ClientHttpConfiguration {
@Bean
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
return PoolingHttpClientConnectionManagerBuilder.create().useSystemProperties().build();
}
@Bean
ClientHttpRequestFactoryBuilder<?> httpComponentsClientHttpRequestFactoryBuilder(
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager) {
return ClientHttpRequestFactoryBuilder.httpComponents()
.withHttpClientCustomizer(
(builder) -> builder.setConnectionManager(poolingHttpClientConnectionManager)
.setConnectionManagerShared(true));
}
@Bean
MeterBinder poolingHttpClientConnectionManagerMetricsBinder(
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager) {
return new PoolingHttpClientConnectionManagerMetricsBinder(poolingHttpClientConnectionManager,
"httpComponents.pool");
}
}
Unfortunately, you'll need to manually configure all the settings for |
The above code configures a shared @Configuration(proxyBeanMethods = false)
class ClientHttpConfiguration {
private final AtomicInteger connectionPoolCounter = new AtomicInteger();
private final MeterRegistry meterRegistry;
ClientHttpConfiguration(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@Bean
ClientHttpRequestFactoryBuilder<?> clientHttpRequestFactoryBuilder() {
return ClientHttpRequestFactoryBuilder.httpComponents()
.withHttpClientCustomizer(
(builder) -> builder.setConnectionManager(getPoolingHttpClientConnectionManager()));
}
private PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.useSystemProperties()
.build();
new PoolingHttpClientConnectionManagerMetricsBinder(connectionManager,
"pool-" + this.connectionPoolCounter.incrementAndGet()).bindTo(this.meterRegistry);
return connectionManager;
}
}
|
I am curious if the public HttpComponentsClientHttpRequestFactoryBuilder withConnectionManagerPostConfigurer(
Consumer<PoolingHttpClientConnectionManager> connectionManagerPostConfigurer) {
...
} In that case, it would be possible to have something like this: @Configuration(proxyBeanMethods = false)
class ClientHttpConfiguration {
private final AtomicInteger counter = new AtomicInteger();
private final MeterRegistry meterRegistry;
ClientHttpConfiguration(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@Bean
ClientHttpRequestFactoryBuilder<?> clientHttpRequestFactoryBuilder() {
return ClientHttpRequestFactoryBuilder.httpComponents()
.withConnectionManagerPostConfigurer(this::bindToMeterRegistry);
}
private void bindToMeterRegistry(PoolingHttpClientConnectionManager connectionManager) {
new PoolingHttpClientConnectionManagerMetricsBinder(connectionManager, "pool-" + this.counter.getAndIncrement())
.bindTo(this.meterRegistry);
}
}
I’ve prototyped some changes: main...nosan:spring-boot:44643 This solution will not work if someone overrides ClientHttpRequestFactoryBuilder.httpComponents()
.withHttpClientCustomizer(
(builder) -> builder.setConnectionManager(new PoolingHttpClientConnectionManager())); |
I am not sure about |
In Spring Boot 3.4 the HttpComponentsClientHttpRequestFactoryBuilder used by RestClient does not provide the capability to add monitoring to the HttpClient's connection pool using micrometers PoolingHttpClientConnectionManagerMetricsBinder. This leads to blindness for utilization of the underlying connection pool.
The text was updated successfully, but these errors were encountered: