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

Change Actuator aggregated Health Status behavior

我有一个使用 Springboot 2 和 Actuator 的项目,我需要更改整体状态的默认行为。今天,如果任何“HealthIndicators”获得“DOWN”状态,则此状态将为“DOWN”。我需要更改的是向“HealthIndicator”添加“required”属性,如果“HealthIndicator”为“DOWN”且“required=true”,则将整体状态行为更改为 return“DOWN”。

为了添加所需的属性,我创建了一个新的 class CustomAbstractHealthIndicator,它扩展了 AbstractHealthIndicator,但是当我使用复合时还没有发现如何添加所需的属性...

而且我看到 HealthAggregator 已被 StatusAggregator 弃用,但在 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"
                    }
                }
            }
        }
    }
}

编辑 1: 我在“老办法”中找到了一个例子

    private static class MyAggregator extends AbstractHealthAggregator {
        @Override
        protected Status aggregateStatus(List<Status> candidates) {
            Status ret = Status.DOWN;
            for (Status candidate : candidates) {
                if (candidate.equals(Status.UP)) {
                    ret = Status.UP;
                    // as long as one is up, we are up.
                    break;
                }
            }
            return ret;
        }
    }

但 AbstractHealthAggregator 已被弃用

编辑 2 研究 Actuator 源代码,我可能发现我需要更改的地方才能成功更改默认状态行为...

在摘要中 class HealthEndpointSupport

    protected final CompositeHealth getCompositeHealth(ApiVersion apiVersion, Map<String, HealthComponent> components,
                                                                                               StatusAggregator statusAggregator, boolean showComponents, Set<String> groupNames) {
        Status status = statusAggregator.getAggregateStatus(
                components.values().stream().map(HealthComponent::getStatus).collect(Collectors.toSet()));
        Map<String, HealthComponent> instances = showComponents ? components : null;
        if (groupNames != null) {
            return new SystemHealth(apiVersion, status, instances, groupNames);
        }
        return new CompositeHealth(apiVersion, status, instances);
    }

一种解决方案是过滤getCompositeHealth中的组件,只传递详细信息为required:true的组件的Status....

但我不能只覆盖这个 class,有许多依赖项只能从包中访问,有什么方法可以更改它而无需从项目中创建分支?

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

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

@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":"DOWN",
   "details":{
      "your_service":{
         "status":"DOWN",
         "details":{
            "Required":"true"
         }
      }, ...
}
   

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