添加 "for" 警报时 Prometheus 单元测试失败

Prometheus unit test failing when adding "for" to alert

使用以下普罗米修斯配置:

groups:
  - name: backup
    rules:
      - alert: BackupTooOld
        expr: time() - last_backup_success > 216000
        # for: 1h # 1m # 1s # <-- Setting any of these causes it to fail
        labels:
          severity: critical
        annotations:
          summary: "Backup too old"
          description: >-
            Backup for {{ $labels.path }} is over 2.5 days old.

...以及以下测试:

rule_files:
  - alert.rules

evaluation_interval: 1m

tests:
  - name: backup
    interval: 1h
    input_series:
      - series: 'last_backup_success{path="gmail"}'
        values: '0x72'
      - series: 'last_backup_success{path="drive"}'
        values: '90000x72'

    alert_rule_test:
      - eval_time: 59h
        alertname: BackupTooOld
        exp_alerts: []

      - eval_time: 63h
        alertname: BackupTooOld
        exp_alerts:
          - exp_labels:
              severity: critical
              path: gmail
            exp_annotations:
              summary: Backup too old
              description: Backup for gmail is over 2.5 days old.

...一切正常。但是,更改 alert 规则以添加任何非零 for 值(1h1m1s)会导致第二个测试失败 - 无论多高我设置了eval_time。我错过了什么?

for 设置的基本原理是,在启动时,第一次检查 last_backup_success 需要一点时间。我测试了其他设置 for 的警报,这似乎工作正常。)

非零 for 要求警报至少触发两个 evaluation_interval 以确保它涵盖必要的时间。

这里结合了你的时间序列是稀疏的,因为它们每小时只有一个数据点,所以陈旧开始了。这是不切实际的测试数据,1m 的间隔会更好。

在组合示例中,警报不会在 63h 时触发,但它应该在 63h1m 到 63h5m 时以 1m for 触发。给定这个测试数据,超过 5m 的 A 永远不会触发。