【问题标题】:get notified when spring boot healtcheck status changes当 Spring Boot 健康检查状态发生变化时得到通知
【发布时间】:2018-05-31 13:29:27
【问题描述】:

有没有办法在注册的健康检查指标的状态发生变化时得到通知?例如,当数据库的健康检查指标下降时,我想采取一些措施。

实际上,我的最终目标是将运行状况检查状态导出到 Prometheus 的指标。因此,当状态发生变化时,我想更新健康指标。

【问题讨论】:

    标签: java spring-boot prometheus spring-boot-actuator


    【解决方案1】:

    我假设您的问题是指 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。

    【讨论】:

    • 谢谢。是的,我可以创建一个额外的健康指标。您在下面共享的代码仅执行此操作。但问题是我怎样才能将它传递给 Prometheus?我认为我可以在此运行状况检查期间为 Prometheus 创建自定义指标?
    • 正如您在 Micrometer 项目问题中评论的那样,我假设您在项目中添加了micrometer-registry-prometheus,并且您已经知道您可以访问 [myapp:port/actuator/prometheus]。 (您可能需要使用 management.endpoints.web.exposure.include 属性显式启用此端点)在此端点下,您将看到一个名为 health 的指标(类型为 gauge),它指示健康状态。该指标是根据千分尺文档中的代码创建的。然后应该由 Prometheus 抓取该端点。
    • 好吧,我刚刚意识到,仅使用 HealthMetricsConfiguration 就足以将指标传递给指标。所以,我不需要任何额外的健康指标。谢谢。我得到了我想要的,但我仍然想知道是否有办法在健康状况发生变化时得到通知。
    • 我添加了AlternatingHealthIndicator 作为示例,以证明累积的健康指标状态反映在health 指标中。 (正如您在票证/问题中提到的,仅反映了初始状态,事实并非如此。)关于警报,您需要设置一个监控解决方案,将这些指标导出或拉入其中。你会想在那里提醒,而不是在你的应用程序中。您必须在每个应用程序中设置警报机制,恕我直言,这不是最好的主意。这就是为什么我建议看看 Grafana 或 Prometheus 警报。
    • 啊!现在我懂了。被问题上的普罗米修斯标签误导了。我不认为有这样的ApplicationEvent,因为“健康状况”是在拉式模型中查询的。当您不询问健康端点时,没有人会告诉您有问题。我可以想象的是设置一个 @Scheduled 方法,它确实使用相同的 CompositeHealthIndicator 查询,然后你会触发你自己的 ApplicationEvent 派生并让一些 ApplicationListener 处理它。
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多