禁用和替换默认DataSourceHealthIndicator

时间:2016-08-16 17:26:11

标签: java spring spring-boot health-monitoring spring-boot-actuator

我目前正在使用Spring Boot Actuator“health”端点实现的健康监控框架。 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"
}

我希望它返回更像这样的东西,其中“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来使用这个版本,但我不知道这是否可行。

1 个答案:

答案 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
    }
}