spring-boot - 如何实现自定义 CompositeHealthContributor

标签 spring-boot spring-boot-actuator

我想显示以下健康信息:

{
   "status":"UP", 
   "components": {
          "myHealthComposite": {
                "status":"UP",
                "components": {
                        "myFirstHealthIndicator": { "status":"UP" },
                        "mySecondHealthIndicator": { "status":"UP" }
                }
          }
    },
    "groups":[]
}

从最新的 Spring Boot Actuator 文档中,我应该使用“HealthIndicator”-Interface 实现“myFirstHealthIndactor”和“mySecondHealthIndicator”,并将它们与“CompositeHealthContributor”-Interface 组合起来。但是对于“CompositeHealthContributor”,我需要一个示例,在文档中我找不到对我有用的东西。

有人可以帮我吗?

你好

编辑:

myFirstHealthIndicator
@Component
public class MyFirstHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up().build();
    }

}

mySecondHealthIndicator
@Component
public class MySecondHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up().build();
    }

}

myHealthComposite
@Component
public class MyHealthComposite implements CompositeHealthContributor {

    @Override
    public HealthContributor getContributor(String name) {
        return null;
    }

    @Override
    public Iterator<NamedContributor<HealthContributor>> iterator() {
        return null;
    }

}

最佳答案

一个非常简单和硬编码的解决方案,输出预期。

请删除 @Component注释来自 MyFirstHealthIndicator MySecondHealthIndicator .否则,它们也会作为单独的组件列出。

MyFirstHealthIndicator

public class MyFirstHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up().build();
    }

}

MySecondHealthIndicator

public class MySecondHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up().build();
    }

}

MyHealthComposite

@Component
public class MyHealthComposite implements CompositeHealthContributor {

    private Map<String, HealthContributor> contributors = new LinkedHashMap<>();

    MyHealthComposite() {
        this.contributors.put("myFirstHealthIndicator", new MyFirstHealthIndicator());
        this.contributors.put("mySecondHealthIndicator", new MySecondHealthIndicator());
    }

    @Override
    public HealthContributor getContributor(String name) {
        return contributors.get(name);
    }

    @Override
    public Iterator<NamedContributor<HealthContributor>> iterator() {
        return contributors.entrySet().stream()
                .map((entry) -> NamedContributor.of(entry.getKey(), entry.getValue())).iterator();
    }
}

请启用 management.endpoint.health.show-components=always在您的 application.properties .

输出看起来像:

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP"
    },
    "myHealthComposite": {
      "status": "UP",
      "components": {
        "myFirstHealthIndicator": {
          "status": "UP"
        },
        "mySecondHealthIndicator": {
          "status": "UP"
        }
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

但是,这不是我的解决方案,而是从 BindersHealthIndicatorAutoConfiguration from spring-cloud-stream 采用的并适应要求。

关于spring-boot - 如何实现自定义 CompositeHealthContributor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59138614/

相关文章:

spring - 如何在 Spring Boot Health 中添加自定义健康检查?

java - Redshift 连接偶尔会掉线

java - 如何在 JBOSS EAP6.4 的自定义模块后使用 Spring Boot 应用程序使用自定义 module.xml 并进行部署

java - 当@Autowired 时,SftpRemoteFileTemplate 不适用于 RemoteDirectoryExpression

java - 升级 spring-boot-actuator 1.2.5.RELEASE 时无法打开 ServletContext 资源 [/<NONE>]

spring-boot - Spring Boot Actuator - 查询特定的健康指标?

java - 使用 Spring Boot 的 3 层架构最佳实践

java - 如何在java的rest调用中将Map作为requestBody发送

java - 执行器/指标端点不包括http.server.requests

jhipster - 在 jhipster 生成的应用程序中禁用 spring boot 审核