首页 > 解决方案 > 更改执行器聚合的健康状态行为

问题描述

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

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

我看到 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 源代码,我可能发现我需要更改才能成功更改默认状态行为...

在抽象类 HealthEndpointSupport<C, T>

    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 详细信息...。

但是我不能只覆盖这个类,有许多依赖项只能从包中访问,有什么方法可以在不从项目中创建分支的情况下更改它?

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

标签: javaspring-boot-actuator

解决方案


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


推荐阅读