Java 更改执行器聚合健康状态行为
我有一个使用带执行器的Springboot 2的项目,我需要更改总体状态的默认行为。今天,如果任何“健康指标”处于“下降”状态,则该状态将为“下降”。我需要更改的是在“HealthIndicator”中添加一个“required”属性,如果“HealthIndicator”为“DOWN”且为“required=true”,则将整体状态行为更改为只返回“DOWN” 为了添加必需的属性,我创建了一个新类CustomAbstractHealthIndicator,该类扩展了AbstractHealthIndicator,但还没有发现在使用复合属性时如何添加必需的属性 我看到StatusAggregator不推荐使用HealthAggregator,但在StatusAggregator中,我们没有访问HealthIndicator对象的权限,只有状态,因此这打破了我使用“必需”来过滤聚合状态的想法 我需要的运行状况输出如下:Java 更改执行器聚合健康状态行为,java,spring-boot-actuator,Java,Spring Boot Actuator,我有一个使用带执行器的Springboot 2的项目,我需要更改总体状态的默认行为。今天,如果任何“健康指标”处于“下降”状态,则该状态将为“下降”。我需要更改的是在“HealthIndicator”中添加一个“required”属性,如果“HealthIndicator”为“DOWN”且为“required=true”,则将整体状态行为更改为只返回“DOWN” 为了添加必需的属性,我创建了一个新类CustomAbstractHealthIndicator,该类扩展了AbstractHealth
{
"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中,我将有一个服务配置,其中一个配置告诉我该服务是必需的还是否。如果不需要某个服务,即使该服务已关闭,健康端点也不应响应“关闭”。我想为一组服务做同样的事情。