如何在Spring Boot中汇总健康指标

时间:2018-08-15 15:03:47

标签: java spring spring-boot health-monitoring

我已使用此Baeldung article为我的Spring 2.0.4应用程序添加了执行器支持。在4.4节中,它讨论了

  

健康指标的一项便利功能是我们可以将其汇总为层次结构的一部分

,但没有讨论如何进行此聚合。我也找不到关于如何执行此操作的任何文档。

问题 你们中有人知道创建这种聚合的教程,示例或其他文档吗?

更多信息 我的应用程序中有一个服务,该服务依赖于几个子组件。仅当所有这些子组件都关闭时,服务本身才被视为关闭。只要一个启动,服务就会启动。当前,如果子组件之一关闭,则使用常规HealthIndicator机制,它将服务器标记为关闭。

似乎我想使用CompositeHealthIndicator,但不清楚如何在没有系统拾取子健康指示符的情况下创建子健康指示符。 是每个这些子组件都使用@Scheduled批注,我的理解是,为了使该类正常工作,类必须使用@Component批注(或某些这样),这将导致它被创建并被应用程序健康吸收。

说明  我添加了执行器,运行状况URL如下显示:

  

{“状态”:“ UP”,“详细信息”:{“ MyServ1”:{“状态”:“ UP”,“详细信息”:{“延迟”:...}},“ MyServ2”:{ “ status”:“ UP”,“ details”:{“ Latency”:...}},“ diskSpace”:{“ status”:“ UP”,“ details”:{“ total”:...,“ free“:...,” threshold“:...}}}}

但是如果'MyServ1'或'MySrv2'处于关闭状态,则总体状态为关闭,但是我只希望在'diskSpace'处于关闭状态时发生这种情况 OR 'MyServ1'“ MyServ2”已关闭。

看来CompositeHealthIndicator是适合的班级,只是不清楚我如何为其创建儿童健康指标(只需使用new)?

预先感谢

4 个答案:

答案 0 :(得分:1)

通过实施org.springframework.boot.actuate.health.HealthAggregator将每个健康指标的状态汇总为一个整体状态。 Spring Boot自动配置OrderedHealthAggregator的实例。如果您提供自己的实现HealthAggregator的bean,则自动配置的聚合器将退出以支持自定义实现。

使用aggregate调用聚合器的Map<String, Status>方法,其中键是运行状况指示器的名称,值是它们的状态。了解子组件的运行状况指示器的名称应该可以让您对其进行自定义聚合。

答案 1 :(得分:1)

我想出了一个解决方案,我在GitHub上发布了一个简单的演示。我不知道这是否是执行此操作的正确方法,但它似乎正在起作用...

Example Spring Application

答案 2 :(得分:1)

我一直在努力解决这个问题,这是我的解决方案。 https://github.com/mohamed-taman/Spring-Actuator-health-aggregator

该演示基于旧的Spring版本的运行状况聚合方式和最新的Spring Boot版本2.3.0.M4。我基于新的API开发了新的想法,而推荐使用旧的不赞成使用的API。

它会给你这样的东西:

{
   "status":"DOWN",
   "components":{
      "Core System Microservices":{
         "status":"DOWN",
         "components":{
            "Product Service":{
               "status":"UP"
            },
            "Recommendation Service":{
               "status":"DOWN",
               "details":{
                  "error":"java.lang.IllegalStateException: Not working"
               }
            },
            "Review Service":{
               "status":"UP"
            }
         }
      },
      "diskSpace":{
         "status":"UP",
         "details":{
            "total":255382777856,
            "free":86618931200,
            "threshold":10485760,
            "exists":true
         }
      },
      "ping":{
         "status":"UP"
      }
   }
}

希望对您有帮助。

答案 3 :(得分:1)

嗯,Spring刚刚推出了一些奇怪的功能。这是您的用法!

使用新的“ ReactiveHealthIndicator”类扩展来构造几次健康检查。

@Component("myindicator1")
public class CriticalAppHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {

        return Mono.just(Health.up().build()); // obviously yours will do more..
    }
}

第二个:

@Component("myindicator2")
public class OptionalAppHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {

        return Mono.just(Health.outOfService().build()); // obviously yours will do more..
    }
}

现在,您可以添加分组。修改您的application.properties,或在本示例中的application.yml,以添加“ management.endpoint.health.group。{yourgroup} .include”键,并使用逗号分隔的bean名称。

management:
  endpoint:
    health:
      show-details: always
      # Include custom actuator grouping for any custom health checks with the "my-indicators" qualifier
      group:
        my-indicators:
          include: myindicator1,myindicator2

现在..这是有点奇怪的地方。现在,如果您达到了健康指标:

获取:{base} / health?detail = true

您的回复将如下所示:

{
  "status" : "DOWN",
  "components" : {
    "indicator2" : {
      "status" : "UP",
    },
    "indicator2" : {
      "status" : "DOWN",
    }
  },
  "groups" : [ "my-indicators" ]
}

实际上并没有像其他依赖项那样将两者组合在一起(例如:对于任何数据连接的spring-data hibernate分组,都是“ db”。)

但是您现在可以导航到:

获取:{base} / health / my-dicators

仅查看您已设置的分组。

如果您知道如何在父端点中进行分组,请发布-简单地/ health。

通过这种方式,我可以收集其设置,以便可以根据部署位置动态地进行分组。例如:Kubernetes。

我不理解为什么他们不在顶层应用分组,或者在不存在其他分组的情况下不提供将分组用作基础/运行状况级别的默认设置的原因。如果您使用的是邮递员或CURL,那么根本不方便多次发出查看组的请求。前端开发人员可能会花很多时间来制作可折叠的类别自定义前端,但是这也充满了问题,因为执行器端点没有足够强地键入其响应对象以使其无法与任何OpenAPI 3.0一起使用代码生成器,因此,今天,如果您想运行任何代码生成,则必须禁用执行器。

参考:

在我看来,Spring团队对于所有这些废话的文档都有些懒惰。