Prometheus告警规则添加for字段后单元测试失败该如何解决?
问题成因
- Prometheus 告警的
for字段要求告警表达式在指定时长内的每一次规则评估都返回真,才会将告警从pending状态转为firing状态,中间只要有一次评估不满足触发条件,pending计时器就会重置。 - 配置存在采样间隔不匹配问题:
- 全局规则评估间隔
evaluation_interval设为1m,即每分钟执行一次告警规则计算 - 测试用例的输入序列
interval设为1h,即last_backup_success指标每1小时才生成一个样本点,两次样本之间的所有评估时间点该指标均为缺失状态
- 全局规则评估间隔
- 指标缺失时
time() - last_backup_success > 216000表达式会返回空值,视为不满足触发条件,导致for的计时器持续被重置,永远无法达到触发阈值,因此单元测试无法得到期望的告警结果。
修复方案
你可以选择以下任意一种方案解决问题:
- 方案1:统一规则评估间隔和输入序列采样间隔
将单元测试配置中的全局evaluation_interval修改为与测试用例interval一致的1h,确保每次规则评估时都能取到last_backup_success的样本值,for计时器可以正常累积:rule_files: - alert.rules evaluation_interval: 1h # 从1m改为1h tests: # 其余配置保持不变 - 方案2:调整输入序列采样间隔匹配评估间隔
将测试用例的interval修改为1m,同时调整输入序列的样本数量覆盖测试需要的时间范围,确保每分钟评估时都有对应样本:tests: - name: backup interval: 1m # 从1h改为1m input_series: - series: 'last_backup_success{path="gmail"}' values: '0x4320' # 72小时共4320分钟,生成4320个连续样本 - series: 'last_backup_success{path="drive"}' values: '90000x4320' # 其余配置保持不变 - 方案3:修改告警表达式兼容指标缺失场景
不修改测试配置,调整告警表达式用last_over_time兜底,避免短时间指标缺失导致表达式失效:
该写法会取最近2小时内的最新groups: - name: backup rules: - alert: BackupTooOld expr: time() - last_over_time(last_backup_success[2h]) > 216000 for: 1h # 其余配置保持不变last_backup_success值计算,只要指标采集间隔不超过2小时就不会出现空值,同时也能满足你避免服务启动时误告警的需求。
内容的提问来源于stack exchange,提问作者lutzky
相关产品推荐
相关产品推荐

