Prometheus + Grafana + Alertmanager в Docker

Thank you for reading this post, don't forget to subscribe!

В дан­ной инструк­ции мы рас­смот­рим при­мер docker-compose фай­ла для орга­ни­за­ции систе­мы мони­то­рин­га на базе Prometheus. Мы получим:

  • Базу дан­ных Prometheus и интер­фейс для выпол­не­ния PromQL.
  • Визу­а­ли­за­цию с помо­щью Grafana.
  • Сбор мет­рик через Node Exporter.
  • Мони­то­ринг HTTP с исполь­зо­ва­ни­ем Blackbox.
  • Отправ­ку уве­дом­ле­ний в Telegram с помо­щью Alertmanager.

Мы будем рабо­тать в сре­де Linux, хотя полу­чен­ный файл docker-compose мож­но при­ме­нять где угод­но. Оста­нав­ли­вать­ся подроб­но на опи­са­нии docker-compose мы не будем.

Подготовка системы

Под­ра­зу­ме­ва­ет­ся, что у нас уста­нов­лен Docker и docker-compose

Созда­ем ката­ло­ги, где будем созда­вать наши файлы:

mkdir -p /opt/prometheus_stack/{prometheus,grafana,alertmanager,blackbox}

Созда­ем файл:

touch /opt/prometheus_stack/docker-compose.yml

Пере­хо­дим в ката­лог prometheus_stack:

cd /opt/prometheus_stack

Даль­ше будем рабо­тать отно­си­тель­но него.

Prometheus + Node Exporter

Откры­ва­ем файл:

vi docker-compose.yml

* в дан­ном при­ме­ре мы созда­ем 2 сер­ви­са — prometheus и node-exporter. Так­же мы отдель­но опре­де­ли­ли под­сеть 172.28.0.0/16, в кото­рой будут нахо­дить­ся наши кон­тей­не­ры docker.

Созда­ем кон­фи­гу­ра­ци­он­ный файл для prometheus:

vi prometheus/prometheus.yml

* в дан­ном при­ме­ре мы про­пи­сы­ва­ем наш node-exporter в каче­стве таргета.

Запус­ка­ем контейнеры:

docker-compose up -d

Ждем несколь­ко секунд и мож­но про­бо­вать под­клю­чить­ся. Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:9090 — мы долж­ны уви­деть стра­ни­цу Prometheus:

Пере­хо­дим по адре­су http://<IP-адрес сервера>:9100 — мы долж­ны уви­деть стра­ни­цу Node Exporter:

Grafana

Доба­вим к наше­му сте­ку графану.

Откры­ва­ем файл:

vi docker-compose.yml

Добав­ля­ем:

* по ана­ло­гии с дру­ги­ми сер­ви­са­ми, мы доба­ви­ли сер­вис для графаны.

Пере­за­пу­стим контейнеры:

docker-compose up -d

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:3000 — мы долж­ны уви­деть стар­то­вую стра­ни­цу Grafana.

Для авто­ри­за­ции вво­дим admin / admin. После систе­ма потре­бу­ет вве­сти новый пароль.

Настро­им связ­ку с Prometheus. Кли­ка­ем по икон­ке Configuration - Data Sources:

Пере­хо­дим к добав­ле­нию источ­ни­ка, нажав по Add data source:

Сре­ди спис­ка источ­ни­ков дан­ных нахо­дим и выби­ра­ем Prometheus, клик­нув по Select:

Зада­ем пара­мет­ры для под­клю­че­ния к Prometheus:

Сохра­ня­ем настрой­ки, клик­нув по Save & Test:

Доба­вим даш­борд для мони­то­рин­га с node exporter. Для это­го уже есть гото­вый вариант.

Кли­ка­ем по изоб­ра­же­нию плю­са и выби­ра­ем Import:

Вво­дим иден­ти­фи­ка­тор даш­бор­да. Для Node Exporter это 1860:

Кли­ка­ем Load — Grafana под­гру­зит даш­борд из сво­е­го репо­зи­то­рия — выби­ра­ем в раз­де­ле Prometheus наш источ­ник дан­ных и кли­ка­ем по Import:

Мы уви­дим стра­ни­цу с настро­ен­ны­ми пока­за­те­ля­ми мет­рик. Мож­но пользоваться.

Настройка оповещений с AlertManager

В нашем при­ме­ре мы настро­им отправ­ку уве­дом­ле­ний на теле­грам бот. Само опо­ве­ще­ние будет выпол­нять AlertManager, кото­рый инте­гри­ру­ет­ся с Prometheus.

Для нача­ла под­го­то­вим наш бот теле­грам. Созда­дим ново­го — для это­го откры­ва­ем теле­грам и ищем @my_id_bot:

