Prometheus 2.0: Новый формат Alert rules
Jan 8, 2018 11:43 · 626 words · 3 minute read
Как уже упоминал ранее, обновление на новую версию (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
.