【问题标题】:How to test an alert for hourly?如何测试每小时的警报?
【发布时间】:2019-11-13 18:57:21
【问题描述】:

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

【问题讨论】:

    标签: prometheus prometheus-alertmanager


    【解决方案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 的常量值为 64706,持续 11 分钟,这意味着警报中的 rate(series2[5m]) == 0 表达式将在 1 分钟(5m 范围内第一次有 2 个样本)和 15 分钟(最后一次5m 范围包含 2 个样本的时间)。这意味着您的警报将触发 14 分钟(或在连续 15 分钟内触发,不确定 for: X 使用哪个定义)。

    换句话说,任何不超过 14m(或 15m)的 for: X 值都会导致您的警报在某个时间或另一个时间触发。任何大于该值的值都将导致警报永远不会触发,因为条件永远不会保持那么长时间。 (话虽这么说,alert_rule_testeval_time: 2h,我的意思是“警报必须从一开始就在2h 触发”,无论您在@987654347 中使用什么值,都不应该是这种情况@.)

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

    对于eval_time: 2h,我不知道该说什么,我想你只需要玩弄它,看看为什么它似乎不像罐头上所说的那样。

    【讨论】:

    • 所以你的意思是说,如果 for 条件是 1h,即使我有 1h 的值,我们也永远无法测试警报?
    • 不,我的意思是如果您要使用for: 1h 测试警报,您需要有1h 的样本。照原样,您似乎只有 10 分钟的样本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多