При­ло­же­ние пока­жет наш иден­ти­фи­ка­тор. Запи­сы­ва­ем — он нам потре­бу­ет­ся позже.

Теперь созда­ем бота. Ищем @BotFather:

Пере­хо­дим в чат с най­ден­ным BotFather и запус­ка­ем бота:

Созда­ем бота, после­до­ва­тель­но вве­дя коман­ду /newbot и отве­чая на запро­сы мастера:

* в нашем при­ме­ре мы созда­ем бота prometheus_alert с име­нем учет­ной запи­си test.

Пере­хо­дим в чат с создан­ным ботом, клик­нув по его названию:

Запус­ка­ем бота:

С ботом мы закон­чи­ли. Пере­хо­дим к docker.

Откры­ва­ем наш файл docker-compose:

vi docker-compose.yml

И добав­ля­ем:

* мы доба­ви­ли два сер­ви­са — alertmanager-bot (теле­грам бот для prometheus alertmanager) и alertmanager (систе­ма опо­ве­ще­ний в prometheus).

Теперь откры­ва­ем кон­фи­гу­ра­ци­он­ный файл для prometheus:

vi prometheus/prometheus.yml

И доба­вим строки:

* в дан­ном при­ме­ре мы ука­за­ли, что наш сер­вер мони­то­рин­га дол­жен исполь­зо­вать в каче­стве систе­мы опо­ве­ще­ния alertmanager, кото­рый досту­пен по адре­су alertmanager:9093. Так­же мы доба­ви­ли файл alert.rules с опи­са­ни­ем пра­вил оповещения.

Созда­ем файл с пра­ви­ла­ми оповещения:

vi prometheus/alert.rules

* в дан­ном при­ме­ре мы доба­ви­ли пра­ви­ло, кото­рое будет сра­ба­ты­вать при недо­ступ­но­сти узла (node-exporter).

Пере­хо­дим к кон­фи­гу­ри­ро­ва­нию alertmanager:

vi alertmanager/config.yml

* дан­ная кон­фи­гу­ра­ция поз­во­ля­ет отправ­лять опо­ве­ще­ния с помо­щью webhook на сер­вис alertmanager-bot:8080 (наш теле­грам бот для alertmanager).

Запус­ка­ем новые сер­ви­сы docker:

docker-compose up -d

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:9090 — на вклад­ке Alerts мы долж­ны уви­деть нашу настройку:

Попро­бу­ем про­ве­рить рабо­ту опо­ве­ще­ния. Отклю­ча­ем наш node exporter:

docker stop exporter

На теле­грам долж­но прий­ти оповещение:

Отправ­ка уве­дом­ле­ний настроена.

Blackbox exporter

Пере­хо­дим к настрой­ке мони­то­рин­га http сер­ви­сов. В нашем при­ме­ре мы будем про­ве­рять рабо­ту сай­та test.ru.

Откры­ва­ем наш файл docker-compose:

vi docker-compose.yml

Доба­вим в него:

* сер­вис blackbox явля­ет­ся ком­по­нен­том Prometheus для мони­то­рин­га сете­вых сер­ви­сов по раз­лич­ным протоколам.

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл prometheus:

vi prometheus/prometheus.yml

И допи­сы­ва­ем:

* подоб­ная кон­фи­гу­ра­ция поз­во­лит создать допол­ни­тель­ное зада­ние мони­то­рин­га сай­та https://www.test.ru.

Созда­ем кон­фи­гу­ра­ци­он­ный файл blackbox:

vi blackbox/blackbox.yml

* во мно­гом, дан­ный при­мер взят с офи­ци­аль­ной стра­ни­цы на Github.

Теперь откро­ем кон­фи­гу­ра­ци­он­ный файл с опи­са­ни­ем пра­вил для предупреждений:

vi prometheus/alert.rules

Доба­вим:

* в дан­ном при­ме­ре мы созда­ли два правила:

  • BlackboxSlowProbe — пре­ду­пре­ждать, если сайт откры­ва­ет­ся доль­ше 5 секунд.
  • BlackboxProbeHttpFailure — реа­ги­ро­вать, в слу­чае полу­че­ния кода отве­та с ошиб­кой рабо­ты сай­та (более 400).

Запус­ка­ем добав­лен­ный в докер сервис:

docker-compose up -d

Для визу­а­ли­за­ции мони­то­рин­га с помо­щью blackbox есть гото­вый даш­борд в гра­фане. Сно­ва откры­ва­ем стра­ни­цу импорта:

Вво­дим иден­ти­фи­ка­тор 7587 и выби­ра­ем источ­ник (как дела­ли при добав­ле­нии даш­бор­да node exporter).