PROM 14: Prometheus Useful cases

Описание:

Всем привет!

Итак, в этот раз нас ждет последнее задание по prometheus! Очень рад, что вы были с нами, надеюсь, что вам понравился материал, который мы для вас подготовили. На самом деле вы уже умеете делать с prometheus больше 95% основных вещей. А сегодня мы хотим показать вам некоторые полезные кейсы, которые вы сможете применить в реальной жизни. Мы будем разбирать их не очень подробно, так что вы сможете пройтись по полезным ссылкам и изучить информацию более подробно.

Итак, приступим!

Кейс1 - активная реплика prometheus.

Как мы уже с вами разбирали - tsdb работает только локально и не может быть настроена на репликацию или работу в кластере. Но все намного проще чем вам кажется. Поскольку prometheus работает по pull модели вы можете просто взять и поставить рядом вторую виртуалку с prometheus, тем самым обеспечив резервирование. Делаете одинаковую конфигурацию и prometheus начинает забирать метрики из одних источников параллельно. Если один сервер умрет - вы легко сможете начать использовать запасной источник.

Кейс2 - бекап prometheus.

Опять же частый вопрос, который возникает - это как бекапить prometheus. На самом деле все просто - вам достаточно бекапить директорию с данными (/opt/prometheus/data). Хотя в promtool есть интересная команда dump, но она просто выводит список вообще всех метрик из директории с данными:

root@prom-test:/opt/prometheus# ./promtool tsdb dump /opt/prometheus/data | head -2
{__name__="go_gc_duration_seconds", instance="127.0.0.1:9101", job="node-exporter", quantile="0"} 0 1623842373762
{__name__="go_gc_duration_seconds", instance="127.0.0.1:9101", job="node-exporter", quantile="0"} 0 1623842388762

Вывести-то выводит, но вот импортировать их не получится :) У Prometheus даже есть issue на эту тему - раз и два.

Но зато promtool позволяет импортировать данные в формате openmetrics:

./promtool tsdb create-blocks-from openmetrics <input file> [<output directory>]

Ладно, возвращаемся к бекапам - вы можете использовать API для создания snapshot'а tsdb примерно так:

root@prom-test:/opt/prometheus# curl -XPOST -D - -s http://localhost:9090/api/v1/admin/tsdb/snapshot
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 16 Jun 2021 12:16:45 GMT
Content-Length: 72

{"status":"success","data":{"name":"20210616T121645Z-5563a11f02101ccf"}}

То есть мы просто отправляем POST запрос на определенный URL. Кстати, данный url по умолчанию недоступен и чтобы его включить вам потребуется добавить опцию --web.enable-admin-api при запуске prometheus. После выполнения данной команды мы получим снепшот в директории /opt/prometheus/data/snapshots:

root@prom-test:/opt/prometheus# ls -la /opt/prometheus/data/snapshots/
total 12
drwxr-xr-x 3 prometheus prometheus 4096 Jun 16 12:16 .
drwxr-xr-x 7 prometheus prometheus 4096 Jun 16 12:16 ..
drwxr-xr-x 5 prometheus prometheus 4096 Jun 16 12:16 20210616T121645Z-5563a11f02101ccf

Теперь можно забекапить данную директорию и при необходимости восстановить все ее содержимое в директорию с данными (/opt/prometheus/data).

Кейс3 - как мониторить сам prometheus.

С мониторингом получается достаточно забавная ситуация - как и с вопросом "а кто будет охранять охранников?". По факту получается что если у вас упадет prometheus, то никто этого даже и не заметит - ведь prometheus не сможет отправлять алерты в alertmanager, да и alertmanager скорее всего загнется вместе с промиком.

Для решения данной задачи используется очень простой метод - dead man's switch. Суть его заключается в следующем - вы настраиваете примерно вот такой алерт внутри prometheus:

- alert: DeadMansSwitch
annotations:
description: This is a DeadMansSwitch meant to ensure that the entire Alerting
pipeline is functional.
summary: Alerting DeadMansSwitch
expr: vector(1)
labels:
severity: none

Поскольку используется выражение vector(1), то по сути данный алерт будет всегда активным. Далее вы настраиваете alertmanager примерно следующим образом:

global:
...
route:
...
routes:
- match:
alertname: DeadMansSwitch
receiver: 'cole'
group_wait: 0s
group_interval: 1m
repeat_interval: 50s
receivers:
- name: 'cole'
webhook_configs:
- url: 'https://nosnch.in/c2354d53d2'
send_resolved: false

Данный url можно получить в сервисе deadmanssnitch.com. Таким образом prometheus будет постоянно отправлять алерт в alertmanager, а alertmanager в свою очередь в deadmanssnitch. Если вдруг ваш prometheus или alertmanager пропадет, то пропадут и оповещения, а значит что-то пошло не так. Оповещения можно будет настроить в самом сервисе deadmanssnitch. Кстати, похожую функциональность предлагает и pagerduty. Так что есть из чего выбрать :)

Кейс4 - скейлинг prometheus до миллиона машин

В заключении я бы хотел рассказать про очень интересный кейс, родом еще из 2016 года. Тогда на конференции по мониторингу с докладом выступил представитель digital ocean и он рассказал о том как они мониторят все свои виртуальные машины с помощью prometheus. Сам доклад можно найти здесь, а слайды здесь.

Если рассказывать в двух словах, то ребята сделали прикольный форк prometheus, который вместо того чтобы опрашивать экспортеры по http протоколу, сам забирает метрики из kafk'и, а все экспортеры просто отправляют данные через специальный pushgateway в кафке. Форк доступен вот здесь.

Если у вас действительно огромная инфраструктура - есть смысл задуматься о решении похожим на решение ребят из digitalocean.

Итоги

На этом мы завершаем свой рассказ о prometheus. Надеюсь вы получили много новых и интересных знаний, которые сможете применить на практике в своей компании и вывести ее на абсолютно новый уровень мониторинга. Следующее задание по списку - это финальное задание, в котором вам придется настроить production ready solution для мониторинга на базе prometheus - успехов в выполнении!

Полезные ссылки:

Backup and restore Prometheus

Dead mans snitch

Prometheus API

Awesome Prometheus

Scale prometheus to million machines

Задание:

В этом задании вам потребуется настроить активную реплику prometheus сервера, а так же создать бекап tsdb базы. Вам будет выдано три машины с предустановленным prometheus.

Критерии оценки выполнения задания:

Установите экспортер node_exporter на prom-node-exporter:

1.1. Исполняемый файл экспортера node_exporter должен находиться внутри отдельной директории /opt/node_exporter.

1.2. Экспортер node_exporter должен быть запущен как сервис c помощью systemd и быть описан в файле /etc/systemd/system/node_exporter.service.

Настройте Prometheus на prom-node1:

2.1. Prometheus собирает метрики с node_exporter на машине prom-node-exporter.

2.2. У Prometheus включено admin-api.

Настройте Prometheus на prom-node2:

3.1. Prometheus собирает метрики с node_exporter на машине prom-node-exporter.

3.2. У Prometheus включено admin-api.

Создайте снепшот tsdb базы на prom-node1 и prom-node2 с помощью API.