Grafana — дашборды и визуализация

Продолжительность: 18 уроков · Уровень: средний

Grafana — платформа для визуализации и мониторинга. Она собирает данные из десятков источников — Prometheus, Elasticsearch (см. ELK), баз данных, облаков — и превращает их в живые дашборды, статистику и алерты.

1. Что такое Grafana

2. Установка

# apt
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update && sudo apt-get install grafana
sudo systemctl enable --now grafana-server

Веб-интерфейс на http://localhost:3000 (логин по умолчанию admin / admin).

В Docker: docker run -d -p 3000:3000 grafana/grafana.
Смени пароль администратора сразу после первого входа.

3. Датасорсы

Датасорс — источник данных. Подключение: меню Configuration → Data Sources → Add data source.

Prometheus

URL: http://prometheus:9090
Authentication: none (внутри сети)

Elasticsearch

URL: http://elasticsearch:9200
Index pattern: filebeat-*
Time field: @timestamp

SQL

Type: PostgreSQL
Host: db:5432
Database: metrics

4. Панели и дашборды

График строится вручную или импортом готовых дашбордов из графановской библиотеки.

// типовой запрос для панели (PromQL)
rate(node_network_receive_bytes_total[5m])

Типы визуализаций: graph, bar chart, gauge, heatmap, stat, table, logs.

Любой график можно экспортировать как JSON и сохранить в Git — дашборд станет частью инфраструктуры как код.

5. Переменные

Переменные делают дашборд интерактивным (выбор хоста, среды, http status):

// переменная instance на основе меток
label_values(node_uname_info, instance)

// использование в запросе
rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m])

6. Алерты

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

// пример условия алерта
WHEN last() OF query (A, 5m, now) IS ABOVE 90

// каналы: email, Slack, Telegram, webhook, PagerDuty
Настраивай алерты только на проверенные запросы, иначе их будет слишком много («alarm fatigue») — и люди перестанут их читать.

7. Пользователи и роли

РольВозможности
Viewerтолько просмотр
Editorредактирование дашбордов и панелей
Adminполный доступ, настройки и пользователи

Для доступа к одной панели без входа можно создавать snapshot'ы и public dashboards.

8. Provisioning — как код

Датасорсы и дашборды можно описывать файлами. Каталог /etc/grafana/provisioning:

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
providers:
  - name: dashboards
    folder: Services
    type: file
    options:
      path: /var/lib/grafana/dashboards

После добавления файла перезапусти grafana-server.

9. Плагины

grafana-cli plugins install grafana-clock-panel
sudo systemctl restart grafana-server

Популярные: clock, status-history, worldping, инженерные панели.

10. Практический минимальный стек

---
version: "3.8"

services:
  prometheus:
    image: prom/prometheus
    volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"]

  node-exporter:
    image: prom/node-exporter

  grafana:
    image: grafana/grafana
    ports: ["3000:3000"]
    volumes: ["./provisioning:/etc/grafana/provisioning"]

11. Автоматизация дашбордов через API

Дашборды удобно хранить как JSON-код в репозитории и разворачивать через Terraform или напрямую через API. Панель экспортируется одной кнопкой:

Поделиться → Экспорт → Save to file
# файл dashboard.json отправляется в API
curl -X POST http://grafana:3000/api/dashboards/db \
  -H "Authorization: Bearer $GRAFANA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dashboard": { ... "uid": "my-dash", "title": "Прод" }}'
ЭндпоинтНазначение
/api/dashboards/dbсоздание/обновление дашборда
/api/dashboards/uid/{uid}чтение дашборда
/api/annotationsаннотации поверх графиков
/api/datasourcesуправление источниками данных
API-токен создавай с минимальными правами (Viewer/Editor дашбордов), а не административный: токен в репозитории — это постоянный доступ к метрикам инфраструктуры.
Интегрируй деплой дашбордов в конвейер: при обновлении метрик-инструментов изменения уезжают вместе с кодом, а не живут карманно у админа.

12. Логи в Grafana: Loki и Tempo

Помимо метрик, Grafana объединяет логи (Loki) и трейсы (Tempo). Loki индексирует только лейблы, поэтому лёгок для хранения:

docker run -d --name=loki -p 3100:3100 grafana/loki:3.3.0

// LogQL: выбрать логи по лейблу
{job="api"} |= "error"
{job="api"} |= "error" | logfmt | level = "warning"

Важное отличие от PromQL: выборка логируются через {лэйбл="значение"} в фигурных скобках, фильтры идут через пайпы |= и |.

sum(rate({job="api"}[5m])) by (level)
Строй алерты по агрегации логов: «счётчик level=error за 5 минут выше порога» — быстро ловит деградацию без специальных датчиков.
Связка метрика → лог → трейс: Grafana позволяет переходить из панели метрик в связанные логи Loki и трейсы Tempo без переключения интерфейса. Настраивается раз и служит линком в xs-панели.

13. Продвинутые панели и преобразования

Ключевая фишка Grafana'овских панелей — Transforms (преобразования данных) и вычисляемые поля:

panel "Таблица продаж":
  - Query: TOBS (order, total)
  - Transform: Organize/rename columns
  - Transform: Merge rows
  - Field compute: прибыль = total - cost
