Мне внедрили Grafana: что она показывает и зачем нужна проекту
Как устроена Grafana, чем она полезна владельцу проекта и команде, какие метрики смотреть и как отличить работающий мониторинг от красивых графиков
В этой статье
Мне внедрили Grafana: что она показывает и зачем нужна проекту
Мне внедрили Grafana. Это хороший повод разобраться, что именно появляется у проекта вместе с таким инструментом: какие вопросы теперь можно задавать системе и на какие ответы рассчитывать.
Открытая в браузере страница с графиками сама по себе ничего не гарантирует. Сервис может показывать зелёный статус, пока пользователи не могут завершить нужное действие. И наоборот: высокая нагрузка на сервер не обязательно означает аварию. Польза начинается там, где понятно, что измеряет каждый показатель и как он связан с работой продукта.
Grafana помогает увидеть эти показатели вместе, изучить их историю и настроить уведомления. Но чтобы понимать её возможности, сначала нужно отделить саму Grafana от систем, которые поставляют ей данные.
Что такое Grafana и откуда в ней берутся цифры
Grafana — платформа для запросов, визуализации и анализа данных, а также настройки оповещений. Чаще всего её используют для наблюдения за приложениями и инфраструктурой: сайтами, API, ботами, базами данных, серверами и фоновыми задачами.
В браузере пользователь видит дашборд — экран с несколькими панелями. Одна панель показывает время ответа, другая — ошибки, третья — очередь заданий. Для каждой можно выбрать период, а весь дашборд настроить так, чтобы переключаться между сервисами или окружениями.
За этими панелями стоят источники данных. Grafana отправляет им запросы и отображает результаты. В типичной установке метрики собирает и хранит Prometheus, логи — Loki, трассировки — Tempo. Это отдельные продукты; устанавливать их все ради первого дашборда необязательно. Grafana также подключается к PostgreSQL, MySQL и другим поддерживаемым источникам.
Ниже — пример связки с метриками, а не обязательная схема для любого проекта:
flowchart LR
A[Приложение и сервер] -->|Предоставляют метрики| B[Prometheus]
B -->|Результаты запросов| C[Grafana]
C --> D[Дашборды и исследование данных]
C --> E[Проверка правил оповещения]
E --> F[Уведомление ответственному]
Если приложение не измеряет время выполнения нужной операции, Grafana не узнает его самостоятельно. Если история в источнике хранится недолго, нельзя получить из неё график за прошлый год. Если сбор данных остановился, интерфейс может по-прежнему открываться, но свежих показателей не будет.
Сама Grafana хранит собственные настройки, дашборды и другие служебные данные. Это не делает её основным хранилищем всей телеметрии. У Grafana Cloud есть управляемые сервисы хранения, однако это уже облачная платформа, а не только приложение для визуализации.
Что мне даёт такое внедрение
Для владельца проекта Grafana полезна прежде всего как способ обсуждать состояние продукта предметно. Необязательно самостоятельно писать запросы к метрикам, чтобы читать дашборд и задавать вопросы команде.
Вместо «почему всё медленно?» можно уточнить: какие операции стали медленнее, с какого момента, затронуты ли все пользователи, выросла ли доля ошибок? Вместо «нам нужен сервер помощнее» — посмотреть, какой ресурс ограничивает работу и есть ли признаки, что увеличение сервера решит проблему.
Это не обещание, что после установки все ответы уже доступны. Возможности зависят от подключённых данных. Но именно такие вопросы стоит использовать при приёмке внедрения: может ли команда ответить на них с помощью подготовленных экранов?
Другой полезный сценарий — проверка изменений. После выпуска новой версии можно сравнить показатели до и после: не выросли ли ошибки, не увеличилось ли время обработки, не начала ли накапливаться очередь. У графиков должен быть контекст: сопоставимая нагрузка, одинаковое определение метрики, отметка о времени релиза. Иначе легко принять обычный вечерний пик за результат обновления.
Grafana также позволяет вернуться к уже закончившемуся сбою. Когда проблема исчезла сама или сервис перезапустили, текущее состояние мало что объясняет. Сохранённая история помогает восстановить последовательность событий — если нужные данные собирались в тот момент.
Сервер работает. А продукт?
Одна из ловушек мониторинга — следить только за процессором, памятью и диском. Эти показатели нужны для диагностики, но они не отвечают на главный вопрос: получает ли пользователь нужный результат?
Сервер может быть доступен, а отправка сообщений — не работать. API может возвращать HTTP 200, а созданный заказ — оставаться без обработки. Проверка /health, которая сообщает только о запущенном процессе, не подтверждает исправность всей цепочки.
Поэтому рядом с внутренними метриками стоит использовать внешние проверки: они обращаются к сервису снаружи и оценивают доступность или выполнение выбранного сценария. Сложный сценарий требует аккуратной настройки, особенно если затрагивает оплату или реальные данные. Но даже простая внешняя проверка дополняет картину, которую сервер сообщает о себе.
Для сервисов, отвечающих на пользовательские запросы, в практике Google SRE выделяют четыре основных сигнала: время ответа, трафик, ошибки и насыщение ресурсов. На их основе удобно строить первый экран.
| Что наблюдать | Какой вопрос это закрывает | На что обратить внимание |
|---|---|---|
| Время ответа | Насколько быстро выполняется операция? | Разделять операции и успешные ответы с ошибочными; смотреть распределение задержек |
| Трафик | Сколько работы приходит в систему? | Учитывать суточный ритм; неожиданный спад тоже бывает признаком проблемы |
| Ошибки | Какая часть операций заканчивается неудачей? | Смотреть долю ошибок вместе с количеством попыток и учитывать бизнес-ошибки |
| Насыщение ресурсов | Есть ли ограничение, мешающее обрабатывать работу? | Проверять очереди, пулы соединений, память, диск и другие ресурсы конкретного сервиса |
Для фоновых задач приоритеты будут другими. Важны время последнего успешного выполнения, длительность обработки и возраст ожидающих заданий. Если задача должна запускаться по расписанию, отсутствие ошибок ещё не означает успех: возможно, она вообще не стартовала. Prometheus отдельно описывает такие различия в рекомендациях по инструментированию.
Почему среднее время ответа может обманывать
На дашборде легко разместить одну цифру: среднюю задержку. Но за ней могут скрываться запросы, которые выполняются гораздо дольше остальных.
Для оценки распределения используют перцентили. p95 — значение, ниже которого находится примерно 95% измеренных задержек; p99 характеризует ещё более медленную часть распределения. Эти показатели считаются для выбранных операций и временного окна. Они не означают, что ровно такая доля пользователей довольна скоростью: один пользователь может сделать несколько запросов, а часть задержек клиент вообще не увидит.
Если среднее почти не изменилось, а p99 вырос, повод для расследования уже есть. Медленные запросы могут относиться к определённой операции, одному экземпляру приложения или обращениям к внешнему сервису. Общий график помогает заметить изменение, но дальше нужен разрез по тем данным, которые собираются.
Здесь есть техническое ограничение. Нельзя просто усреднить готовые p95 нескольких серверов и получить корректный p95 всего сервиса. Для объединения распределений обычно используют гистограммы; точность расчёта зависит от их устройства. В документации Prometheus этому посвящён отдельный разбор гистограмм и summaries.
Для читателя дашборда практический вопрос проще: «Это среднее, перцентиль или максимум? За какой период и по каким операциям?» Без этих уточнений сравнивать цифры рискованно.
Метрики, логи и трассировки нужны для разных вопросов
Когда график показывает отклонение, следующим шагом обычно становится разбор отдельных событий. Поэтому полезно различать три типа данных.
| Тип данных | Что в нём содержится | Пример вопроса |
|---|---|---|
| Метрики | Числовые показатели во времени | Когда выросла доля неудачных запросов? |
| Логи | Записи о событиях приложения | Какое сообщение об ошибке появилось при обработке? |
| Трассировки | Путь конкретного запроса по операциям и сервисам | На каком шаге запрос провёл больше всего времени? |
Метрики подходят для общей картины и уведомлений. В логах можно найти подробности ошибки. Трассировка помогает разобрать запрос, который проходит через несколько компонентов: приложение, базу данных, внешний API.
Переходы между этими данными требуют настройки. Например, чтобы из трассировки открыть связанные логи, в них нужны подходящие идентификаторы, а в Grafana — соответствующие связи. Наличие трёх источников в меню ещё не означает, что данные сопоставляются автоматически. Возможности подключения и корреляции описаны в документации источников данных.
Для небольшого проекта разумно начать с метрик и тех логов, которые нужны при сбоях. Трассировки добавляют, когда без них трудно понять путь запроса, а не ради полноты списка инструментов.
Как разбирать жалобу «бот отвечает медленно»
Рассмотрим учебный сценарий, не историю моего внедрения. Есть бот, который принимает сообщения, выполняет обработку и обращается к внешнему API. Пользователи сообщают о задержках.
Сначала нужно зафиксировать время жалобы и уточнить, что именно не сработало: бот долго начинал обработку, долго готовил ответ или не отправлял его вовсе. После этого в Grafana выбирают соответствующий период с небольшим запасом до начала проблемы.
На общем дашборде проверяют входящий поток, время обработки и ошибки. Если сообщений стало больше и растёт очередь, проверяют способность обработчиков справляться с нагрузкой. При этом длина очереди без возраста заданий малоинформативна: большая очередь может быстро разбираться, а небольшая — содержать давно зависшие задания.
Если поток сообщений не изменился, но увеличилась длительность внешних вызовов, следующий участок для проверки — интеграция. Полезно посмотреть тайм-ауты, ограничения частоты запросов и ответы API. Нормальная загрузка процессора такую проблему не исключает: приложение может тратить время на ожидание.
Затем в логах ищут ошибки за тот же период. Если настроены трассировки, разбирают отдельные медленные запросы. Время релиза или изменения конфигурации сопоставляют с началом задержек, но совпадение само по себе ещё не доказывает причину.
После исправления смотрят не только на исчезновение уведомления. Нужно проверить, что нужный сценарий снова выполняется, задержки вернулись к приемлемому уровню, а накопившиеся задания обработаны. Если метрики успокоились потому, что пользователи перестали отправлять сообщения, это не восстановление сервиса.
Такой разбор возможен лишь при наличии измерений каждого существенного этапа. Один график CPU не позволяет восстановить всю цепочку работы бота.
Как читать дашборд и не сделать неверный вывод
Первые проверки в Grafana часто касаются не самой неисправности, а выбранного представления данных.
Период и окружение. Убедитесь, что открыт нужный сервис, production, а не тестовый стенд, и интервал, в который произошла проблема. При совместном разборе лучше передавать ссылку с зафиксированным временем, а не просить коллегу посмотреть «последний час»: через некоторое время это будет уже другой час. Часовой пояс тоже должен совпадать.
Свежесть данных. Пустая панель не равна нулевому значению. Возможно, источник недоступен, запрос не нашёл ряд или сбор остановился. Отдельно проверяют, когда пришли последние данные и не было ли разрывов. Особенно опасен экран, на котором отсутствие информации выглядит как нормальное состояние.
Агрегация. Общая доля ошибок может скрывать сбой одной операции. Средняя загрузка всех экземпляров — перегрузку одного из них. Для расследования нужны разрезы, но не бесконечное число панелей на первом экране.
Объём выборки. Доля ошибок без количества запросов вводит в заблуждение на малом трафике. Поэтому рядом нужны абсолютное количество событий и временное окно расчёта. Аналогично, перцентиль по небольшой выборке нельзя интерпретировать так же уверенно, как по большому потоку.
Единицы измерения. Секунды и миллисекунды, байты и мегабайты, процент и доля должны быть явно подписаны. Настройка панели меняет отображение; она не исправляет ошибочное определение метрики.
Есть ещё разница между счётчиком и текущим значением. Счётчик всех запросов растёт с момента запуска процесса и может сброситься при перезапуске. Чтобы показать интенсивность потока, рассчитывают скорость его прироста. А текущую длину очереди или свободную память показывают как состояние. Запросы для этих случаев различаются, даже если внешне обе панели рисуют линию.
Уведомления, на которые действительно будут реагировать
Следить за Grafana весь день не требуется. Система оповещений периодически проверяет заданные условия и направляет уведомления через настроенные каналы. Дашборд для этого не должен быть открыт в браузере.
Но уведомление «CPU выше порога» не всегда требует срочной реакции. Если сервис выполняет полезную работу и пользователи получают ответы вовремя, такой сигнал может быть информацией для анализа. А сбой пользовательского сценария при низкой загрузке способен требовать немедленного вмешательства.
Поэтому срочность выбирают по последствиям и доступному времени на действие. Нехватка диска, например, может заслуживать предупреждения до того, как начались отказы. Для неё важны свободное место, темп роста и запас времени, а не только один процент заполнения.
У полезного алерта есть:
- понятное описание нарушенного условия и затронутого сервиса;
- временное окно, выбранное с учётом кратковременных всплесков;
- ответственный и канал, который он действительно проверяет;
- ссылка на нужный дашборд;
- инструкция первых действий — её часто называют runbook.
Для связанных сбоев стоит настроить группировку, чтобы один инцидент не создавал десятки отдельных сообщений. На плановые работы используют временное отключение уведомлений. В Grafana это не обязательно прекращает проверку самого правила: подавление доставки и оценка состояния — разные действия. Эти механизмы описаны в Grafana Alerting.
Отдельно задают поведение при отсутствии данных и ошибке запроса. Если источник перестал отвечать, нельзя без обсуждения считать сервис исправным. При этом не нужно превращать любую пропавшую метрику в ночной вызов: решение зависит от того, какую проверку потеряла команда.
Внедрение стоит завершать проверкой всей цепочки. В безопасном тестовом сценарии создают условие срабатывания, убеждаются, что правило его обнаружило, уведомление дошло до ответственного, а после устранения состояние изменилось ожидаемым образом. Тестовая отправка сообщения подтверждает канал доставки, но не проверяет само правило.
Когда появляется SLO
По мере развития проекта вопрос «всё ли нормально?» лучше заменить договорённостью о приемлемом качестве.
SLI — измеряемый показатель качества, например доля успешно обработанных операций. SLO — целевое значение этого показателя за определённый период. SLA — соглашение об уровне обслуживания, которое может содержать обязательства и последствия их нарушения. Внутренний SLO не становится SLA автоматически.
Для бота показатель может учитывать успешную обработку сообщения и время до ответа. Для фоновой загрузки данных — завершение задачи в согласованный срок. Определение должно соответствовать тому, что важно пользователю, а не тому, что проще показать на графике.
В запросном SLO бюджет ошибок рассчитывают по операциям. В SLO, основанном на времени доступности, — по времени. Переводить одну модель в другую без оговорок нельзя: короткий сбой в часы пикового трафика и такой же сбой ночью затронут разное количество запросов.
Grafana позволяет отображать такие показатели при наличии нужных данных и запросов. Саму цель, границы измерения и правила исключений выбирает команда. Обещание «сделать SLO» без определения успешной операции и периода расчёта ещё не даёт проверяемого результата.
Цена мониторинга: платить приходится не только за Grafana
У Grafana есть открытая версия, которую можно размещать самостоятельно, коммерческая Enterprise-редакция и облачная платформа Grafana Cloud. Они различаются возможностями и тем, кто обслуживает компоненты. Наличие плагина или функции стоит проверять для выбранной редакции; интерфейс из чужой инструкции может не совпадать с вашим.
При самостоятельном размещении остаются затраты на инфраструктуру, обновления, хранение и работу команды. В облаке часть этих задач берёт на себя поставщик, но нужно учитывать модель оплаты, объём данных и требования к их размещению. Конкретные тарифы и лимиты меняются, поэтому рассчитывать стоимость следует по актуальным условиям и реальному потоку телеметрии.
Самые заметные источники роста затрат — длительное хранение, подробные логи, большое число временных рядов и тяжёлые запросы. Частое обновление множества панелей тоже нагружает источники данных. Если дашборд обращается к рабочей SQL-базе, запросы мониторинга не должны мешать самому продукту.
Число рядов связано с метками. Название сервиса, окружение или класс результата помогают группировать метрики. Но идентификатор каждого пользователя, уникальный request ID или полный URL с произвольными параметрами создают множество комбинаций. Это называют высокой кардинальностью. Такие подробности чаще уместны в логах и трассировках, с учётом ограничений хранения и приватности, чем в метках агрегированных метрик.
Хранить всё навсегда тоже не требуется. Сроки выбирают под задачи: расследование недавних сбоев, сравнение релизов, сезонные изменения. Если данные не используются ни для решений, ни для диагностики, ни для оповещений, стоит пересмотреть необходимость их сбора.
Доступ к дашборду — это доступ к данным
В метриках и логах могут оказаться персональные данные, тексты сообщений, токены, внутренние адреса или финансовые показатели. Публичный дашборд способен раскрыть больше, чем кажется по его названию.
Поэтому внедрение включает настройку аутентификации, сетевого доступа и прав. Секреты не должны попадать в логи, а для подключения к базе нужны отдельные учётные данные с минимальными правами. Принцип «только чтение» уменьшает риск изменения данных, но сам по себе не ограничивает чтение чувствительных таблиц.
У Grafana есть важная особенность: доступ к определённому дашборду не следует считать полноценной границей доступа к его источнику. Согласно документации, по умолчанию пользователи организации, включая роль Viewer, могут выполнять запросы к источникам, а не только просматривать запросы на доступных панелях. Дополнительные разрешения на источники данных доступны в Enterprise и Cloud.
Если группы пользователей должны видеть разные данные, изоляцию проектируют отдельно. Спрятанная панель или фильтр по умолчанию не заменяют ограничений в источнике и проверенной схемы доступа.
Нужно также наблюдать за самим мониторингом. Если приложение и все средства его проверки зависят от одного сервера, при его отказе можно потерять одновременно и сервис, и сигнал о сбое. Хотя бы критическую внешнюю проверку стоит рассматривать отдельно от наблюдаемой системы.
Что спросить у команды после внедрения
Для приёмки не требуется проверять каждую настройку Grafana. Нужна демонстрация того, что система помогает решать задачи проекта.
- Какой дашборд открывать первым и что означают его показатели?
- Есть ли проверка нужного пользовательского сценария, а не только состояния сервера?
- Какие источники подключены и сколько истории сохраняется?
- Как распознать устаревшие или отсутствующие данные?
- Можно ли разобрать проблему за конкретный прошлый период?
- Как перейти от общей метрики к данным для диагностики?
- Кому приходят критические уведомления и что делать после их получения?
- Проверено ли срабатывание правила вместе с доставкой уведомления?
- Кто обновляет Grafana, источники, дашборды и правила при изменении приложения?
- Можно ли восстановить настройки после потери установки?
- Проверены ли права доступа и состав чувствительных данных?
Для восстановления пригодятся сохранённые конфигурации и дашборды, а также резервные копии там, где они нужны. Grafana поддерживает управление частью настроек через provisioning; это позволяет воспроизводить конфигурацию, а не собирать её заново по памяти. Секреты при этом должны храниться отдельно от публикуемых файлов.
Если проект небольшой, начинать можно с одного дашборда, внешней проверки критического сценария и нескольких уведомлений с ясным назначением. Сложный набор хранилищ, трассировок и правил оправдан тогда, когда у него есть конкретные задачи и владелец.
На демонстрации внедрения попросите команду провести один безопасный учебный сбой от начала до конца: обнаружить его, получить уведомление, найти затронутый участок и показать восстановление пользовательского сценария.