Prometheus 2.0: Новый формат Alert rules

Jan 8, 2018 11:43 · 626 words · 3 minute read prometheus monitoring

Как уже упоминал ранее, обновление на новую версию (2.0) системы мониторинга и сбора метрик Prometheus в моем случае не прошло гладко. Отдельно стоит рассказать о новом формате rules-файлов — давайте разберемся!

Как признаются сами разработчики:

Alerting and recording rules are one of the critical features of Prometheus

С этим функционалом связано несколько узких мест / багов, а именно:

  • все правила (rules) запускаются с одним и тем же интервалом;
  • все правила выполняются одновременно;
  • написание правил требует от пользователя знания еще одного DSL.

Перевод rules-файлов в .YML-формат — часть улучшений, направленных на устранение озвученных проблем.

Считаем, что система мониторинга настроена по этой статье.

Рассмотрим изменение синтаксиса на примере файла containers.rules, ранее он выглядел так:

ALERT high_cpu_usage_on_container
  IF sum(rate(container_cpu_usage_seconds_total{name=~".+"}[1m])) by (name,host) * 100 > 70
  FOR 5m
  LABELS { severity = "warning" }
  ANNOTATIONS {
      summary = "High CPU usage: CONTAINER '{{ $labels.name }}' on '{{ $labels.host }}'",
      description = "{{ $labels.name }} is using a LOT of CPU. CPU usage is {{ humanize $value}}%.",
  }
 
ALERT graylog_eating_memory
  IF sum(container_memory_rss{name=~"graylog"}) by (name) > 1500000000
  FOR 5m
  LABELS { severity = "warning" }
  ANNOTATIONS {
      summary = "High memory usage: CONTAINER '{{ $labels.name }}' on '{{ $labels.instance }}'",
      description = "{{ $labels.name }} is eating up a LOT of memory. Memory consumption of {{ $labels.name }} is at {{ humanize $value}}.",
  }
 
ALERT elasticsearch_eating_memory
  IF sum(container_memory_rss{name=~"elasticsearch"}) by (name) > 1500000000
  FOR 5m
  LABELS { severity = "warning" }
  ANNOTATIONS {
      summary = "High memory usage: CONTAINER '{{ $labels.name }}' on '{{ $labels.instance }}'",
      description = "{{ $labels.name }} is eating up a LOT of memory. Memory consumption of {{ $labels.name }} is at {{ humanize $value}}.",
  }
 
ALERT prometheus_eating_memory
  IF sum(container_memory_rss{name=~"prometheus"}) by (name) > 1200000000
  FOR 5m
  LABELS { severity = "warning" }
  ANNOTATIONS {
      summary = "High memory usage: CONTAINER '{{ $labels.name }}' on '{{ $labels.instance }}'",
      description = "{{ $labels.name }} is eating up a LOT of memory. Memory consumption of {{ $labels.name }} is at {{ humanize $value}}.",
  }

В новом варианте файл должен называться containers.rules.yml, а содержимое его будет следующим:

groups:
- name: /var/www/monitor/prometheus/containers.rules
  rules:
  - alert: high_cpu_usage_on_container
    expr: sum(rate(container_cpu_usage_seconds_total{name=~".+"}[1m])) BY (name, host)
      * 100 > 70
    for: 5m
    labels:
      severity: warning
    annotations:
      description: '{{ $labels.name }} is using a LOT of CPU. CPU usage is {{ humanize
        $value}}%.'
      summary: 'High CPU usage: CONTAINER ''{{ $labels.name }}'' on ''{{ $labels.host
        }}'''
  - alert: graylog_eating_memory
    expr: sum(container_memory_rss{name=~"graylog"}) BY (name) > 1.5e+09
    for: 5m
    labels:
      severity: warning
    annotations:
      description: '{{ $labels.name }} is eating up a LOT of memory. Memory consumption
        of {{ $labels.name }} is at {{ humanize $value}}.'
      summary: 'High memory usage: CONTAINER ''{{ $labels.name }}'' on ''{{ $labels.instance
        }}'''
  - alert: elasticsearch_eating_memory
    expr: sum(container_memory_rss{name=~"elasticsearch"}) BY (name) > 1.5e+09
    for: 5m
    labels:
      severity: warning
    annotations:
      description: '{{ $labels.name }} is eating up a LOT of memory. Memory consumption
        of {{ $labels.name }} is at {{ humanize $value}}.'
      summary: 'High memory usage: CONTAINER ''{{ $labels.name }}'' on ''{{ $labels.instance
        }}'''
  - alert: prometheus_eating_memory
    expr: sum(container_memory_rss{name=~"prometheus"}) BY (name) > 1.2e+09
    for: 5m
    labels:
      severity: warning
    annotations:
      description: '{{ $labels.name }} is eating up a LOT of memory. Memory consumption
        of {{ $labels.name }} is at {{ humanize $value}}.'
      summary: 'High memory usage: CONTAINER ''{{ $labels.name }}'' on ''{{ $labels.instance
        }}'''

Переписывать файл(ы) вручную — не вариант, поэтому воспользуемся утилитой promtool для автоматического обновления всех файлов правил. Сначала получим последнюю версию данной утилиты (2.0):

wget https://github.com/prometheus/prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz
tar zxvf prometheus-2.0.0.linux-amd64.tar.gz

Переходим в каталог с утилитой и запускаем процесс обновления для всех rules-файлов:

cd prometheus-2.0.0.linux-amd64/
./promtool update rules /var/www/monitor/prometheus/host.rules 
./promtool update rules /var/www/monitor/prometheus/targets.rules
./promtool update rules /var/www/monitor/prometheus/containers.rules

После успешного обновления файлов изменятся также из имена, поэтому в конфигурационном файле prometheus.yml также меняем соответствующие строки на:

...
rule_files:
  - "targets.rules.yml"
  - "host.rules.yml"
  - "containers.rules.yml"
...

После применения изменений не забываем перезапустить prometheus.

tweet Share