【问题标题】:Consul Health indicator not showing in SpringBoot' actuator health endpointConsul Health 指示器未显示在 Spring Boot 的执行器健康端点中
【发布时间】:2020-08-21 07:43:42
【问题描述】:

我有一个基于 SpringBoot 的 Web 应用程序,它公开了一个 consul 健康指示器 bean。
bean 由 springboot 的自动配置正确创建和初始化,但是,尽管关联的配置属性“management.health.consul.enabled”设置为 true,但指标并未显示在执行器健康端点中:

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

经过进一步检查,我发现了负责获取所有可用指标的波纹管 sn-p (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) 调用的输出中,如下所示:

但是当我使用父应用程序上下文测试相同的调用时,我得到以下信息:

有人能解释一下为什么root context 中出现了这个特定的 bean,而child context 中却没有吗?

有没有办法强制它在子上下文中初始化,以便在健康端点中正确注册?

我附上了a sample project 允许重现问题。我还包含了应用程序使用的 consul 配置示例(您可以通过 consul import 命令导入它)。 运行上面的示例并转到健康端点(localhost:8080/monitoring/health),您会清楚地看到列表中缺少 consul 组件。

提前谢谢你。

【问题讨论】:

  • 其他执行器端点怎么样?他们工作正常吗?喜欢 /beans
  • @DineshDontha 是的,所有端点都工作正常(包括健康端点),这只是由于弹簧上下文层次结构问题而没有显示的领事健康指标的问题。

标签: java spring spring-boot spring-boot-actuator consul


【解决方案1】:

看起来,Consul 健康指标没有注册到健康贡献者注册表,您可以通过自己注册 consul 健康检查来解决这个问题。您可以在任何配置文件中添加这样的 sn-p。

@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"
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2019-08-05
    • 2021-11-06
    • 2019-11-12
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多