Grafana – это мощная система визуализации метрик.

В этой статье я покажу как её установить в Docker, как подключить в Grafana Prometheus, как создать панель в Grafana, как подключить ClickHouse в Grafana и как настроить алерты.

По ходу ролика покажу несколько практических подходов, которые упростят вашу работу с Grafana.

Что такое Grafana

Grafana – это система визуализации метрик ваших приложений. Когда вы что-то разрабатываете, важно следить за тем, что происходит внутри: насколько нагружен сервер, как быстро отрабатывают запросы. Да даже если у вас просто умный дом, то графана – отличный выбор для отображения статуса умной лампочки в умной спальне.

Grafana умеет выводить не только графики, но и таблицы, гистограммы, диаграммы, геокарты и ещё кучу других способов визуализировать ваши метрики.

Grafana может брать данные не только из прометеуса , но и из кликхауса MySQL InfluxDB или еластика . И кстати, в этом ролике (и статье) я покажу и прометеус, и кликхаус.

Прямо в графане, вы можете настроить и алерты, и сегодня я про них тоже расскажу.

А если вы не хотите арендовать собственный сервер, то у графаны есть даже облачное решение с весьма комфортным бесплатным тарифом.

Установка в Docker

По традиции, подопытным проектом будет рекламный сервер , о котором на канале есть целый плейлист .

Устанавливать графану мы будем через Docker.

Добавим контейнер в docker-compose.yml и запустим команду docker compose up.

services:
	...
  
	grafana:  
		image: grafana/grafana-oss:9.4.3  
		ports:  
			- "13000:3000"  
		volumes:  
			- grafana-data:/var/lib/grafana  
  
volumes:  
	grafana-data:

Теперь мы можем открыть адрес 127.0.0.1:3000, ввести логин admin и пароль admin, и встретить успешно установленную графану!

Подключение Prometheus

Теперь давайте подключим Prometheus, который находится в соседнем контейнере. Перейдем в Настройки -> Data Sources (источники):

Затем нужно добавить новый источник и выбрать Prometheus:

Поскольку у нас всё это находится в одном docker-compose, то мы можем обращаться к прометеусу прямо через хост prometheus:9090:

Остальное можно оставить как есть. Теперь кликаем “Save & Test”, и видим, что новый источник работает!

Вывод метрик

Time series

Давайте начнём с того, что выведем частоту запросов к ротатору. Для этого нужно создать новый Dashboard – место, где мы будем аккумулировать все метрики ротатора:

На этом дашборде нужно создать новую панельку, и перед вами покажется вот такой интерфейс:

Кстати, графана замечательно справляется с промптами ваших метрик:

Но, прежде чем выводить новую панельку, давайте сделаем так, чтобы у нас в принципе появились какие-то данные. Для этого я запущу bombardier  – это такое средство нагрузочного тестирования. Нужно запустить команду, которая будет делать запросы в 100 потоков на протяжении 30 секунд:

bombardier -c 100 -d 30s http://127.0.0.1:8081

Тем временем, я уже могу начать выводить эту метрику. Для того, чтобы вывести рейт какой-то метрики, нам нужна одноименная функция rate  .

Передаем в неё нашу метрику, и в квадратных скобках интервал, за который будут усредняться значения. Получится что-то вроде:

rate(ads_http_request_count[1m])

Вуаля:

Вместо абсолютных показателей типа 30000-50000, вы можете явно указать единицу измерения. Среди этих единиц измерения есть такой формат как short. Выберем его, и теперь оно выводится в более удобном виде:

Обратите внимание на легенду, в которой выводится {instance="host.docker.internal:8082", job="ads_server", status="302"}.

Давайте вместо этого робовывода явно укажем, какие поля нам нужны. Например, я хочу видеть там только статус. Для этого в поле “Legend” нужно ввести шаблон, в нашем случае {{status}}. Результат будет такой:

Теперь давайте выведем длительность обработки запросов. Для этого создадим новую панель с таким PromQL запросом:

ads_http_request{quantile="0.9"}

Затем давайте выберем секунды в Standart Options -> Unit. Теперь мы увидим вот такой стройный график:

По которому становится понятно, что запрос обрабатывался смешные 5 мкс.

Stat

Итак, мы научились выводить графики, теперь давайте выведем rate в виде отдельного счётчика.

Просто скопируем запрос из первой панели rate(ads_http_request_count[1m]) в новую панель и выберем тип панели Stat.

Она выводит последнее значение (хотя можно это перенастроить, и вывести хоть первое, хоть среднее  ). И, если я сейчас вновь запущу “бомбардировку” ротатора и обновлю панельку, то увижу график этих запросов. Правда, с небольшой задержкой, потому что Prometheus собирает данные раз в какое-то время:

Но что будет, если я запущу второй ротатор?

Для этого поставим конфигурацию в IDE “возможность запускать несколько сущностей”.

Запущу второй инстанс ротатора, для которого проставлю новую пару портов для 8083 и 8084. Перезапущу контейнер с прометеусом, и теперь у меня отображаются оба инстанса в Targets:

А что будет, если я сейчас запущу бомбардир на второй ротатор? Запускаю, возвращаюсь к дашборду, и кажется у меня задублировались данные..

Переменные

Что мне делать, если я хочу отобразить только одну кривую для какого-то конкретного инстанса? Нужно использовать переменные. Переменные устанавливаются на уровне дашборда.

Открываем настройки дашборда, и слева видим секцию Variables:

Кликаем “Add variable” и задаём некое имя, которое будет доступно во всех метриках:

Теперь нам нужно ввести запрос, который вернёт значения для выпадающего списка.

В шаблонизаторе Grafana есть очень классная функция, которая называется label_values.

Она возвращает все возможные легенды какой-то метрики.

В моём случае, я возьму за основу метрику ads_http_request и получу все instance:

label_values(ads_http_request, instance)

Графана сразу их показала в превью:

Сохраняю, и теперь, после того, как я создал эту переменную, она у меня отобразилась сверху, и я могу её использовать в запросах.

Давайте вновь откроем панельки, и используем прямо в запросе новую переменную:

Как видите, синтаксис PromQL остаётся тем же, просто в фильтре можно указать $instance.

Добавим эту магию во все панели, которые создали ранее. Теперь мы буквально одним выпадающий списком можем менять instance ротатора, метрики которого меня интересуют в данный момент.

И на одном дашборде можно переключать метрики разных ротаторов:

Аннотации

Допустим, вы загрузили какое-то обновление или начали процесс нагрузочного тестирования и вы знаете, что начали делать это в 16:53. Знать вам это время нужно для того, чтобы понять, в какой момент у вас может поменяться график в связи с обновлением.

Запоминать самому это не очень удобно, и, к счастью, графана предлагает в этом случае создать аннотацию. Достаточно кликнуть прямо по графику, нажать Add annotation, написать комментарий врде “Здесь запущен бомбардир”, и к выбранному времени добавится аннотация!

После сохранения у вас на графике будет отображаться вертикальная линия, при наведении на которую вы увидите свой комментарий:

Отличный способ показать, что после какого-либо действия что-то должно измениться, когда вы, например, загрузили обновление.

Подключение ClickHouse

В процессе заигрываний с графаной мы навставляли кучу статистики в кликхаус. А можно ли её вывести на том же дашборде? Конечно можно!

Для начала, аналогично прометеусу подключим и кликхаус. Правда, для него понадобится поставить плагин, но тоже буквально в пару кликов. Перейдём в Settings -> Plugins и найдём там “Clickhouse”:

Устанавливаем плагин, и с этого момента вы можете создавать источник из Clickhouse.

У меня контейнер называется clickhouse-db, соответственно это и будет в поле Name:

Порт стандартный 9000, потому что мы внутри докер сети. Username - default, пароль - qwerty123. Сохраняем, тестируем, проверяем, что источник работает.

Теперь нужно составить запрос. Возвращаемся к дашборду, и создаём новую панель с источником Clickhouse. Grafana даже предложит поюзать удобный билдер запросов, чтобы вы не писали его руками:

Выбираем базу данных, таблицу, выбираем сумму запросов:

Запускаем и видим наши запросы:

Но что, если мне нужно видеть ещё и браузер? Тогда я выбираю текстовой редактор SQL Editor и вручную добавляю браузер:

Алертинг

Большая и важная фича Графаны – алерты. Благодаря алертам вы можете настроить автоматические уведомления, если что-то случается с вашими сервисами.

Настройка телеграма

Давайте настроим алерты в телеграм канал, если вдруг упадёт один из инстансов ротатора.

Для этого нам понадобится три вещи:

  1. Канал в Telegram, куда будут отправляться алерты
  2. Бот, который их будет отправлять
  3. ID канала

Создание бота

Начнём с создания бота у BotFather . Наверняка вы уже видели эту процедуру, которая на выходе нам даст токен для бота.

Создание канала

Далее создадим канал, в который будут приходить алерты. В него нужно пригласить бота.

Получение ID канала

Как же нам теперь получить айди канала? Есть много разных способов, но самым безопасным я нахожу следующий:

  1. Пишем в чате что-то в духе /test @mybot (то есть меншеним нашего бота и запускаем несуществующую команду)
  2. Берём токен для бота из BotFather
  3. Подставляем токен в специальный адрес для получения апдейтов: https://api.telegram.org/botТУТВАШТОКЕН/getUpdates

Открываем полученное в браузере и стягиваем ID чата:

Теперь токен и ID чата мы можем перенести в графану, создав для этого канал нотификаций. Для этого переходим в раздел Alerting на вкладку Contact Points, создаём, и заполняем ID и токен, которые мы получили ранее:

Тестируем интеграцию и отправляем нотификацию:

Вуаля, Бот подключён! Он нам уже отправил нашу нотификацию такого вида:

Настройка алерта в графане

Теперь возвращаемся к нашему дашборду. Нам нужно добавить панель, в которой мы выведем график живости инстансов ротатора. За статус таргета в прометеусе отвечает метрика up. Эта метрика выводит единичку, если сервис живой, и нолик, если нет:

В ней же есть фильтр по джобам. А поскольку нас интересует только ротатор, я ввожу up{job="ads_server"} и вижу, что оба инстанса живые:

Сохраняем панель, открываем её редактирование вновь и добавляем Alert, и теперь перед нами показывается очень удобный графический интерфейс:

Поставим условие, что нам нужны алерты, когда значение опускается ниже 1:

Далее установим проверку раз в 10 секунд, чтобы быстрее получить результат:

У алерта есть три состояния:

  • OK – всё хорошо (ok)
  • Alerting – что-то случилось, тогда он будет отправлять уведомление
  • Pending – промежуточное состояние, когда он собирает данные

В поле for мы можем указать, как долго он будет в состоянии pending. Иначе говоря, как быстро графана будет считать, что действительно что-то случилось, и что она должна отправить нотификацию.

Для теста заменю здесь стандартные 5m на 30s.

Прежде, чем будем гасить ротатор, давайте перейдем вновь в настройки алертинга и укажем политику, при которой у нас будут отправляться уведомления. Подректируем мы как раз дефолтную политику, применяемую для всех алертов. В ней в качестве дефолтного канала связи выберем Telegram:

Теперь останавливаем работу одного из инстансов и немного ждём. С этого момента прометеус будет фиксировать, что наш сервис упал. Поскольку проверка у нас происходит каждые 10 секунд, то графана говорит, что мы ещё в ожидающем состоянии:

Pending нужен, чтобы не засорять ваш канал с алертами. Может быть такое, что либо, в лучшем случае, случился ложноположительный алерт, либо ваша система может сама пытаться перезапуститься для восстановления.

Именно для таких случаев вы и выжидаете немного времени для того, чтобы система имела возможность восстановиться самостоятельно. Если в течение этой задержки всё восстановится, алерт отправлен не будет. Но если она не восстановится, тогда уже будут затронуты все каналы связи. Например, как у нас сейчас:

Переключаемся на Telegram канал и, - Вуаля! Вот и наш алерт:

Если мы запустим всё заново, инстанс проснулся и мы видим Ok:

А графана в свою очередь прислала сообщение, что всё отрезолвилось:

Но знаете ли вы, что можно мониторить не только эти скучные системные показатели?

Конечно же, буквально по тому же принципу вы можете навесить алерты и на кликхаус, и мониторить, например, количество денег в статистике в минуту.

Достаточно лишь превратить ваш бизнес-показатель в панель в графане, и вы с лёгкостью навесите алерты и на него. А разными каналами алертинга или contact pointами вы сможете одни алерты направить в один чат, а другие – в другой.

Заключение

Графана – невероятно гибкая и мощная система визуализации. Она покрывает потребности как умного дома, так и какого-нибудь огромного гео-распределённого кластера.

Огромное спасибо за то, что дочитали до конца, удачи вам и прозрачной работы вашим микросервисам!