You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prometheus中排除计划停机计算网站平均可用率?

解决Prometheus SLA监控排除计划停机的问题

核心逻辑

计划停机属于已知的可控不可用时段,不应计入SLA的不可用统计。offset仅用于偏移整体查询时间范围,无法过滤范围内的特定时段,需用以下针对性方案解决。

具体实现方案

方案1:通过记录规则标记计划停机时段

  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"
    
  2. 修改原查询,用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推送停机状态指标:

  1. 停机开始时推送标记:
    echo "planned_maintenance{job=\"$http_job\",env=\"prod\"} 1" | curl --data-binary @- http://pushgateway:9091/metrics/job/maintenance
    
  2. 停机结束后推送结束标记:
    echo "planned_maintenance{job=\"$http_job\",env=\"prod\"} 0" | curl --data-binary @- http://pushgateway:9091/metrics/job/maintenance
    
  3. 同样使用unless逻辑修改原查询即可。

关于offset无效的原因

offset的作用是偏移整个查询的时间范围,比如avg_over_time(probe_success[24h] offset 1h)是查询25小时前到1小时前的24小时数据,它无法对时间范围内的特定时段做过滤,因此不适合用来排除计划停机。

内容的提问来源于stack exchange,提问作者Ravi Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:42:10