如何在Prometheus中排除计划停机计算网站平均可用率?
解决Prometheus SLA监控排除计划停机的问题
核心逻辑
计划停机属于已知的可控不可用时段,不应计入SLA的不可用统计。offset仅用于偏移整体查询时间范围,无法过滤范围内的特定时段,需用以下针对性方案解决。
具体实现方案
方案1:通过记录规则标记计划停机时段
- 先定义记录规则生成
planned_maintenance指标,在停机时段值为1,其余时间为0:groups: - name: maintenance.rules rules: - record: planned_maintenance expr: | # 示例:生产环境每日凌晨2:00-2:15停机,测试环境每周六凌晨1:00-2:00停机 (hour() == 2 and minute() >= 0 and minute() < 15 and env="prod") or (hour() == 1 and day_of_week() == 6 and env="staging") labels: job: "$http_job" - 修改原查询,用
unless排除停机时段的探针数据:
逻辑:(avg_over_time((probe_success{job="$http_job"} unless planned_maintenance{job="$http_job"})[24h]) * 100)unless会移除probe_success中与planned_maintenance匹配且值非0的样本,相当于剔除停机时段的监控数据。
方案2:直接在查询中过滤固定周期停机
如果停机是固定周期的,可直接在查询内添加时间条件过滤,无需额外规则:
avg_over_time( probe_success{job="$http_job"} # 排除生产环境每日2:00-2:15 and not (env="prod" and hour() == 2 and minute() >= 0 and minute() < 15) # 排除测试环境每周六1:00-2:00 and not (env="staging" and hour() == 1 and day_of_week() == 6) [24h]) * 100
注意:day_of_week()返回值为0=周日、1=周一……6=周六。
方案3:用Pushgateway标记临时停机
针对非周期的临时停机,可通过Pushgateway推送停机状态指标:
- 停机开始时推送标记:
echo "planned_maintenance{job=\"$http_job\",env=\"prod\"} 1" | curl --data-binary @- http://pushgateway:9091/metrics/job/maintenance - 停机结束后推送结束标记:
echo "planned_maintenance{job=\"$http_job\",env=\"prod\"} 0" | curl --data-binary @- http://pushgateway:9091/metrics/job/maintenance - 同样使用
unless逻辑修改原查询即可。
关于offset无效的原因
offset的作用是偏移整个查询的时间范围,比如avg_over_time(probe_success[24h] offset 1h)是查询25小时前到1小时前的24小时数据,它无法对时间范围内的特定时段做过滤,因此不适合用来排除计划停机。
内容的提问来源于stack exchange,提问作者Ravi Raj
相关产品推荐
相关产品推荐

