春季批处理:如果作业在最后 xx 分钟内失败,则向 grafana 和 prometheus 发出警报

Posted

技术标签:

【中文标题】春季批处理:如果作业在最后 xx 分钟内失败,则向 grafana 和 prometheus 发出警报【英文标题】:spring batch: alert with grafana & prometheus if a job failed in the last xx minutes 【发布时间】:2020-08-07 20:30:59 【问题描述】:

我正在使用弹簧批处理 (4.2.2.RELEASE) 和弹簧执行器 (2.2.6 RELEASE)。从 4.2 版本开始,spring batch 提供了对基于 micrometer (https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/monitoring-and-metrics.html) 的批量监控和指标的支持。

例如,我可以使用度量名称spring_batch_job 查看作业执行的频率、状态和持续时间。

我想使用 grafana 和 prometheus 监控此指标,并在最近 xx 分钟内某个作业失败时发出警报。

如果 spring 批处理应用程序作为服务运行,它似乎会汇总所有指标,直到服务停止。例如,如果在过去一小时内启动了 12 次作业,则指标输出可能如下:

spring_batch_job_seconds_countname="mainJob",status="COMPLETED", 10.0
spring_batch_job_seconds_sumname="mainJob",status="COMPLETED", 354.354538083
spring_batch_job_seconds_countname="mainJob",status="FAILED", 2.0
spring_batch_job_seconds_sumname="mainJob",status="FAILED", 0.880157862

所以mainJob 的两个实例失败了。假设在接下来的一小时内所有 12 个作业都将成功,指标输出将是:

spring_batch_job_seconds_countname="mainJob",status="COMPLETED", 22.0
spring_batch_job_seconds_sumname="mainJob",status="COMPLETED", 708.704538083
spring_batch_job_seconds_countname="mainJob",status="FAILED", 2.0
spring_batch_job_seconds_sumname="mainJob",status="FAILED", 0.880157862

如何检查作业是否在最后 xx 分钟内失败?因为以下表达式仍会返回两个失败的作业实例:spring_batch_job_seconds_countstatus="FAILED"[15m]

【问题讨论】:

【参考方案1】:

我不熟悉 Prometheus QL,但我会尽力提供帮助。

您可以做的是计算这个计数器在最后一小时和前一小时之间的差异。如果您看到失败实例的数量增加,则至少有一个实例失败,您可以发出警报。否则,前一小时内没有作业失败。

Prometheus 提供了专门为此设计的 increase 函数。因此,您应该能够在以下情况下回答您的问题并发出警报:

increase(spring_batch_job_seconds_countname="mainJob",status="FAILED"[15m]) > 0

正如我所说,我不是 Prometheus 专家,所以我会让你检查语法。但这就是想法。

【讨论】:

以上是关于春季批处理:如果作业在最后 xx 分钟内失败,则向 grafana 和 prometheus 发出警报的主要内容,如果未能解决你的问题,请参考以下文章

春季启动批处理到具有多个作业的春季云任务

春季批处理作业未读取第一行

动态创建作业的春季批处理测试

TransactionRequiredException:没有事务正在进行春季批处理作业和休眠

信号与系统2022春季学期作业统计处理

如何在时间段为 30 分钟的春季实现会话管理