DataSourceHealthIndicator

DataSourceHealthIndicator

我目前正在使用通过Spring Boot Actuator“运行状况”端点实现的运行状况监视框架。 Actuator基础结构支持创建自定义运行状况检查,还提供了许多内置的运行状况检查。其中之一是DataSourceHealthIndicator

DataSourceHealthIndicatororg.springframework.boot.actuate.health包的一部分,当前我们的运行状况框架正在使用它来检查数据源的运行状况。我需要使用自己的DataSourceHealthIndicator略微修改的版本并禁用“默认”。

我尝试了建议使用herehere的解决方案,但是没有运气。我可能做错了什么?

谢谢!



编辑: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"
}


我希望它返回类似这样的内容,其中“结果”旁边的整数是数据库中存储过程返回的状态码:

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以使用此版本,但是我不知道这样做是否可行。

最佳答案

通常,我查看该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
    }
}

10-03 00:07