Я искал self-hosted мониторинговое решение с открытым кодом, которое может предоставить хранилище метрик, визуализацию и оповещение для физических серверов, виртуальных машин, контейнеров и сервисов, действующих внутри контейнеров. Опробовав Elastic Beats, Graphite и Prometheus, я остановился на Prometheus. В первую очередь меня привлекли поддержка многомерных метрик и несложный в овладении язык запросов. Возможность использования одного и того же языка для графических изображений и уведомления сильно упрощает задачу мониторинга. Prometheus осуществляет тестирование по методу как черного, так и белого ящика, это означает, что вы можете тестировать инфраструктуру, а также контролировать внутреннее состояние своих приложений.



Почему выбор пал на Prometheus


  • Весь стек можно развернуть с использованием контейнеров.
  • Он создан для распределенных систем и инфраструктур.
  • Масштабируемый сбор данных, не зависящий от распределенного хранилища.
  • Гибкая система обнаружения сервисов (встроенная поддержка для Kubernetes, Consul, EC2, Azure).
  • Целевой экспортер для таких сервисов, как HAProxy, MySQL, PostgreSQL, Memcached, Redis и др.

Экосистема Prometheus огромна. Это означает, что можно найти метрические экспортеры для целого ряда систем, начиная от базы данных, MQ, HTTP-серверов до систем, связанных с аппаратными средствами, таких как IoT или IPMI. Тестирование по методу белого ящика также имеет отличное покрытие. Существуют клиентские библиотеки Prometheus для Go, Java, Python, Ruby, .NET, PHP и других языков программирования.


Начало работы с Prometheus и докером


Если вы хотите попробовать стек Prometheus, обратите внимание на репозиторий dockprom на GitHub. Можно использовать dockprom в качестве начальной точки мониторингового решения. Это позволит с помощью одной команды управлять целым стеком: Prometheus, Grafana, cAdvisor, NodeExporter и AlertManager.



Установка


Скопируйте репозиторий dockprom на докер-хост, перейдите в директорию dockprom и запустите compose up:


$ git clone https://github.com/stefanprodan/dockprom
$ cd dockprom
$ docker-compose up -d

Контейнеры:


  • Prometheus (метрическая база данных) http://<host-ip>:9090
  • AlertManager (управление оповещениями) http://<host-ip>:9093
  • Grafana (визуализация метрик) http://<host-ip>:3000
  • NodeExporter (сборщик хостовых метрик);
  • cAdvisor (сборщик метрик контейнеров).

Если Gafana поддерживает аутентификацию, то сервисы Prometheus и AlertManager не имеют такой функции. При наличии базовой аутентификации для Prometheus и AlertManager вы можете удалить отображение портов из файла docker-compose и использовать NGINX как обратный прокси-сервер.


Установка Grafana


Перейдите на http://<host-ip>:3000 и авторизуйтесь, используя логин admin и пароль changeme. Вы можете изменить пароль с помощью Grafana UI или изменив файл user.config.


Из меню Grafana выберите пункт «Источники данных» (Data Sources) и кликните «Добавить источник данных» (Add Data Source). Чтобы добавить контейнеры Prometheus как источник данных, используйте следующие значения:


  • Имя: Prometheus
  • Тип: Prometheus
  • Url: http://prometheus:9090
  • Доступ: proxy

Теперь вы можете импортировать шаблоны панели управления из директории Grafana. Из меню Grafana выберите «Панель управления» и нажмите «Импорт».


Панель управления докера
Панель управления докера


На панели управления докера отображены ключевые метрики для мониторинга использования ресурсов вашего сервера.


  • Время работоспособности сервера, процент простоя ЦПУ, количество ядер ЦПУ, доступная память, swap и хранилище.
  • График средней нагрузки системы, график выполненных и заблокированных IO-процессов, график прерываний.
  • График использования ЦПУ в режимах guest, idle, iowait, irq, nice, softirq, steal, system, user.
  • График использования памяти по распределению (использовано, свободно, буферы, кэшировано).
  • График использования IO (read Bps, read Bps and IO time).
  • График использования сети устройствами (входящий Bps, исходящий Bps).
  • Использование Swap и графики активности.

Панель управления контейнеров докера
Панель управления контейнеров докера


Панель управления контейнеров докера отображает ключевые метрики для мониторинга используемых контейнеров.


  • Общая нагрузка контейнеров ЦПУ, использование памяти и хранилища.
  • График используемых контейнеров, график нагрузки системы, график использования IO.
  • График использования контейнера ЦПУ.
  • График использования памяти контейнера.
  • График использования кэшированной памяти.
  • График входящего использования сети контейнеров.
  • График исходящего использования сети контейнеров.

