我对普罗米修斯很陌生,我收到for: 1h
的警报,我想知道测试警报时应将eval_time设置为什么?
当前失败,并且仅在警报:1m和eval_time:10m时起作用
请有人向我解释这是如何工作的!
示例:
groups:
- name: spark.rules
rules:
##### ALERTS #####
- alert: xxxSparkJobsNotConsuming
expr: rate(foo{data_type="bar"}[5m]) == 0
for: 1h ---> works if i set it to 5m
labels:
service: spark
severity: warning
source: spark
annotations:
description: 'Nothing have been consumed for 1 hour.'
测试:
rule_files:
- spark.rules.yml
evaluation_interval: 1m
tests:
- interval: 1m
input_series:
- series: 'foo{data_type="bar"}'
values: '0'
- series: 'foo{data_type="bar"}'
values: '64706+0x10'
alert_rule_test:
- eval_time: 2h
alertname: xxxSparkJobsNotConsuming
exp_alerts:
- exp_labels:
data_type: xxxx
service: spark
severity: warning
source: spark
exp_annotations:
description: 'Nothing have been consumed for 1 hour.'
promql_expr_test:
- expr: 'foo'
eval_time: 4m
exp_samples:
- labels: 'foo{data_type="bar"}'
value: 64706
答案 0 :(得分:1)
[您在整个邮件中都使用"xx"
,"xxx"
和"xxxx"
作为data_type
的值,所以我不确定是什么。也许下次尝试使用"foo"
,"bar"
,"baz"
。或"1"
,"2"
,"3"
。特别是,您定义的两个input_series
都具有完全相同的名称和标签值。我将假设在您的实际测试中情况并非如此,我将它们称为series1
和series2
。]
现在,撇开这一点,您的测试将定义2个时间序列,每个采样间隔1分钟:
series1: 0
series2: 64706 64706 64706 64706 64706 64706 64706 64706 64706 64706 64706
series1
只有一个样本,这意味着使用rate
的警报将永远不会触发它,因为rate
至少需要2个样本才能产生结果。
series2
在11分钟内的常数值为64706,这意味着警报中的rate(series2[5m]) == 0
表达式将在1分钟(第一时间在5m
范围内有2个样本)之间保存)和15(5m
范围最后一次包含2个样本)。这意味着您的警报将触发14分钟(或连续15分钟,不确定for: X
使用的是哪种定义)。
换句话说,for: X
的任何值(最多14m(或15m))都会导致您一次或多次触发警报。任何大于该值的值都将导致警报永远不会触发,因为该条件永远不会持续那么长时间。 (也就是说,alert_rule_test
具有eval_time: 2h
,我的意思是“警报必须从一开始就向2h
发出警报”,无论发生什么情况都绝不会这样)您在for:
中使用的值。)
无论如何,关键是要使该条件成立,您需要series2
至少覆盖for:
。如果您有10分钟的样本值,则该条件不能持续2个小时(当然,除非条件是没有最近的样本)。
我不知道该说些什么eval_time: 2h
,我想您只需要研究一下它,然后看看为什么它似乎没有像锡罐上所说的那样做。