Сбой модульного теста Prometheus при добавлении «для» в предупреждение

#prometheus

Вопрос:

Со следующей конфигурацией prometheus:

 groups:
  - name: backup
    rules:
      - alert: BackupTooOld
        expr: time() - last_backup_success > 216000
        # for: 1h # 1m # 1s # <-- Setting any of these causes it to fail
        labels:
          severity: critical
        annotations:
          summary: "Backup too old"
          description: >-
            Backup for {{ $labels.path }} is over 2.5 days old.
 

…и следующий тест:

 rule_files:
  - alert.rules

evaluation_interval: 1m

tests:
  - name: backup
    interval: 1h
    input_series:
      - series: 'last_backup_success{path="gmail"}'
        values: '0x72'
      - series: 'last_backup_success{path="drive"}'
        values: '90000x72'

    alert_rule_test:
      - eval_time: 59h
        alertname: BackupTooOld
        exp_alerts: []

      - eval_time: 63h
        alertname: BackupTooOld
        exp_alerts:
          - exp_labels:
              severity: critical
              path: gmail
            exp_annotations:
              summary: Backup too old
              description: Backup for gmail is over 2.5 days old.
 

…все работает. Однако изменение alert правила для добавления любого ненулевого for значения ( 1h , 1m , 1s ) приводит к сбою второго теста — независимо от того, насколько высоко я его установил eval_time . Что я упускаю?

(Обоснование этой for настройки заключается в том, что при загрузке первая проверка last_backup_success занимает некоторое время. У меня есть тесты для других установленных предупреждений for , которые, похоже, работают нормально.)

Комментарии:

1. Можете ли вы вкратце объяснить, почему вы используете «900×72»? Я пытаюсь проверить правила оповещения, основанные на времени, но я не могу этого сделать. Спасибо

2. Единица time измерения-секунды, поэтому 90 000 секунд-это 25 часов (чуть более одного дня). Идея здесь заключается path="drive" в том, что на момент тестирования 63-25=38 часов назад, где пороговое значение равно 60 часам. Хотя я не совсем понимаю, почему выбрал такое высокое число.

Ответ №1:

Ненулевое for значение требует, чтобы предупреждение срабатывало не менее двух evaluation_interval секунд, чтобы убедиться, что оно охватывает необходимое количество времени.

Здесь это сочетается с тем, что ваши временные ряды разрежены, так как у них есть точка данных только один раз в час, поэтому наступает застой. Это нереалистичные тестовые данные, интервал в 1 м был бы лучше.

В примере комбинации предупреждение не будет срабатывать в 63 часа, но оно должно срабатывать с 63h1m по 63h5m с 1 for м. A при длине более 5 м никогда не может выстрелить, учитывая эти данные испытаний.

Комментарии:

1. Спасибо! Действительно, изменение интервала на 1m , input_series длины на 4320 и настройки for: 1h приводит к успешному выполнению теста , если-и-только-если eval_time для второго 61h1m значения или больше.