Skip to content

Commit

Permalink
Fix connection pool timeouts unit (#7404)
Browse files Browse the repository at this point in the history
And add a test that actually verifies it
  • Loading branch information
Mateusz Rzeszutek committed Dec 13, 2022
1 parent d1c0b3d commit 9e5d962
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public BatchCallback batchCallback(
public LongCounter connectionTimeouts() {
return meter
.counterBuilder("db.client.connections.timeouts")
.setUnit("timeouts")
.setUnit("{timeouts}")
.setDescription(
"The number of connection timeouts that have occurred trying to obtain a connection from the pool.")
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

package io.opentelemetry.instrumentation.hikaricp;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchException;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
Expand Down Expand Up @@ -53,6 +55,8 @@ void shouldReportMetrics() throws SQLException, InterruptedException {
hikariDataSource.setDataSource(dataSourceMock);
configure(hikariDataSource, null);

cleanup.deferCleanup(hikariDataSource);

// when
Connection hikariConnection = hikariDataSource.getConnection();
TimeUnit.MILLISECONDS.sleep(100);
Expand Down Expand Up @@ -126,4 +130,38 @@ void shouldNotBreakCustomUserMetrics() throws SQLException, InterruptedException
verify(userMetricsMock, atLeastOnce()).recordConnectionAcquiredNanos(anyLong());
verify(userMetricsMock, atLeastOnce()).recordConnectionUsageMillis(anyLong());
}

@Test
void shouldReportTimeouts() throws SQLException {
// given
when(dataSourceMock.getConnection())
.then(
invocation -> {
TimeUnit.MILLISECONDS.sleep(2_000);
throw new SQLException("timed out!");
});

HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setPoolName("timingOutPool");
hikariDataSource.setDataSource(dataSourceMock);
hikariDataSource.setConnectionTimeout(250 /* millis */);
// start the pool without initializing connections
hikariDataSource.setInitializationFailTimeout(-1);
configure(hikariDataSource, null);

cleanup.deferCleanup(hikariDataSource);

// when
Exception thrown = catchException(hikariDataSource::getConnection);

// then
assertThat(thrown).isNotNull();

DbConnectionPoolMetricsAssertions.create(
testing(), "io.opentelemetry.hikaricp-3.0", "timingOutPool")
.disableMaxIdleConnections()
// the connection is not even acquired
.disableUseTime()
.assertConnectionPoolEmitsMetrics();
}
}

0 comments on commit 9e5d962

Please sign in to comment.