- PVSM.RU - https://www.pvsm.ru -
Я искал self-hosted мониторинговое решение с открытым кодом, которое может предоставить хранилище метрик, визуализацию и оповещение для физических серверов, виртуальных машин, контейнеров и сервисов, действующих внутри контейнеров. Опробовав Elastic Beats, Graphite и Prometheus, я остановился на Prometheus. В первую очередь меня привлекли поддержка многомерных метрик и несложный в овладении язык запросов. Возможность использования одного и того же языка для графических изображений и уведомления сильно упрощает задачу мониторинга. Prometheus осуществляет тестирование по методу как черного, так и белого ящика, это означает, что вы можете тестировать инфраструктуру, а также контролировать внутреннее состояние своих приложений.
Почему выбор пал на Prometheus
Экосистема Prometheus огромна. Это означает, что можно найти метрические экспортеры для целого ряда систем, начиная от базы данных, MQ, HTTP-серверов до систем, связанных с аппаратными средствами, таких как IoT или IPMI. Тестирование по методу белого ящика также имеет отличное покрытие. Существуют клиентские библиотеки Prometheus для Go, Java, Python, Ruby, .NET, PHP и других языков программирования.
Если вы хотите попробовать стек 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
Контейнеры:
http://<host-ip>:9090
http://<host-ip>:9093
http://<host-ip>:3000
Если Gafana поддерживает аутентификацию, то сервисы Prometheus и AlertManager не имеют такой функции. При наличии базовой аутентификации для Prometheus и AlertManager вы можете удалить отображение портов из файла docker-compose и использовать NGINX как обратный прокси-сервер.
Перейдите на http://<host-ip>:3000
и авторизуйтесь, используя логин admin и пароль changeme. Вы можете изменить пароль с помощью Grafana UI или изменив файл user.config.
Из меню Grafana выберите пункт «Источники данных» (Data Sources) и кликните «Добавить источник данных» (Add Data Source). Чтобы добавить контейнеры Prometheus как источник данных, используйте следующие значения:
http://prometheus:9090
Теперь вы можете импортировать шаблоны панели управления из директории Grafana. Из меню Grafana выберите «Панель управления» и нажмите «Импорт».
Панель управления докера
На панели управления докера отображены ключевые метрики для мониторинга использования ресурсов вашего сервера.
Панель управления контейнеров докера
Панель управления контейнеров докера отображает ключевые метрики для мониторинга используемых контейнеров.
На панели не представлены контейнеры, являющиеся частью стека мониторинга.
Панель управления мониторинговыми сервисами
Панель управления мониторинговыми сервисами отображает ключевые метрики для мониторинга контейнеров, составляющих мониторинговый стек.
Контролировать использование памяти Prometheus можно присоединением фрагментов памяти локального хранилища. Можно изменять максимальное значение фрагментов в docker-compose.yml. Я настроил значение storage.local.memory-chunks
до 100 000. Если вы мониторите 10 контейнеров, то Prometheus будет использовать около 2 Гб RAM.
Я установил три файла конфигурации уведомлений:
Вы можете изменять правила уведомления и перезагружать их с помощью запроса 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 выполняет дедупликацию.
Автор: Centos-admin.ru
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/monitoring/205209
Ссылки в тексте:
[1] Источник: https://habrahabr.ru/post/314212/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.