Skip to content

Commit 6788dbc

Browse files
authored
Merge pull request #2124 from ClickHouse/v2_micrometer_pool_metrics_not_updated
[client-v2] Fixed cleaning expired connections from the pool
2 parents 93dfb96 + b1c6d3e commit 6788dbc

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java

+7
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.hc.core5.io.CloseMode;
5050
import org.apache.hc.core5.io.IOCallback;
5151
import org.apache.hc.core5.net.URIBuilder;
52+
import org.apache.hc.core5.pool.ConnPoolControl;
5253
import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
5354
import org.apache.hc.core5.pool.PoolReusePolicy;
5455
import org.apache.hc.core5.util.TimeValue;
@@ -100,6 +101,9 @@ public class HttpAPIClientHelper {
100101

101102
private String defaultUserAgent;
102103
private Object metricsRegistry;
104+
105+
ConnPoolControl<?> poolControl;
106+
103107
public HttpAPIClientHelper(Map<String, String> configuration, Object metricsRegistry, boolean initSslContext) {
104108
this.chConfiguration = configuration;
105109
this.metricsRegistry = metricsRegistry;
@@ -226,6 +230,7 @@ private HttpClientConnectionManager poolConnectionManager(LayeredConnectionSocke
226230
connMgrBuilder.setSSLSocketFactory(sslConnectionSocketFactory);
227231
connMgrBuilder.setDefaultSocketConfig(socketConfig);
228232
PoolingHttpClientConnectionManager phccm = connMgrBuilder.build();
233+
poolControl = phccm;
229234
if (metricsRegistry != null ) {
230235
try {
231236
String mGroupName = chConfiguration.getOrDefault(ClientConfigProperties.METRICS_GROUP_NAME.getKey(),
@@ -365,6 +370,8 @@ public Exception readError(ClassicHttpResponse httpResponse) {
365370

366371
public ClassicHttpResponse executeRequest(ClickHouseNode server, Map<String, Object> requestConfig,
367372
IOCallback<OutputStream> writeCallback) throws IOException {
373+
poolControl.closeExpired();
374+
368375
if (requestConfig == null) {
369376
requestConfig = Collections.emptyMap();
370377
}

client-v2/src/test/java/com/clickhouse/client/metrics/MetricsTest.java

+40-12
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,17 @@
1818
import org.testng.annotations.BeforeMethod;
1919
import org.testng.annotations.Test;
2020

21+
import java.time.temporal.ChronoUnit;
22+
import java.util.concurrent.ExecutorService;
23+
import java.util.concurrent.Executors;
24+
import java.util.concurrent.TimeUnit;
25+
2126
import static org.testng.Assert.assertEquals;
27+
import static org.testng.Assert.fail;
2228

2329
public class MetricsTest extends BaseIntegrationTest {
2430
private MeterRegistry meterRegistry;
31+
2532
@BeforeMethod(groups = {"integration"})
2633
void setUp() {
2734
meterRegistry = new SimpleMeterRegistry();
@@ -33,8 +40,8 @@ void tearDown() {
3340
meterRegistry.clear();
3441
Metrics.globalRegistry.clear();
3542
}
36-
37-
@Test(groups = { "integration" }, enabled = true)
43+
44+
@Test(groups = {"integration"}, enabled = true)
3845
public void testRegisterMetrics() throws Exception {
3946
ClickHouseNode node = getServer(ClickHouseProtocol.HTTP);
4047
boolean isSecure = isCloud();
@@ -54,18 +61,39 @@ public void testRegisterMetrics() throws Exception {
5461
Gauge available = meterRegistry.get("httpcomponents.httpclient.pool.total.connections").tags("state", "available").gauge();
5562
Gauge leased = meterRegistry.get("httpcomponents.httpclient.pool.total.connections").tags("state", "leased").gauge();
5663

57-
System.out.println("totalMax:" + totalMax.value() + ", available: " + available.value() + ", leased: " + leased.value());
58-
Assert.assertEquals((int)totalMax.value(), Integer.parseInt(ClientConfigProperties.HTTP_MAX_OPEN_CONNECTIONS.getDefaultValue()));
59-
Assert.assertEquals((int)available.value(), 1);
60-
Assert.assertEquals((int)leased.value(), 0);
64+
Assert.assertEquals((int) totalMax.value(), Integer.parseInt(ClientConfigProperties.HTTP_MAX_OPEN_CONNECTIONS.getDefaultValue()));
65+
Assert.assertEquals((int) available.value(), 1);
66+
Assert.assertEquals((int) leased.value(), 0);
67+
68+
Runnable task = () -> {
69+
try (QueryResponse response = client.query("SELECT 1").get()) {
70+
Assert.assertEquals((int) available.value(), 0);
71+
Assert.assertEquals((int) leased.value(), 1);
72+
} catch (Exception e) {
73+
e.printStackTrace();
74+
fail("Failed to to request", e);
75+
}
76+
};
77+
78+
ExecutorService executor = Executors.newFixedThreadPool(3);
79+
executor.submit(task);
80+
executor.submit(task);
81+
executor.shutdown();
82+
executor.awaitTermination(10, TimeUnit.SECONDS);
83+
84+
Assert.assertEquals((int) available.value(), 2);
85+
Assert.assertEquals((int) leased.value(), 0);
86+
87+
Thread.sleep(15_000);
88+
89+
Assert.assertEquals((int) available.value(), 2);
90+
Assert.assertEquals((int) leased.value(), 0);
91+
92+
task.run();
6193

62-
try (QueryResponse response = client.query("SELECT 1").get()) {
63-
Assert.assertEquals((int)available.value(), 0);
64-
Assert.assertEquals((int)leased.value(), 1);
65-
}
94+
Assert.assertEquals((int) available.value(), 1);
95+
Assert.assertEquals((int) leased.value(), 0);
6696

67-
Assert.assertEquals((int)available.value(), 1);
68-
Assert.assertEquals((int)leased.value(), 0);
6997
}
7098
// currently there are only 5 metrics that are monitored by micrometer (out of the box)
7199
assertEquals(meterRegistry.getMeters().size(), 5);

0 commit comments

Comments
 (0)