Я искал 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)
skirjak
02.11.2016 15:59Тема очень актуальная. Не хватает ссылку на оригинал. Может кто-нибудь подскажет где получить эти шаблоны панели управления, на grafana.net я не нашёл.
fotomak
02.11.2016 23:45Шаблоны вот тут:
https://grafana.net/dashboards
За статью спасибо. Развернул — нравится. Очень порадовало что есть шаблон для БД Cassandra. Осталось собрать docker-compose с кассандрой.
o_serega
02.11.2016 15:59в графане докерхост не шибко будет информативен, если у меня этих хостов более двух)
MAS150MD200
02.11.2016 23:44Спасибо за статью! А возможно ли также быстро и красиво настроить мониторинг каждого контейнера?
D1abloRUS
03.11.2016 11:09Для каждого контейнера свой дашборд? А зачем? Посмотрите в сторону Multi-select http://docs.grafana.org/reference/templating, можно просто отфильровать на общем дашборде нужный вам контейнер
olegbukatchuk
02.11.2016 23:44Вы, везде над скринами пишете «Панель управления», на самом деле это «Панель мониторинга» или ещё проще «Dashboard».
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']
После этого по сценарию из поста добавил шаблон для кассандры.
Всё.
welcomerooot
10.11.2016 09:29Тут ещё в Grafana алерты обещают завести. Сегодня бета релизнулась http://grafana.org/blog/2016/11/09/grafana-4.0-beta-release/
dmitry_ch
Скажите, чем лучше/хуже решение на Prometheus такого же, но построенного на Zabbix?
sudoroot
deleted
SirEdvin
Как минимум могу сказать, что у Zabbix ад с графиками и дашбордами.