Мониторинг docker c помощью Prometheus

Jul 17, 2017 09:58 · 672 words · 4 minute read docker prometheus monitoring

Мониторинг 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.

tweet Share