На панели не представлены контейнеры, являющиеся частью стека мониторинга.


Панель управления мониторинговыми сервисами
Панель управления мониторинговыми сервисами


Панель управления мониторинговыми сервисами отображает ключевые метрики для мониторинга контейнеров, составляющих мониторинговый стек.


  • Время работы контейнера Prometheus, общее использование памяти мониторингового стека, фрагменты и серии памяти локального хранилища Prometheus.
  • График использования контейнера ЦПУ.
  • График использования памяти контейнера.
  • Графики сохраняемых фрагментов Prometheus и срочности сохранения.
  • Графики операций фрагментов Prometheus и продолжительности установления контрольных точек.
  • Графики процента использованных шаблонов Prometheus, целевых считываний и продолжительности считывания.
  • График запросов Prometheus HTTP.
  • График уведомлений Prometheus.

Контролировать использование памяти Prometheus можно присоединением фрагментов памяти локального хранилища. Можно изменять максимальное значение фрагментов в docker-compose.yml. Я настроил значение storage.local.memory-chunks до 100 000. Если вы мониторите 10 контейнеров, то Prometheus будет использовать около 2 Гб RAM.


Определение уведомлений


Я установил три файла конфигурации уведомлений:


  • Уведомления сервисов мониторинга targets.rules;
  • Уведомления хоста докера hosts.rules;
  • Уведомления контейнеров докера containers.rules.

Вы можете изменять правила уведомления и перезагружать их с помощью запроса HTTP POST:


curl -X POST http://<host-ip>:9090/-/reload

Уведомления сервисов мониторинга


Если один из целевых объектов (node-exporter и cAdvisor) не отвечает более 30 секунд, включите уведомление:


ALERT monitor_service_down
  IF up == 0
  FOR 30s
  LABELS { severity = "critical" }
  ANNOTATIONS {
      summary = "Monitor service non-operational",
      description = "{{ $labels.instance }} service is down.",
  }

Уведомление хоста докера


Если ЦПУ хоста докера находится под высокой нагрузкой более 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 avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
  }

Измените пороговое значение нагрузки в соответствии с количеством ядер ЦПУ.


Если память хоста докера заполнена, включите уведомление:


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}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
  }

Если хранилище хоста докера заполнено, включите уведомление:


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}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
  }

Уведомления контейнеров докера


Если контейнер не отвечает в течение 30 секунд, включите уведомление


ALERT jenkins_down
  IF absent(container_memory_usage_bytes{name="jenkins"})
  FOR 30s
  LABELS { severity = "critical" }
  ANNOTATIONS {
    summary= "Jenkins down",
    description= "Jenkins container is down for more than 30 seconds."
  }

Если контейнер использует более 10 % ядер ЦПУ более 30 секунд, включите уведомление:


 ALERT jenkins_high_cpu
  IF sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu{mode="system"}) * 100 > 10
  FOR 30s
  LABELS { severity = "warning" }
  ANNOTATIONS {
    summary= "Jenkins high CPU usage",
    description= "Jenkins CPU usage is {{ humanize $value}}%."
  }

Если контейнер использует более 1,2 Гб RAM в течение 30 секунд, включите уведомление:


ALERT jenkins_high_memory
  IF sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000
  FOR 30s
  LABELS { severity = "warning" }
  ANNOTATIONS {
      summary = "Jenkins high memory usage",
      description = "Jenkins memory consumption is at {{ humanize $value}}.",
  }

Настройка уведомлений


Сервис AlertManager отвечает за передачу уведомлений сервера Prometheus. AlertManager может посылать уведомления с помощью электронной почты, Pushover, Slack, HipChat и других систем, использующих интерфейс webhook.


Здесь вы можете просмотреть или выключить уведомления: http://<host-ip>:9093.


Получение уведомлений можно настроить в файле alertmanager/config.yml.


Чтобы получать уведомления через Slack, необходимо настроить интеграцию, выбрав «Исходящие сетевые привязки» на странице приложения.


Скопируйте Slack Webhook URL в поле api_url и определите канал Slack.


route:
    receiver: 'slack'

receivers:
    - name: 'slack'
      slack_configs:
          - send_resolved: true
            text: "{{ .CommonAnnotations.description }}"
            username: 'Prometheus'
            channel: '#<channel>'
            api_url: 'https://hooks.slack.com/services/<webhook-id>'

Расширение системы мониторинга


