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

如何在Prometheus告警单元测试中Mock hour()函数结果?

解决Prometheus告警规则测试中Mock hour()函数的问题

你没法直接像模拟指标那样mock hour()这类Prometheus内置函数,但有两种可行的方案来测试你的维护时段排除逻辑:

方案1:利用测试案例的time参数指定测试时间

Prometheus的规则测试框架支持在每个测试案例中通过time字段设置当前评估时间,hour()函数会基于这个时间计算对应的小时数,完全符合真实场景的逻辑。

举个具体的test.yaml配置示例:

rule_files:
  - 你的告警规则文件路径.yaml
evaluation_interval: 1m
tests:
  - name: 维护时段告警排除测试
    interval: 1m
    # 测试维护时段(凌晨2点半),此时hour()返回2,告警不应触发
    - time: "2024-05-20T02:30:00Z"
      input_series:
        - series: 'whatever_expr'
          values: 0.2 0.2 0.2 # 满足告警阈值条件
      alert_rule_test:
        - alertname: 你的告警名称
          exp_alerts: [] # 期望无告警触发
    # 测试非维护时段(凌晨4点),hour()返回4,告警应触发
    - time: "2024-05-20T04:00:00Z"
      input_series:
        - series: 'whatever_expr'
          values: 0.2 0.2 0.2 # 满足告警阈值条件
      alert_rule_test:
        - alertname: 你的告警名称
          exp_alerts:
            - labels:
                # 这里填你告警规则里定义的标签,比如severity: critical
                severity: critical
              annotations:
                # 填你告警规则里的注解内容
                summary: "指标超出阈值告警"

方案2:将时段判断改为基于自定义指标

如果需要更灵活的测试(比如不想受时间格式限制),可以修改告警规则,把hour()的判断替换为一个自定义的维护时段指标,测试时直接模拟这个指标的取值即可。

第一步:修改告警规则

groups:
- name: 你的告警组名称
  rules:
  - alert: 你的告警名称
    expr: whatever_expr > 0.10 AND ON() absent(maintenance_hour{value=~"2|3"})

第二步:编写测试用例

在test.yaml中模拟maintenance_hour指标的不同取值,来测试维护时段和非维护时段的情况:

rule_files:
  - 你的告警规则文件路径.yaml
evaluation_interval: 1m
tests:
  - name: 维护时段告警排除测试
    interval: 1m
    # 模拟维护时段(value=2),告警不应触发
    - input_series:
        - series: 'whatever_expr'
          values: 0.2 0.2 0.2
        - series: 'maintenance_hour{value="2"}'
          values: 1 1 1 # 1表示当前处于该维护时段
      alert_rule_test:
        - alertname: 你的告警名称
          exp_alerts: []
    # 模拟非维护时段(value=4),告警应触发
    - input_series:
        - series: 'whatever_expr'
          values: 0.2 0.2 0.2
        - series: 'maintenance_hour{value="4"}'
          values: 1 1 1
      alert_rule_test:
        - alertname: 你的告警名称
          exp_alerts:
            - labels:
                severity: critical
              annotations:
                summary: "指标超出阈值告警"

两种方案对比

  • 方案1无需修改现有告警规则,测试逻辑完全贴合真实运行场景,推荐优先使用。
  • 方案2需要调整规则,但测试时更灵活,适合需要模拟特殊时段逻辑的场景。

内容的提问来源于stack exchange,提问作者Boris Le Méc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:25:27