java - 更改执行器聚合的健康状态行为
问题描述
我有一个使用带有 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,我无法访问贡献者的详细信息
解决方案
经过大量研究和研究,我做出了一个决定,从 HealthCheck 端点更改默认行为不是一个好主意,也许这就是我无法在不制作自定义版本的情况下覆盖的原因
推荐阅读
- mysql - 多个数据库的多租户数据库连接池
- tensorflow - 使用 Conv 或 Rnn 嵌入的 tf-hub 层的错误输出
- slack - Slack 是否为每个工作空间或组织使用每个服务器实例?
- github - Github API中的限速graphql查询有费用吗?
- swift - 在 Swift 中加快 UIImage 处理速度
- xcode - 如果在xcode中如何使语句改变值
- sql - 如何在 Vertica 中获取一个季度的第一天和最后一天
- sql - 使用模式或数组或其他任何东西在大查询中找到最适合的存储桶
- java - Spring在一个类中拦截异常
- reactjs - reactjs阿波罗反应取消请求