// пример поля с порогом: 
if total_n > 5000 then "ОК" else "Смотреть"
Преобразования делают панель быстрее, но хранение агрегаций прямо в PromQL почти всегда дешевле: применяй Transforms для веток «чёткой» визуализации, а не для пересчёта каждой метрики.
Stat и Time series — базовые панели. Для редко обновляемых данных ставь Reference line и Annotation: они объясняют читателю, где порог, а где — событие деплоя.

14. Права, папки и service account

Порядок в дашбордах начинается с папок и ролей. Собери структуру по командам:

Папки:
  /Прод-сервисы/api
  /Прод-сервисы/web
  /Служебное
Роли: Admin, Editor, Viewer

Доступы применяются на уровне папки и наследуются всеми дашбордами внутри:

Папка "Прод-сервисы" → Team "DevAPI" → Role Editor

Для автоматизации вместо «личного» токена пользователя создают service account — отдельную сущность с собственным правом и криптоключами:

Administration → Service accounts → Add service account
→ Generate a new API key ("server" роль ограничена)
Комментарий под токеном и последняя дата использования видны в консоли: следите за «умершим» токеном и ревьюируйте права раз в квартал.
Используй интервалы обновления панелей в зависимости от важности, а не «всё по свежему»: панель «сводка за месяц» в 5-секундном pull — лишняя нагрузка на бэкенд метрик.

15. Аутентификация и безопасность

Grafana умеет подключать корпоративные каталоги: LDAP, OAuth 2.0 (Google, Keycloak, GitHub), SAML (Azure AD). Это снимает управление паролями, а доступ назначается группами. Базовая настройка OAuth в grafana.ini:

[auth.ldap]
enabled = true
config_file = /etc/grafana/ldap.toml

[auth.generic_oauth]
enabled = true
name = Keycloak
client_id = grafana
client_secret = $GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET
scopes = openid email profile

Обязательные практики: сменить admin сразу после установки, спрятать Grafana за reverse-proxy с HTTPS (см. Nginx), не открывать порт 3000 наружу, закрепить версию образа.

Секрет client_secret задавай переменной окружения (GF_*), а не в файле конфигурации: файл легко попадает в Git, а переменные — нет.
Организации разграничивают команды на одном сервере; при открытом доступе включи подтверждение email и запрет саморегистрации.

16. PromQL: практика запросов

Язык запросов Prometheus — половина успеха любой панели. Ключевые функции:

ФункцияНазначение
rate(x[5m])средняя скорость за окно — для счётчиков
irate(x[5m])мгновенная скорость — видит резкие пики
increase(x[5m])прирост значения за окно
topk(5, x)первые N рядов по значению
histogram_quantileпроцентиль из гистограммы (задержки)
# RPS сервера
sum(rate(http_requests_total{instance="$instance"}[5m]))
# топ-5 хостов по трафику
topk(5, sum(rate(node_network_receive_bytes_total[5m])) by (instance))
# 95-й перцентиль задержки
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
rate и irate не применяют к gauge-метрикам: счётчики (нарастающие) считают через rate, значения — просто читают.
Окно запроса согласуй с частотой опроса (scrape interval) и целью: на алертах 5m и 1h решают разные задачи.

17. Мониторинг приложений: client-библиотеки

Сервис публикует метрики в формате Prometheus сам — в приложении подключают клиентскую библиотеку. Есть официальные пакеты для Go, Python, Java, Node.js. Пример на Python/FastAPI:

from prometheus_client import Counter
from prometheus_fastapi_instrumentator import Instrumentator
from fastapi import FastAPI

app = FastAPI()
Instrumentator().instrument(app).expose(app)
requests_total = Counter("app_requests_total", "Всего запросов")

@app.get("/order")
def create_order():
    requests_total.inc()
    return {"ok": True}

Достаточно добавить датасорс и собирать с /metrics малый набор ключевых метрик. Золотые четыре сигнала SRE: трафик (rate запросов), ошибки (error_rate), задержки (процентили), насыщение (нагрузка). Рабочий дашборд сервиса — это четыре таких ряда.

Именуйте метрики с префиксом приложения (app_...) и указывайте единицы (_seconds, _total) — так панели читаются без словаря.
Не пиши персональные данные в лейблы: уникальное значение лейбла — новый временной ряд, а карточки каждого пользователя увеличивают память Prometheus и всю цепочку хранения.

18. Типовые ошибки и чек-лист дашборда

Чек-лист перед выдачей дашборда: четыре сигнала на месте, переменные вместо хардкода хостов, у каждой панели — единицы и описание, алерты с действием (уведомление → эскалация), provisioning лежит в Git, права разложены по папкам.

Обновляй панели вместе с деплоем приложения: дашборд — это тоже код → PR, ревью, проверка на стенде, затем прод.
Регулярно смотри на панель «вживую»: визуализация, которую никто не открывает, умирает молча. Минимум — раз в месяц review ключевых дашбордов под ними.

Что дальше

Подключи Prometheus из урока Prometheus, логи — из ELK, и разверни всё в Docker. Обзор курсов — на главной странице.

← Вернуться к курсам