如何处理Prometheus中类事件Gauge指标,实现工作流连续失败告警?
解决GitHub Actions工作流连续失败告警的优化方案
针对你提到的github-actions-exporter指标偏事件型、工作流改为按需触发后告警持续多日的问题,以下是几个实用的优化方案:
方案1:基于最近N次运行的连续失败判断(优先推荐)
因为每次工作流运行会生成独立的指标行,我们可以直接跟踪最近几次运行的状态,判断是否连续失败。示例PromQL(以连续3次失败为例):
count by (workflow, source_eks_cluster, repo) ( topk(3, github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed'}) == 0 ) == 3
逻辑说明:
topk(3, ...):取目标工作流最近完成的3次运行记录(按样本时间戳排序,对应实际运行时间)- 筛选出其中状态为0(失败)的记录,统计数量
- 当数量等于3时,说明连续3次运行失败,触发告警
优势:
- 适配按需触发的可变周期,无需依赖固定时间窗口
- 只要有一次成功运行,
topk结果会包含该成功样本,统计数量小于3,告警自动恢复,不会持续触发
方案2:利用最新运行状态+失败次数组合判断
如果需要兼顾“最新一次失败”和“累计失败次数”,可以结合last_over_time和count_over_time:
last_over_time(github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed'}[7d]) == 0 and count_over_time(github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed', value='0'}[7d]) >= 3
逻辑说明:
- 先判断最近7天内的最后一次运行是失败状态
- 同时确认最近7天内失败次数不少于3次
适用场景:
- 允许非连续失败,但需要累计达到一定次数才告警的场景
方案3:调整指标过期策略(需修改Exporter配置)
如果有权限修改github-actions-exporter的配置,可以设置指标的过期时间(比如24小时),让旧的运行记录自动被清理。之后用以下查询:
count by (workflow, source_eks_cluster, repo) ( github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed', value='0'} unless github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed', value='1'} ) > 0
逻辑说明:
- 仅当存在失败记录,且没有任何成功记录时触发告警
- 旧记录过期后,只要有一次成功运行,告警会自动恢复
注意:
- 过期时间需要根据业务场景设置,避免误删有效运行记录
方案4:通过记录规则预处理指标(优化查询性能)
如果需要频繁查询这类告警规则,可以先创建Prometheus记录规则,预处理目标工作流的最新运行状态:
groups: - name: github_workflow_rules rules: - record: github_workflow:latest_run_status expr: | last_over_time(github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed'}[7d]) - record: github_workflow:failed_run_count_7d expr: | count_over_time(github_workflow_run_status{repo='xxx/yyy', workflow='zzz', event='workflow_dispatch', status='completed', value='0'}[7d])
之后告警查询可以简化为:
github_workflow:latest_run_status == 0 and github_workflow:failed_run_count_7d >= 3
优势:
- 减少告警查询时的计算开销,提升Prometheus性能
内容的提问来源于stack exchange,提问作者Brett Wagner
相关产品推荐
相关产品推荐

