Consul Health指示器未在SpringBoot的执行器运行状况端点中显示

问题描述

我有一个基于SpringBoot的Web应用程序,它公开了领事健康指示符bean。
通过springboot的自动配置可以正确创建和初始化该Bean,但是尽管已将关联的配置属性“ management.health.consul.enabled”设置为true,该指示符仍未在执行器运行状况端点中显示

{
   "status": "UP","components": {
        "Kafka": {...},"SchemaRegistry": {...},"discoveryComposite": {...},"diskSpace": {...},"ping": {...},"refreshScope": {...}
    }
}

进一步检查后,我发现波纹管片段负责获取所有可用的指标(HealthEndpointConfiguration.java):

    @Bean
    @ConditionalOnMissingBean
    HealthContributorRegistry healthContributorRegistry(ApplicationContext applicationContext,HealthEndpointGroups groups) {
        Map<String,HealthContributor> healthContributors = new LinkedHashMap<>(
                applicationContext.getBeansOfType(HealthContributor.class));
        if (ClassUtils.isPresent("reactor.core.publisher.Flux",applicationContext.getClassLoader())) {
            healthContributors.putAll(new AdaptedReactiveHealthContributors(applicationContext).get());
        }
        return new AutoConfiguredHealthContributorRegistry(healthContributors,groups.getNames());
    }

在此处设置一个断点,我确实发现ConsulHealthindicator bean确实没有在 applicationContext.getBeansOfType(HealthContributor.class)调用输出中列出,如下所示:

enter image description here

但是当我用父应用程序上下文测试相同的调用时,得到以下内容

AnnotationConfigApplicationContext

有人可以阐明为什么root context中存在这种特定的豆而不是child context中存在这种豆的原因吗?

是否有一种方法可以强制在子上下文中对其进行初始化,以使其在运行状况端点中正确注册

我已附上a sample project,允许复制该问题。我还提供了应用程序使用的consul配置示例(您可以通过consul import命令将其导入)。 运行上面的示例并转到运行状况端点(localhost:8080 / monitoring / health),您将清楚地看到列表中缺少领事组件。

谢谢。

解决方法

看来,领事健康指示符尚未注册到健康贡献者注册表中,您可以通过自己注册领事健康检查来解决此问题。您可以在任何配置文件中添加这样的代码段。

@Autowired
  public void doRegister(
      ConsulHealthIndicator healthIndicator,HealthContributorRegistry healthContributorRegistry) {
    healthContributorRegistry.registerContributor("consul",healthIndicator);
  }

添加后,应该会产生类似的结果

{
  "status": "UP","components": {
    "consul": {
      "status": "UP","details": {
        "leader": "127.0.0.1:8300","services": {
          "consul": []
        }
      }
    },"discoveryComposite": {
      "description": "Discovery Client not initialized","status": "UNKNOWN","components": {
        "discoveryClient": {
          "description": "Discovery Client not initialized","status": "UNKNOWN"
        }
      }
    },"diskSpace": {
      "status": "UP","details": {
        "total": 250685575168,"free": 17967964160,"threshold": 10485760,"exists": true
      }
    },"ping": {
      "status": "UP"
    },"refreshScope": {
      "status": "UP"
    }
  }
}