【发布时间】:2018-05-31 13:29:27
【问题描述】:
有没有办法在注册的健康检查指标的状态发生变化时得到通知?例如,当数据库的健康检查指标下降时,我想采取一些措施。
实际上,我的最终目标是将运行状况检查状态导出到 Prometheus 的指标。因此,当状态发生变化时,我想更新健康指标。
【问题讨论】:
标签: java spring-boot prometheus spring-boot-actuator
有没有办法在注册的健康检查指标的状态发生变化时得到通知?例如,当数据库的健康检查指标下降时,我想采取一些措施。
实际上,我的最终目标是将运行状况检查状态导出到 Prometheus 的指标。因此,当状态发生变化时,我想更新健康指标。
【问题讨论】:
标签: java spring-boot prometheus spring-boot-actuator
我假设您的问题是指 Micrometer issue 416 和 Micrometer-Docs issue 39。
根据文档,您可以注册自定义 HealthMetricsConfiguration。仪表的值由ComposeHealthIndicator 返回的状态决定,并且实际上根据单个HealthIndicators 的状态而变化。
我正在使用前面提到的HealthMetricsConfiguration(只是在问题 416 中讨论了不同的状态值映射)。
我们没有提前实现自定义交替运行状况指示器:
@Component
public class AlternatingHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Builder builder) throws Exception {
int minute = LocalDateTime.now().getMinute();
boolean minuteIsEven = minute % 2 == 0;
builder.status(minuteIsEven ? Status.UP : Status.DOWN);
builder.withDetail("description", "UP when current minute is even; DOWN when current minute is odd");
builder.withDetail("currentMinute", minute);
builder.withDetail("minuteIsEven", minuteIsEven);
}
}
在 Prometheus 端点上导出的 health 量表正在从 1=UP 细微更改为 -2=DOWN。这是一个可视化:
关于警报,您可以使用 Grafana 警报或查看 Prometheus 的 Alertmanager。
【讨论】:
micrometer-registry-prometheus,并且您已经知道您可以访问 [myapp:port/actuator/prometheus]。 (您可能需要使用 management.endpoints.web.exposure.include 属性显式启用此端点)在此端点下,您将看到一个名为 health 的指标(类型为 gauge),它指示健康状态。该指标是根据千分尺文档中的代码创建的。然后应该由 Prometheus 抓取该端点。
AlternatingHealthIndicator 作为示例,以证明累积的健康指标状态反映在health 指标中。 (正如您在票证/问题中提到的,仅反映了初始状态,事实并非如此。)关于警报,您需要设置一个监控解决方案,将这些指标导出或拉入其中。你会想在那里提醒,而不是在你的应用程序中。您必须在每个应用程序中设置警报机制,恕我直言,这不是最好的主意。这就是为什么我建议看看 Grafana 或 Prometheus 警报。
ApplicationEvent,因为“健康状况”是在拉式模型中查询的。当您不询问健康端点时,没有人会告诉您有问题。我可以想象的是设置一个 @Scheduled 方法,它确实使用相同的 CompositeHealthIndicator 查询,然后你会触发你自己的 ApplicationEvent 派生并让一些 ApplicationListener 处理它。