Commit 9483c91d authored by Stephane Nicoll's avatar Stephane Nicoll

Make sure to include validation query in case of failure

See gh-15055
parent 745ff883
...@@ -110,14 +110,18 @@ public class DataSourceHealthIndicator extends AbstractHealthIndicator ...@@ -110,14 +110,18 @@ public class DataSourceHealthIndicator extends AbstractHealthIndicator
builder.up().withDetail("database", product); builder.up().withDetail("database", product);
String validationQuery = getValidationQuery(product); String validationQuery = getValidationQuery(product);
if (StringUtils.hasText(validationQuery)) { if (StringUtils.hasText(validationQuery)) {
try {
// Avoid calling getObject as it breaks MySQL on Java 7 // Avoid calling getObject as it breaks MySQL on Java 7
List<Object> results = this.jdbcTemplate.query(validationQuery, List<Object> results = this.jdbcTemplate.query(validationQuery,
new SingleColumnRowMapper()); new SingleColumnRowMapper());
Object result = DataAccessUtils.requiredSingleResult(results); Object result = DataAccessUtils.requiredSingleResult(results);
builder.withDetail("result", result); builder.withDetail("result", result);
}
finally {
builder.withDetail("validationQuery", validationQuery); builder.withDetail("validationQuery", validationQuery);
} }
} }
}
private String getProduct() { private String getProduct() {
return this.jdbcTemplate.execute((ConnectionCallback<String>) this::getProduct); return this.jdbcTemplate.execute((ConnectionCallback<String>) this::getProduct);
......
...@@ -32,6 +32,7 @@ import org.springframework.jdbc.core.JdbcTemplate; ...@@ -32,6 +32,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
...@@ -41,6 +42,7 @@ import static org.mockito.Mockito.verify; ...@@ -41,6 +42,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link DataSourceHealthIndicator}. * Tests for {@link DataSourceHealthIndicator}.
* *
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
*/ */
public class DataSourceHealthIndicatorTests { public class DataSourceHealthIndicatorTests {
...@@ -64,41 +66,45 @@ public class DataSourceHealthIndicatorTests { ...@@ -64,41 +66,45 @@ public class DataSourceHealthIndicatorTests {
} }
@Test @Test
public void database() { public void healthIndicatorWithDefaultSettings() {
this.indicator.setDataSource(this.dataSource); this.indicator.setDataSource(this.dataSource);
Health health = this.indicator.health(); Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull(); assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails().get("result")).isNotNull(); assertThat(health.getDetails()).containsOnly(
assertThat(health.getDetails().get("validationQuery")) entry("database", "HSQL Database Engine"), entry("result", 1L),
.isEqualTo(DatabaseDriver.HSQLDB.getValidationQuery()); entry("validationQuery", DatabaseDriver.HSQLDB.getValidationQuery()));
} }
@Test @Test
public void customQuery() { public void healthIndicatorWithCustomValidationQuery() {
this.indicator.setDataSource(this.dataSource); String customValidationQuery = "SELECT COUNT(*) from FOO";
new JdbcTemplate(this.dataSource) new JdbcTemplate(this.dataSource)
.execute("CREATE TABLE FOO (id INTEGER IDENTITY PRIMARY KEY)"); .execute("CREATE TABLE FOO (id INTEGER IDENTITY PRIMARY KEY)");
String customValidationQuery = "SELECT COUNT(*) from FOO"; this.indicator.setDataSource(this.dataSource);
this.indicator.setQuery(customValidationQuery); this.indicator.setQuery(customValidationQuery);
Health health = this.indicator.health(); Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull();
assertThat(health.getStatus()).isEqualTo(Status.UP); assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails().get("result")).isNotNull(); assertThat(health.getDetails()).containsOnly(
assertThat(health.getDetails().get("validationQuery")) entry("database", "HSQL Database Engine"), entry("result", 0L),
.isEqualTo(customValidationQuery); entry("validationQuery", customValidationQuery));
} }
@Test @Test
public void error() { public void healthIndicatorWithInvalidValidationQuery() {
String invalidValidationQuery = "SELECT COUNT(*) from BAR";
this.indicator.setDataSource(this.dataSource); this.indicator.setDataSource(this.dataSource);
this.indicator.setQuery("SELECT COUNT(*) from BAR"); this.indicator.setQuery(invalidValidationQuery);
Health health = this.indicator.health(); Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull();
assertThat(health.getStatus()).isEqualTo(Status.DOWN); assertThat(health.getStatus()).isEqualTo(Status.DOWN);
assertThat(health.getDetails()).contains(
entry("database", "HSQL Database Engine"),
entry("validationQuery", invalidValidationQuery));
assertThat(health.getDetails()).containsOnlyKeys("database", "error",
"validationQuery");
} }
@Test @Test
public void connectionClosed() throws Exception { public void healthIndicatorCloseConnection() throws Exception {
DataSource dataSource = mock(DataSource.class); DataSource dataSource = mock(DataSource.class);
Connection connection = mock(Connection.class); Connection connection = mock(Connection.class);
given(connection.getMetaData()) given(connection.getMetaData())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment