如何每小时测试一次警报?

时间:2019-11-13 18:57:21

标签: prometheus prometheus-alertmanager

我对普罗米修斯很陌生,我收到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

1 个答案:

答案 0 :(得分:1)

[您在整个邮件中都使用"xx""xxx""xxxx"作为data_type的值,所以我不确定是什么。也许下次尝试使用"foo""bar""baz"。或"1""2""3"。特别是,您定义的两个input_series都具有完全相同的名称和标签值。我将假设在您的实际测试中情况并非如此,我将它们称为series1series2。]

现在,撇开这一点,您的测试将定义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,我想您只需要研究一下它,然后看看为什么它似乎没有像锡罐上所说的那样做。