Мониторинг 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 следующего содержания:
Запускаем контейнер с помощью команды:
Далее в уже хорошо известный нам конфигурационный файл prometheus.yml (в debian-based дистрибутивах находится в каталоге /etc/prometheus ) нужно добавить следующие строки:
и перезапустить Prometheus для применения изменений.
Следующим шагом нужно импортировать (или создать самостоятельно) в Grafana дашборд для отображения собираемых метрик по docker-контейнерам — взять готовые можно здесь. В некоторых случаях потребуется внести небольшие правки в зависимости от используемого вами docker storage driver — в готовых дашбордах используется aufs , если же у вас overlay/overlay2 , то некоторые графики будут пустыми.
Например, в моем случае используется overlay , поэтому правильная метрика для отображения используемого места на системном диске будет выглядеть так:
Далее следует настроить уведомления, по умолчанию данные настройки находятся в /etc/prometheus/alert.rules , но для удобства их можно разделить на несколько файлов в зависимости от типа оповещения.
Например, для оповещения о проблемах с контейнерами, можем использовать файл containers.rules , а для оповещений о проблемах с docker-хостом — файл docker.rules .
Содержимое файла правил containers.rules следующее:
В конфигурационном файле docker.rules следующие строки:
Alertmanager также умеет оправлять оповещения о проблемах с помощью e-mail, Pushover, Slack, HipChat. Пример интеграции alertmanager’а и slack подробно расписан здесь, поэтому воспользуемся данным примером.
Конфигурационный файл с настройками отправки уведомлений выглядит так:
На этом все, а для быстрой настройки всего стека мониторинга «с нуля» могу порекомендовать готовый проект от Stefan Prodan.
Collect Docker metrics with Prometheus
Prometheus is an open-source systems monitoring and alerting toolkit. You can configure Docker as a Prometheus target. This topic shows you how to configure Docker, set up Prometheus to run as a Docker container, and monitor your Docker instance using Prometheus.
Warning: The available metrics and the names of those metrics are in active development and may change at any time.
Currently, you can only monitor Docker itself. You cannot currently monitor your application using the Docker target.
Prerequisites
- One or more Docker engines are joined into a Docker swarm, using docker swarm init on one manager and docker swarm join on other managers and worker nodes.
- You need an internet connection to pull the Prometheus image.
Configure Docker
To configure the Docker daemon as a Prometheus target, you need to specify the metrics-address . The best way to do this is via the daemon.json , which is located at one of the following locations by default. If the file does not exist, create it.
- Linux: /etc/docker/daemon.json
- Windows Server: C:\ProgramData\docker\config\daemon.json
- Docker Desktop for Mac / Docker Desktop for Windows: Click the Docker icon in the toolbar, select Settings, then select Daemon. Click Advanced.
If the file is currently empty, paste the following:
If the file is not empty, add those two keys, making sure that the resulting file is valid JSON. Be careful that every line ends with a comma ( , ) except for the last line.
Save the file, or in the case of Docker Desktop for Mac or Docker Desktop for Windows, save the configuration. Restart Docker.
Docker now exposes Prometheus-compatible metrics on port 9323.
Configure and run Prometheus
Prometheus runs as a Docker service on a Docker swarm.
Copy one of the following configuration files and save it to /tmp/prometheus.yml (Linux or Mac) or C:\tmp\prometheus.yml (Windows). This is a stock Prometheus configuration file, except for the addition of the Docker job definition at the bottom of the file. Docker Desktop for Mac and Docker Desktop for Windows need a slightly different configuration.
Next, start a single-replica Prometheus service using this configuration.
Verify that the Docker target is listed at http://localhost:9090/targets/.

You can’t access the endpoint URLs directly if you use Docker Desktop for Mac or Docker Desktop for Windows.
Use Prometheus
Create a graph. Click the Graphs link in the Prometheus UI. Choose a metric from the combo box to the right of the Execute button, and click Execute. The screenshot below shows the graph for engine_daemon_network_actions_seconds_count .

The above graph shows a pretty idle Docker instance. Your graph might look different if you are running active workloads.
To make the graph more interesting, create some network actions by starting a service with 10 tasks that just ping Docker non-stop (you can change the ping target to anything you like):
Wait a few minutes (the default scrape interval is 15 seconds) and reload your graph.

