7.4.5 插入自定义健康指示器
如前文所述,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 状态为 UP
的 Health
对象。如果请求发生异常,则 health()
返回一个标明 Amazon 状态为 DOWN
的 Health
对象。
下面是/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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论