如何在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
相关产品推荐
相关产品推荐

