更改执行器聚合的健康状态行为
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 端点更改默认行为,也许这就是我无法在不制作自定义版本的情况下覆盖的原因
我有一个使用 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 端点更改默认行为,也许这就是我无法在不制作自定义版本的情况下覆盖的原因