Java 更改执行器聚合健康状态行为

Java 更改执行器聚合健康状态行为,java,spring-boot-actuator,Java,Spring Boot Actuator,我有一个使用带执行器的Springboot 2的项目,我需要更改总体状态的默认行为。今天,如果任何“健康指标”处于“下降”状态,则该状态将为“下降”。我需要更改的是在“HealthIndicator”中添加一个“required”属性,如果“HealthIndicator”为“DOWN”且为“required=true”,则将整体状态行为更改为只返回“DOWN” 为了添加必需的属性,我创建了一个新类CustomAbstractHealthIndicator,该类扩展了AbstractHealth

我有一个使用带执行器的Springboot 2的项目,我需要更改总体状态的默认行为。今天,如果任何“健康指标”处于“下降”状态,则该状态将为“下降”。我需要更改的是在“HealthIndicator”中添加一个“required”属性,如果“HealthIndicator”为“DOWN”且为“required=true”,则将整体状态行为更改为只返回“DOWN”

为了添加必需的属性,我创建了一个新类CustomAbstractHealthIndicator,该类扩展了AbstractHealthIndicator,但还没有发现在使用复合属性时如何添加必需的属性

我看到StatusAggregator不推荐使用HealthAggregator,但在StatusAggregator中,我们没有访问HealthIndicator对象的权限,只有状态,因此这打破了我使用“必需”来过滤聚合状态的想法

我需要的运行状况输出如下:

{
    "status": "UP",
    "components": {
        "myHealthComposite": {
            "required": false,
            "status": "DOWN",
            "components": {
                "myFirstHealthIndicator": {
                    "status": "DOWN",
                    "details": {
                        "required": true,
                        "name": "FristHealthIndicator"
                    }
                },
                "mySecondHealthIndicator": {
                    "status": "UP",
                    "details": {
                        "required": false,
                        "name": "SecondHealthIndicator"
                    }
                }
            }
        },
        "myOtherHealthComposite": {
            "required": false,
            "status": "UP",
            "components": {
                "alphaHealthIndicator": {
                    "status": "DOWN",
                    "details": {
                        "required": false,
                        "name": "alphaHealthIndicator"
                    }
                },
                "gamaHealthIndicator": {
                    "status": "UP",
                    "details": {
                        "required": false,
                        "name": "gamaHealthIndicator"
                    }
                }
            }
        }
    }
}
{
   "status":"DOWN",
   "details":{
      "your_service":{
         "status":"DOWN",
         "details":{
            "Required":"true"
         }
      }, ...
}
   
编辑1: 我发现了一个“老办法”的例子

私有静态类MyAggregator扩展AbstractHealthAggregator{
@凌驾
受保护状态聚合状态(列出候选项){
Status ret=Status.DOWN;
职位(候选人:候选人){
if(候选者等于(状态向上)){
ret=Status.UP;
//只要一个人站起来,我们就站起来。
打破
}
}
返回ret;
}
}
但是AbstractHealthAggregator已经被弃用了

编辑2 通过研究执行器源代码,我可能找到了需要更改的地方,以便成功更改默认状态行为

在抽象类HealthEndpointSupport中

protectedfinal CompositeHealth getCompositeHealth(ApiVersion ApiVersion,映射组件,
StatusAggregator StatusAggregator、boolean showComponents、设置组名){
Status Status=statusAggregator.getAggregateStatus(
components.values().stream().map(HealthComponent::getStatus).collect(Collectors.toSet());
映射实例=showComponents?组件:空;
if(组名!=null){
返回新的SystemHealth(apiVersion、status、instances、GroupName);
}
返回新的CompositeHealth(apiVersion、status、instances);
}
一种解决方案是过滤getCompositeHealth中的组件,并仅传递来自所需组件的状态:true in details

但是我不能重写这个类,有很多依赖项只能从包中访问,有没有办法在不从项目中生成fork的情况下更改它


我试图覆盖StatusAggregator,但它只接收一个集合,我无法访问参与者的详细信息

如果我正确理解您的问题,您需要一个属性:true,当您的服务运行状况下降时。您可以像这样使用
Spring
类的detail选项-

@Component
public class MyServiceHEalthStatus implements HealthIndicator {
        
    @Override
    public Health health() {
        if (!isRunningService()) {
            return Health.down().withDetail("Required", "true").build();
        }
        return Health.up().withDetail("Some_Service", "Available").build();
    }

    private Boolean isRunningService() {
        Boolean isRunning = true;
        // Logic Skipped

        return isRunning;
    }
}
然后,当服务关闭时,您应该得到
/Health
端点响应,如下所示:

{
    "status": "UP",
    "components": {
        "myHealthComposite": {
            "required": false,
            "status": "DOWN",
            "components": {
                "myFirstHealthIndicator": {
                    "status": "DOWN",
                    "details": {
                        "required": true,
                        "name": "FristHealthIndicator"
                    }
                },
                "mySecondHealthIndicator": {
                    "status": "UP",
                    "details": {
                        "required": false,
                        "name": "SecondHealthIndicator"
                    }
                }
            }
        },
        "myOtherHealthComposite": {
            "required": false,
            "status": "UP",
            "components": {
                "alphaHealthIndicator": {
                    "status": "DOWN",
                    "details": {
                        "required": false,
                        "name": "alphaHealthIndicator"
                    }
                },
                "gamaHealthIndicator": {
                    "status": "UP",
                    "details": {
                        "required": false,
                        "name": "gamaHealthIndicator"
                    }
                }
            }
        }
    }
}
{
   "status":"DOWN",
   "details":{
      "your_service":{
         "status":"DOWN",
         "details":{
            "Required":"true"
         }
      }, ...
}
   

经过大量的研究和研究,我得出了一个不是好主意的决定,从HealthCheck端点更改默认行为,也许这就是我无法在不制作自定义版本的情况下覆盖的原因

我已经实现了这一部分,现在我需要发现如何使用它来更改总体结果,我已经看到一个覆盖aggregateStatus(候选列表)的示例,你能把这个代码作为问题的一部分吗,它的注释有点混乱。对不起,我正在编辑注释。。。现在我编辑了这个问题:您想在运行时/或服务器启动时关闭一些运行状况指示器吗?您希望对yml文件中的其他道具进行检查。在我的yml中,我将有一个服务配置,其中一个配置告诉我该服务是必需的还是否。如果不需要某个服务,即使该服务已关闭,健康端点也不应响应“关闭”。我想为一组服务做同样的事情。