Чтобы покрыть больше одного хоста докера, панель управления Grafana Dockprom можно расширить.. Для контроля большего количества хостов нужно разместить нод-экспортер и контейнер cAdvisor на каждом хосте и указать сервер Prometheus для считывания.


Необходимо активировать стек Prometheus через дата-центр/зону и использовать характеристику интеграции, чтобы объединить все метрики в определенной копии программы Prometheus, которая будет представлять собой общий обзор инфраструктуры. Таким образом, если зона или копия программы Prometheus, задействованная в объединении зон, выйдет из строя, мониторинговая система будет доступна в оставшихся зонах.


Вы также можете сделать Prometheus более отказоустойчивым, запустив два идентичных сервера в каждой зоне. Если несколько серверов будут направлять уведомления в Alertmanager, это не приведет к появлению избыточных данных, так как Alertmanager выполняет дедупликацию.

Поделиться с друзьями
-->

Комментарии (13)


  1. dmitry_ch
    02.11.2016 09:22
    +3

    Скажите, чем лучше/хуже решение на Prometheus такого же, но построенного на Zabbix?


    1. sudoroot
      02.11.2016 09:48

      deleted


    1. SirEdvin
      02.11.2016 12:31

      Как минимум могу сказать, что у Zabbix ад с графиками и дашбордами.


  1. skirjak
    02.11.2016 15:59

    Тема очень актуальная. Не хватает ссылку на оригинал. Может кто-нибудь подскажет где получить эти шаблоны панели управления, на grafana.net я не нашёл.


    1. olemskoi
      02.11.2016 16:00

      Ссылка на оригинал — внизу поста. Или вот: https://stefanprodan.com/2016/a-monitoring-solution-for-docker-hosts-containers-and-containerized-services/


      1. skirjak
        02.11.2016 17:51

        премного благодарен!


    1. fotomak
      02.11.2016 23:45

      Шаблоны вот тут:
      https://grafana.net/dashboards

      За статью спасибо. Развернул — нравится. Очень порадовало что есть шаблон для БД Cassandra. Осталось собрать docker-compose с кассандрой.


  1. o_serega
    02.11.2016 15:59

    в графане докерхост не шибко будет информативен, если у меня этих хостов более двух)


  1. MAS150MD200
    02.11.2016 23:44

    Спасибо за статью! А возможно ли также быстро и красиво настроить мониторинг каждого контейнера?


    1. D1abloRUS
      03.11.2016 11:09

      Для каждого контейнера свой дашборд? А зачем? Посмотрите в сторону Multi-select http://docs.grafana.org/reference/templating, можно просто отфильровать на общем дашборде нужный вам контейнер


  1. olegbukatchuk
    02.11.2016 23:44

    Вы, везде над скринами пишете «Панель управления», на самом деле это «Панель мониторинга» или ещё проще «Dashboard».


  1. fotomak
    03.11.2016 12:38
    +1

    Хотелось бы добавить что данное решение легко модифицируется для организации быстрого мониторинга БД Cassandra (а значит чего угодно, что может мониторить связка prometheus/grafana)
    Рецепт для касандры:
    Я взял докер кассандры с интегрированным java-агентом для прометеуса вот отсюда: https://github.com/argussecurity/docker-cassandra-prometheus/blob/master/Dockerfile

    В докерфайле изменил только версию кассандры на 3.9 и в последней строке заменил переменную ${PROMETHEUS_PORT:-31500} на статическую 7070
    После модифицировал файл docker-compose.yml.
    В моем случае добавился следующий раздел:
    cassandra:
    image: cassandra-prometheus
    container_name: cassandra-nod1
    restart: unless-stopped
    environment:
    — CASSANDRA_BROADCAST_ADDRESS=192.168.ваш.параметр
    volumes:
    — /etc/cassandra
    expose:
    — 7000
    — 7001
    — 7070
    — 7199
    — 9042
    — 9160
    ports:
    — 7000:7000
    — 7001:7001
    — 7070:7070
    — 7199:7199
    — 9042:9042
    — 9160:9160

    networks:
    — monitor-net

    И в prometheus.yml добавил:

    — job_name: 'cassandra'
    scrape_interval: 10s
    static_configs:
    — targets: ['cassandra-nod1:7070']

    После этого по сценарию из поста добавил шаблон для кассандры.
    Всё.


  1. welcomerooot
    10.11.2016 09:29

    Тут ещё в Grafana алерты обещают завести. Сегодня бета релизнулась http://grafana.org/blog/2016/11/09/grafana-4.0-beta-release/