# 16.3.2 自定义健康指标

对于一些常见的外部系统，与 Spring 应用程序集成时，Spring Boot 附带了几个现成的健康状况指示器，可提供它们的健康状况。但有时，您可能发现有一些外部系统，Spring Boot 并没有为其提供健康状况指示器。

例如，您的应用程序可能与遗留大型机应用程序集成，应用程序的健康状况，可能会受到遗留系统健康状况的影响。要创建自定义健康状况指示器，需创建一个实现 HealthIndicator 接口的类。

实际上，Taco Cloud 服务并不需要自定义健康指标，因为 Spring Boot 所提供的已经足够了。但为了展示如何开发自定义健康指示器，考虑以下程序清单，它展示了 HealthIndicator 的简单实现。其中选择一天中某个时间，随机地展示其健康状况。

{% code title="程序清单 16.5 HealthIndicator 的非正常实现" %}

```java
package tacos.tacos;
import java.util.Calendar;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class WackoHealthIndicator implements HealthIndicator {
@Override
  public Health health() {
    int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
    if (hour > 12) {
        return Health
            .outOfService()
            .withDetail("reason",
                "I'm out of service after lunchtime")
            .withDetail("hour", hour)
            .build();
    }
    if (Math.random() < 0.1) {
        return Health
            .down()
            .withDetail("reason", "I break 10% of the time")
            .build();
    }
    return Health
        .up()
        .withDetail("reason", "All is good!")
        .build();
  }
}
```

{% endcode %}

这个疯狂的健康指示器首先检查当前时间，如果是中午之后，返回 OUT\_OF\_SERVICE 的健康状况，并提供一些详细信息来解释故障原因。

即使是在午餐前，健康指标也有 10% 的可能性会报告 DOWN 的状态，因为它使用一个随机数来决定它是否正常运行。如果随机数字小于 0.1，状态将报告为 DOWN 。否则，状态为 UP。

显然，清单 16.5 中的健康状况指示器，在真实环境中任何情况下都不会有用。但是想象一下，如果代码中不是用随机数，而是远程调用某个外部系统并确定其状态。在这种情况下，这将是一个非常有用的健康状况指示器。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://potoyang.gitbook.io/spring-in-action-v5/di-16-zhang-shi-yong-springboot-actuator/16.3-zi-ding-yi-actuator/16.3.2-zi-ding-yi-jian-kang-zhi-biao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
