package com.mycompany.cevent.config.metrics;
import com.codahale.metrics.health.HealthCheck;
import com.mycompany.cevent.config.MetricsConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Metrics HealthCheck for the Database.
*/
@Configuration("database")
@AutoConfigureAfter(MetricsConfiguration.class)
public class DatabaseHealthCheck extends HealthCheck {
private final Logger log = LoggerFactory.getLogger(HealthCheck.class);
private static Map<String, String> queries = new HashMap<String, String>();
static {
queries.put("HSQL Database Engine",
"SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_USERS");
queries.put("Oracle", "SELECT 'Hello' from DUAL");
queries.put("Apache Derby", "SELECT 1 FROM SYSIBM.SYSDUMMY1");
queries.put("MySQL", "SELECT 1");
queries.put("PostgreSQL", "SELECT 1");
queries.put("Microsoft SQL Server", "SELECT 1");
}
private static String DEFAULT_QUERY = "SELECT 'Hello'";
private JdbcTemplate jdbcTemplate;
private String query = null;
@Inject
private DataSource dataSource;
public DatabaseHealthCheck() {
}
@PostConstruct
private void init() {
log.debug("Initializing Database Metrics healthcheck");
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Result check() {
try {
String dataBaseProductName = this.jdbcTemplate.execute(new ConnectionCallback<String>() {
@Override
public String doInConnection(Connection connection)
throws SQLException, DataAccessException {
return connection.getMetaData().getDatabaseProductName();
}
});
query = detectQuery(dataBaseProductName);
return Result.healthy(dataBaseProductName);
} catch (Exception e) {
log.debug("Cannot connect to Database: {}", e);
return Result.unhealthy("Cannot connect to Database : " + e.getMessage());
}
}
protected String detectQuery(String product) {
String query = this.query;
if (!StringUtils.hasText(query)) {
query = queries.get(product);
}
if (!StringUtils.hasText(query)) {
query = DEFAULT_QUERY;
}
return query;
}
}