When you are ready, stop and remove the ping_service service, so that you are not flooding a host with pings for no reason.
Wait a few minutes and you should see that the graph falls back to the idle level.
Мониторинг докер-хостов, контейнеров и контейнерных служб
Я искал 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:
- 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:
Уведомления сервисов мониторинга
Если один из целевых объектов (node-exporter и cAdvisor) не отвечает более 30 секунд, включите уведомление:
Уведомление хоста докера
Если ЦПУ хоста докера находится под высокой нагрузкой более 30 секунд, включите уведомление:
Измените пороговое значение нагрузки в соответствии с количеством ядер ЦПУ.
Если память хоста докера заполнена, включите уведомление:
Если хранилище хоста докера заполнено, включите уведомление:
Уведомления контейнеров докера
Если контейнер не отвечает в течение 30 секунд, включите уведомление
Если контейнер использует более 10 % ядер ЦПУ более 30 секунд, включите уведомление:
Если контейнер использует более 1,2 Гб RAM в течение 30 секунд, включите уведомление:
Настройка уведомлений
Сервис AlertManager отвечает за передачу уведомлений сервера Prometheus. AlertManager может посылать уведомления с помощью электронной почты, Pushover, Slack, HipChat и других систем, использующих интерфейс webhook.
Здесь вы можете просмотреть или выключить уведомления: http://<host-ip>:9093 .
Получение уведомлений можно настроить в файле alertmanager/config.yml.
Чтобы получать уведомления через Slack, необходимо настроить интеграцию, выбрав «Исходящие сетевые привязки» на странице приложения.
Скопируйте Slack Webhook URL в поле api_url и определите канал Slack.
Расширение системы мониторинга
Чтобы покрыть больше одного хоста докера, панель управления Grafana Dockprom можно расширить.. Для контроля большего количества хостов нужно разместить нод-экспортер и контейнер cAdvisor на каждом хосте и указать сервер Prometheus для считывания.
Необходимо активировать стек Prometheus через дата-центр/зону и использовать характеристику интеграции, чтобы объединить все метрики в определенной копии программы Prometheus, которая будет представлять собой общий обзор инфраструктуры. Таким образом, если зона или копия программы Prometheus, задействованная в объединении зон, выйдет из строя, мониторинговая система будет доступна в оставшихся зонах.
Вы также можете сделать Prometheus более отказоустойчивым, запустив два идентичных сервера в каждой зоне. Если несколько серверов будут направлять уведомления в Alertmanager, это не приведет к появлению избыточных данных, так как Alertmanager выполняет дедупликацию.
Docker Monitoring with cAdvisor, Prometheus and Grafana
Docker is the open-source tool, which works like a virtual machine. However, it doesn’t create whole operating system, it has just minimum set of operating system for running application. Docker allows you to get more apps running on the server and also makes it very easy to package and ship programs.
While we have more running application, it is very important to monitor these containers performances, resource usage, etc. A container monitoring system collects metrics to ensure application running on containers are performing properly. Metrics are tracked and analyzed in real time to determine if an application is meeting expected goals.
In this article, we will cover docker monitoring by using cAdvisor, Prometheus and Grafana. These three tools are open source and easy to setup. Moreover, they can be integrated smoothly. We will setup grafana and cAdvisor using Docker container. Prometheus will run on the system.
Step-1 Install cAdvisor
cAdvisor (Container Advisor) collects, aggregates, processes and exports information about running containers. For installing cAdvisor with docker;
cAdvisor is now running on http://localhost:8080
Step-2 Install Prometheus
Prometheus is an open-source system monitoring and alerting toolkit. Prometheus is very easy to setup. Firstly, we need to download the latest release of prometheus from https://prometheus.io/download/ .
Extract the downloaded file and set it as working directory.
Secondly, we need to configure prometheus.yml before starting prometheus.
Now, we are ready to start prometheus
Prometheus will start in 30 seconds. We can access prometheus main page from http://localhost:9090/metrics
For checking configuration on prometheus, we should follow the path: status → Targets
Configuration is done. We are ready to visualize the metrics.
Step-3 Install Grafana
Grafana is an open source metric analytics & visualization suite. It is used for visualizing time series data for infrastructure and application analytics. Grafana installation is very laborless, and we will run it using the official Docker container.
Grafana is running on port 3000 so, we will use http://localhost:3000 for going main page of grafana.
Firstly, we need to add data source. Click on create your first data source button. Prometheus is default time series database of grafana thus, we don’t need any data source plugin.
Write your prometheus URL.
Then, we can create our dashboard after adding data source. There are different kinds of dashboards with different data sources at grafana dashboard home page https://grafana.com/grafana/dashboards. At this page, we will search docker monitoring for prometheus data source. This page has so many docker monitoring dashboards, but in this tutorial, we will use docker monitoring by philicious https://grafana.com/grafana/dashboards/193.
We will download this dashboard as json format.
At the main page of grafana; if we click on Home at left-top of the page, import dashboard option will become visible. Upload the downloaded json file from this page.
Name of dashboard will come automatically, but we have to select prometheus option. Then, importing is ready.
This dashboard shows us running containers, total memory usage, total cpu usage etc. As we can see there are 3 running containers which are cAdvisor, jenkins and grafana. If we want to evaluate our docker container usages, cAdvisor is using the highest CPU but jenkins has the highest memory usage.
I hope this article help you to monitor your docker containers. If you think there are questionable or missing parts, you can contact me.