我目前正在使用Spring Boot Actuator“health”端点实现的健康监控框架。 Actuator基础设施支持创建自定义健康检查,还提供许多内置健康检查;其中之一是DataSourceHealthIndicator
。
DataSourceHealthIndicator
是org.springframework.boot.actuate.health
包的一部分,我们的健康框架目前正在使用它来检查数据源的健康状况。我需要使用我自己的稍微修改过的DataSourceHealthIndicator
版本并禁用“默认”。
我尝试了here和here建议的解决方案,但没有运气。我能做错什么?
谢谢!
编辑:2016年8月18日,美国东部时间下午3:38
我已将我的bean重命名为dbHealthIndicator
并将以下内容添加到我的配置类中:
@Bean
public HealthIndicator dbHealthIndicator() {
return new dbHealthIndicator();
}
我现在遇到以下例外情况:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataAccessMapperFactory' defined in class path resource [udtContext.xml]
java.lang.RuntimeException: java.sql.SQLException: Unable to start the Universal Connection Pool: oracle.ucp.UniversalConnectionPoolException
编辑:2016年8月19日,美国东部时间上午9:22
这可能有助于展示我想要做的事情。目前,我的/health
端点返回的内容如下所示:
dataSource: {
status: "UP",
database: "mySql",
hello: "hello"
}
我希望它返回更像这样的东西,其中“result”旁边的整数是我的数据库中存储过程返回的状态代码:
dataSource: {
status: "UP",
database: "mySql",
hello: "hello",
result: 0
}
这是执行检查的DataSourceHealthIndicator.java
中的方法:
private void doDataSourceHealthCheck(Health.Builder builder) throws Exception {
String product = getProduct();
builder.up().withDetail("database", product);
String validationQuery = getValidationQuery(product);
if (StringUtils.hasText(validationQuery)) {
try {
// Avoid calling getObject as it breaks MySQL on Java 7
List<Object> results = this.jdbcTemplate.query(validationQuery,
new SingleColumnRowMapper());
Object result = DataAccessUtils.requiredSingleResult(results);
builder.withDetail("hello", result);
}
catch (Exception ex) {
builder.down(ex);
}
}
}
我需要在builder.withDetail("hello", result);
下为此方法添加八行代码,以执行对存储过程的调用。我不想“反编译”默认类,我无法覆盖此方法,因为它是私有的。我以为我可以在我自己的bean中复制DataSourceHealthIndicator.java
代码,添加我的代码,然后重新连接Spring来使用这个版本,但我不知道这是否可行。
答案 0 :(得分:1)
通常我会查看HealthIndicator
的配置。在这种情况下,它是HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration
。正如第一个相关的建议所述。您需要为自定义bean命名dbHealthIndicator
,以便@ConditionalOnMissingBean(name = "dbHealthIndicator")
不允许默认注册。
提供一些启动日志或不适合您的详细信息可以帮助人们排除故障。
以下是我如何使用它的示例:
@SpringBootApplication
public class StackoverflowWebmvcSandboxApplication {
@Bean
public HealthIndicator dbHealthIndicator() {
return new HealthIndicator() {
@Override
public Health health() {
return Health.status(Status.UP).withDetail("hello", "hi").build();
}
};
}
public static void main(String[] args) {
SpringApplication.run(StackoverflowWebmvcSandboxApplication.class, args);
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
}
然后返回/health
端点:
{
"status": "UP",
"db": {
"status": "UP",
"hello": "hi"
},
"diskSpace": {
"status": "UP",
"total": 127927316480,
"free": 17191956480,
"threshold": 10485760
}
}