当前位置: 首页 > 知识库问答 >
问题:

带嵌套指示器的Spring启动执行器健康组

金慈
2023-03-14

我正在尝试配置执行器的健康探测器,以包括对嵌套在第一级之外的外部服务的检查。例如,当调用/执行器/健康时,以下是可用的健康指标:

json prettyprint-override">    {
       "status":"DOWN",
       "components":{
          "jms":{
             "status":"DOWN",
             "components":{
                "broker1":{
                   "status":"DOWN",
                   "details":{
                      "error":"javax.jms.JMSException: Failed to create session factory"
                   }
                },
                "broker2":{
                   "status":"UP",
                   "details":{
                      "provider":"ActiveMQ"
                   }
                }
             }
          },
          "livenessState":{
             "status":"UP"
          },
          "readinessState":{
             "status":"UP"
          }
       },
       "groups":[
          "liveness",
          "readiness"
       ]
    }

在jms组件下,有两个代理——broker1和broker2。我可以将执行器配置为将jms包括在就绪组中,如:

  endpoint:
    health:
      probes:
        enabled: true
      enabled: true
      show-details: always
      group:
        readiness:
          include: readinessState, jms

但是,这将包括准备调查中的所有经纪人。

当呼叫 /actuator/health/readiness,我得到:

{
   "status":"DOWN",
   "components":{
      "jms":{
         "status":"DOWN",
         "components":{
            "broker1":{
               "status":"DOWN",
               "details":{
                  "error":"javax.jms.JMSException: Failed to create session factory"
               }
            },
            "broker2":{
               "status":"UP",
               "details":{
                  "provider":"ActiveMQ"
               }
            }
         }
      },
      "readinessState":{
         "status":"UP"
      }
   }
}

由于Kubernetes中的就绪性探测只会阻止将web请求路由到我的pod,因此我可以在broker1关闭的情况下处理请求,只要broker2打开。有没有办法将执行器配置为在健康组中包括嵌套的健康指标,而不仅仅是根健康指标?我尝试了broker1、jms等组合。broker1,jms/broker1,jms\broker1无效。

如果没有通过配置直接支持,是否可以创建一个自定义组件来提供所需的行为。例如,我考虑过编写自定义CompositeHealthContributor的可能性,但我不确定是否可以聚合现有的健康指标。我不想重复已经进行的健康检查。

另一个相关用例是,只要一组外部资源中有一个可用,就认为服务是健康的。例如,我在两个数据中心有一个相同的代理。只要有一个经纪人,我的服务就可以被认为是健康的。对于这个用例,什么是好的方法?

共有1个答案

宗晟
2023-03-14

我相信,只要将嵌套指示器作为健康对象公开,就会得到预期的结果:

@Component
public class CustomHealthIndicator implements ReactiveHealthIndicator {

    private final List<CustomContributor> customContributors;

    public CustomHealthIndicator(List<CustomContributor> customContributors) {
        Assert.notNull(customContributors, "At least one contributor must be available");
        this.customContributors = customContributors;
    }

    @Override
    public Mono<Health> health() {
        return checkServices()
            .onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()));
    }

    private Mono<Health> checkServices() {
        return Mono.fromSupplier(() -> {
            final Builder builder = new Builder();
            AtomicBoolean partial = new AtomicBoolean();
            this.customContributors.parallelStream()
                .forEach(customContributor -> {
                    final Object status = customContributor.getStatus();
                    final boolean isAnErrorState = status instanceof Throwable;
                    partial.set(partial.get() || isAnErrorState);

                    if(isAnErrorState){
                        builder.withDetail(customContributor.getName(), new Builder().down().withException((Throwable) status).build());
                    } else {
                        builder.withDetail(customContributor.getName(), new Builder().up().withDetail("serviceDetail", status).build());
                    }
                });
            builder.status(partial.get() ? Status.DOWN : Status.UP);
            return
                builder.build();
        });
    }
}
 类似资料:
  • 我们已经在几个项目中使用了Spring Boot,现在我们使用的是最新版本1.2.3。我们正在合并执行器。到目前为止,一切都很顺利,只是我们发现/health指示器[default]显示服务已关闭。事实并非如此。这些服务是通过数据源实现的。它可以调用其他SOAP或Rest服务。卫生服务部门在看什么来衡量一项服务是否下降?

  • 您可以将许多自定义运行状况指示器添加到Spring boot的执行器中,这非常棒,因为它们的总状态被认为是您的应用程序的运行状况。 有没有可能只查询其中一个指标呢? 对于一个复杂的应用程序,我有大约10个指示器来告诉我的应用程序总体运行状况,整个检查大约需要20秒。 有一些指标我想更频繁地点击,因为它们提供了对高吞吐量组件的快速响应。有可能以某种方式查询单个指标吗?

  • 我们正在尝试healthcheck一个Spring Boot应用程序,我们正在计划使用Spring Boot执行器health来获得健康状态。 令人困惑的是,当CassandraHealthIndicator、DiskSpaceHealthIndicator、DataSourceHealthIndicator、ElasticsearchHealthIndicator、JmsHealthIndica

  • 因此,我将Spring引导执行器添加到我的应用程序中,并在应用程序中指定。属性管理。endpoint。健康隐藏物生存时间=120秒,以缓存健康检查结果。因此,当我调用执行器/健康时,结果被缓存,效果很好。 当我调用执行器/健康/就绪或自定义创建的组时,问题开始出现。该请求结果不会被缓存。我查阅了Spring文档,只找到了主要健康终点的信息,没有找到特定人群的信息。 所以我的问题是:我错过了什么吗?

  • 我有一个基于SpringBoot的web应用程序,它公开了一个Consult health indicator bean。 该bean由SpringBoot的autoconfiguration正确创建和初始化,但是,尽管关联的配置属性“Management.health.consul.Enabled”设置为true,但指示器并未显示在执行器健康endpoint中: 经过进一步检查,我发现了负责获取

  • 我想报告应用程序的健康状态作为一个衡量标准,我希望使用相同的健康指标作为Spring启动执行器,但是,我没有看到任何可导出的组件从Spring启动执行器的依赖关系,我可能能够在这里使用。 我想编写的代码: 当然,不是导出的bean。Spring启动执行器是否导出我可以以这种方式消费的bean?