如何测试每小时的警报?

How to test an alert for hourly?

我是 prometheus 的新手,我有一个 for: 1h 警报 我想知道在测试警报时 eval_time 应该设置什么? 目前它失败了,并且只有在 alert: 1m and 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

[您在邮件中同时使用 "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 分钟之间保持不变(第一次 [=29= 中有 2 个样本) ] 范围)和 15(最后一次 5m 范围包含 2 个样本)。这意味着您的警报将触发 14 分钟(或连续 15 分钟,不确定 for: X 使用哪个定义)。

换句话说,任何 for: X 14m(或 15m)的值都会导致您的警报一次或一次触发。任何大于该值的值都将导致警报永远不会触发,因为条件永远不会保持那么久。 (话虽这么说,alert_rule_testeval_time: 2h,我认为这意味着 "the alert must be firing at 2h from the start",但无论您在 for: 中使用什么值,都不应如此。)

无论如何,关键是您需要 series2 覆盖至少与 for: 一样多才能满足该条件。如果你有 10 分钟的样本,条件不能保持 2 小时(当然,除非条件是没有最近的样本)。

关于 eval_time: 2h,我不知道该说些什么,我猜你只需要尝试一下,看看为什么它看起来不像罐头上说的那样。