Мониторинг docker c помощью Prometheus
Jul 17, 2017 09:58 · 672 words · 4 minute read
Мониторинг docker-контейнеров не менее важен, чем мониторинг физических серверов, виртуальных машин или отдельных сервисов и устройств. Но помимо настройки самого мониторинга, необходимо правильно выбрать систему, с помощью которой вы будете хранить данные, визуализировать метрики и отправлять оповещения.
В данной статье рассмотрим пример быстрой настройки мониторинга docker-хостов и запущенных на них docker-контейнеров с помощью уже известной нам системы мониторинга Prometheus — давайте разберемся!
Считаем, что у вас уже установлен Prometheus со всеми необходимыми компонентами (node_exporter
, alertmanager и Grafana).
Примечание. К слову, все эти компоненты можно устанавливать в docker-контейнерах и объединять весь стек с помощью docker-compose
.
Если с мониторингом docker-хоста все просто и понятно — как и на любом другом физическом сервере метрики собирает node_exporter
и передает их в Prometheus, то для мониторинга docker-контейнеров придется воспользоваться инструментом cAdvisor (Container Advisor) от google.
Для запуска cAdvisor воспользуемся файлом docker-compose.yml
следующего содержания:
version: '2'
services:
cadvisor-exporter:
container_name: "cadvisor-exporter"
image: google/cadvisor
ports:
- "9200:8080"
volumes:
- "/:/rootfs:ro"
- "/var/run:/var/run:rw"
- "/sys:/sys:ro"
- "/var/lib/docker/:/var/lib/docker:ro"
restart: unless-stopped
Запускаем контейнер с помощью команды:
docker-compose up -d
Далее в уже хорошо известный нам конфигурационный файл prometheus.yml
(в debian-based дистрибутивах находится в каталоге /etc/prometheus
) нужно добавить следующие строки:
- job_name: 'cadvisor-exporter'
scrape_interval: 1s
target_groups:
- targets: ['cadvisor-exporter:9200']
и перезапустить Prometheus для применения изменений.
Следующим шагом нужно импортировать (или создать самостоятельно) в Grafana дашборд для отображения собираемых метрик по docker-контейнерам — взять готовые можно здесь. В некоторых случаях потребуется внести небольшие правки в зависимости от используемого вами docker storage driver — в готовых дашбордах используется aufs
, если же у вас overlay/overlay2
, то некоторые графики будут пустыми.
Например, в моем случае используется overlay
, поэтому правильная метрика для отображения используемого места на системном диске будет выглядеть так:
sum((node_filesystem_size{fstype="overlay"} - node_filesystem_free{fstype="overlay"})) / sum(node_filesystem_size{fstype="overlay"}) * 100
Далее следует настроить уведомления, по умолчанию данные настройки находятся в /etc/prometheus/alert.rules
, но для удобства их можно разделить на несколько файлов в зависимости от типа оповещения.
Например, для оповещения о проблемах с контейнерами, можем использовать файл containers.rules
, а для оповещений о проблемах с docker-хостом — файл docker.rules
.
Содержимое файла правил containers.rules
следующее:
# Контейнер не запущен более 30 секунд
ALERT test_container_down
IF absent(container_memory_usage_bytes{name="test_container"})
FOR 30s
LABELS { severity = "critical" }
ANNOTATIONS {
summary= "test_container down",
description= "test_container container is down for more than 30 seconds."
}
# Контейнер использует более 10% CPU более 30 секунд подряд
ALERT test_container_high_cpu
IF sum(rate(container_cpu_usage_seconds_total{name="test_container"}[1m])) / count(node_cpu{mode="system"}) * 100 > 10
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary= "test_container high CPU usage",
description= "test_container CPU usage is {{ humanize $value}}%."
}
# Контейнер использует более 1,2GB RAM более 30 секунд подряд
ALERT test_container_high_memory
IF sum(container_memory_usage_bytes{name="test_container"}) > 1200000000
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "test_container high memory usage",
description = "test_container memory consumption is at {{ humanize $value}}.",
}
В конфигурационном файле docker.rules
следующие строки:
# LA выше определенного лимита (1.5) более 30 секунд
ALERT high_cpu_load
IF node_load1 > 1.5
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Server under high load",
description = "Docker host is under high load, the LA 1m is at {{ $value}}.",
}
# Использование памяти превышает 85%
ALERT high_memory_load
IF (sum(node_memory_MemTotal) - sum(node_memory_MemFree + node_memory_Buffers + node_memory_Cached) ) / sum(node_memory_MemTotal) * 100 > 85
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Server memory is almost full",
description = "Docker host memory usage is {{ humanize $value}}%.",
}
# Использование системного диска превышает 85%
ALERT hight_storage_load
IF (node_filesystem_size{fstype="aufs"} - node_filesystem_free{fstype="aufs"}) / node_filesystem_size{fstype="aufs"} * 100 > 85
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Server storage is almost full",
description = "Docker host storage usage is {{ humanize $value}}%.",
}
Alertmanager также умеет оправлять оповещения о проблемах с помощью e-mail, Pushover, Slack, HipChat. Пример интеграции alertmanager’а и slack подробно расписан здесь, поэтому воспользуемся данным примером.
Конфигурационный файл с настройками отправки уведомлений выглядит так:
route:
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- send_resolved: true
username: 'Prometheus'
channel: '#random'
api_url: 'https://hooks.slack.com/services/<your>/<stuff>/<here>'
На этом все, а для быстрой настройки всего стека мониторинга «с нуля» могу порекомендовать готовый проект от Stefan Prodan.