Thank you for reading this post, don't forget to subscribe!
Считаем, что у вас уже установлен Prometheus со всеми необходимыми компонентами (node_exporter
, alertmanager и Grafana).
Примечание. К слову, все эти компоненты можно устанавливать в docker-контейнерах и объединять весь стек с помощью docker-compose
.
Если с мониторингом docker-хоста все просто и понятно — как и на любом другом физическом сервере метрики собирает node_exporter
и передает их в Prometheus, то для мониторинга docker-контейнеров придется воспользоваться инструментом cAdvisor (Container Advisor) от google.
Для запуска cAdvisor воспользуемся файлом docker-compose.yml
следующего содержания:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
[/codesyntax]
Запускаем контейнер с помощью команды:
1 2 |
docker-compose up <span class="hljs-_">-d</span> |
Далее в уже хорошо известный нам конфигурационный файл prometheus.yml
(в debian-based дистрибутивах находится в каталоге /etc/prometheus
) нужно добавить следующие строки:
[codesyntax lang="php"]
1 2 3 4 |
- job_name: 'cadvisor-exporter' scrape_interval: 1s target_groups: - targets: ['cadvisor-exporter:9200'] |
[/codesyntax]
и перезапустить Prometheus для применения изменений.
Следующим шагом нужно импортировать (или создать самостоятельно) в Grafana дашборд для отображения собираемых метрик по docker-контейнерам — взять готовые можно здесь. В некоторых случаях потребуется внести небольшие правки в зависимости от используемого вами docker storage driver — в готовых дашбордах используется aufs
, если же у вас overlay/overlay2
, то некоторые графики будут пустыми.
Например, в моем случае используется overlay
, поэтому правильная метрика для отображения используемого места на системном диске будет выглядеть так:
1 2 |
<span class="hljs-attribute">sum</span>((node_filesystem_size{fstype=<span class="hljs-string">"overlay"</span>} - node_filesystem_free{fstype=<span class="hljs-string">"overlay"</span>})) / sum(node_filesystem_size{fstype=<span class="hljs-string">"overlay"</span>}) * 100 |
Далее следует настроить уведомления, по умолчанию данные настройки находятся в /etc/prometheus/alert.rules
, но для удобства их можно разделить на несколько файлов в зависимости от типа оповещения.
Например, для оповещения о проблемах с контейнерами, можем использовать файл containers.rules
, а для оповещений о проблемах с docker-хостом — файл docker.rules
.
Содержимое файла правил containers.rules
следующее:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Контейнер не запущен более 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}}.", } |
[/codesyntax]
В конфигурационном файле docker.rules
следующие строки:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 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}}%.", } |
[/codesyntax]
Alertmanager также умеет оправлять оповещения о проблемах с помощью e-mail, Pushover, Slack, HipChat. Пример интеграции alertmanager’а и slack подробно расписан здесь, поэтому воспользуемся данным примером.
Конфигурационный файл с настройками отправки уведомлений выглядит так:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 |
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>' |
[/codesyntax]
вот есть готовый проект:
https://github.com/stefanprodan/dockprom