返回介绍

7.4.5 插入自定义健康指示器

发布于 2025-04-21 21:10:11 字数 2194 浏览 0 评论 0 收藏

如前文所述,Actuator 自带了很多健康指示器,能满足常见需求,比如报告应用程序使用的数据库和消息代理的健康情况。但如果你的应用程序需要和一些没有健康指示器的系统交互,那该怎么办呢?

我们的阅读列表里有指向 Amazon 的图书链接,可以报告一下 Amazon 是否可以访问。当然,Amazon 不太可能宕机,但不怕一万就怕万一,所以让我们为 Amazon 创建一个健康指示器吧。代码清单 7-12 演示了相关 HealthIndicator 的实现。

代码清单 7-12 自定义一个 Amazon 健康指示器

package readinglist;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class AmazonHealth implements HealthIndicator {

  @Override
  public Health health() {

    try {
      RestTemplate rest = new RestTemplate();
      rest.getForObject("http://www.amazon.com", String.class);   ←---向 Amazon 发送请求
      return Health.up().build();
    } catch (Exception e) {
      return Health.down().build();    ←---报告 DOWN 状态
    }
  }

}

AmazonHealth 类并没有什么花哨的地方。 health() 方法只是使用 Spring 的 RestTemplate 向 Amazon 首页发起了一个 GET 请求。如果请求成功,则返回一个表明 Amazon 状态为 UPHealth 对象。如果请求发生异常,则 health() 返回一个标明 Amazon 状态为 DOWNHealth 对象。

下面是/health 端点响应的一个片段。这里可以看出,如果 Amazon 不可访问,你会看到什么。

{
    "amazonHealth": {
        "status": "DOWN"
    },
    ...
}

你不会相信我等 Amazon 宕机等了多久,就为了能看到上面的结果!1

1 实际上我并没有等太久。我只是把电脑的网络断开了。没有网就没有 Amazon。

除了简单的状态之外,如果你还想向健康记录里添加其他附加信息,可以调用 Health 构造器的 withDetail() 方法。例如,要添加异常消息,将其作为健康记录的 reason 字段,可以让 catch 块返回这样一个 Health 对象:

return Health.down().withDetail("reason", e.getMessage()).build();

修改后,当 Amazon 无法访问时,健康记录看起来是这样的:

"amazonHealth": {
    "reason": "I/O error on GET request for
               \"http://www.amazon.com\":www.amazon.com;
               nested exception is java.net.UnknownHostException:
               www.amazon.com",
    "status": "DOWN"
},

如果有很多附加信息,可以多次调用 withDetail() 方法,每次设置一个要放入健康记录的附加字段。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。