【问题标题】:How to implement a custom CompositeHealthContributor如何实现自定义 CompositeHealthContributor
【发布时间】:2019-12-02 12:06:48
【问题描述】:

我想显示以下健康信息:

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

从最新的 Spring Boot Actuator 文档中,我应该使用“HealthIndicator”接口实现“myFirstHealthIndactor”和“mySecondHealthIndicator”,并将它们与“CompositeHealthContributor”接口复合。但是对于“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;
    }

}

【问题讨论】:

  • @QtRoS 我不能发布一个很好的例子,因为我需要一个如何实现 CompositeContributor 的建议,但我希望你能处理我编辑的问题。
  • “来自最新的 Spring Boot Actuator 文档” 能否请您给我们来源(以便我们处于同一水平)?

标签: spring-boot spring-boot-actuator


【解决方案1】:

一个非常简单且硬编码的解决方案,可以输出预期的结果。

请从 MyFirstHealthIndicatorMySecondHealthIndicator 中删除 @Component 注释。否则,它们也会被列为单独的组件。

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();
    }
}

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

输出如下:

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

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

【讨论】:

  • 如果我需要将某些东西自动连接到MyFirstHealthIndicatorMySecondHealthIndicator 并且我不想显示重复的组件。
猜你喜欢
  • 2010-12-02
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多