Grafana — дашборды и визуализация
Grafana — платформа для визуализации и мониторинга. Она собирает данные из десятков источников — Prometheus, Elasticsearch (см. ELK), баз данных, облаков — и превращает их в живые дашборды, статистику и алерты.
1. Что такое Grafana
- единая точка для всех метрик организации;
- декларативное описание панелей и алертов;
- роли и ограничение доступа для команд;
- provisioning — конфигурация из файлов, как код.
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 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: @timestampSQL
Type: PostgreSQL
Host: db:5432
Database: metrics4. Панели и дашборды
График строится вручную или импортом готовых дашбордов из графановской библиотеки.
// типовой запрос для панели (PromQL)
rate(node_network_receive_bytes_total[5m])Типы визуализаций: graph, bar chart, gauge, heatmap, stat, table, logs.
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, PagerDuty7. Пользователи и роли
| Роль | Возможности |
|---|---|
| Viewer | только просмотр |
| Editor | редактирование дашбордов и панелей |
| Admin | полный доступ, настройки и пользователи |
Для доступа к одной панели без входа можно создавать snapshot'ы и public dashboards.
8. Provisioning — как код
Датасорсы и дашборды можно описывать файлами. Каталог /etc/grafana/provisioning:
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: trueproviders:
- 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 отправляется в APIcurl -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 | управление источниками данных |
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)13. Продвинутые панели и преобразования
Ключевая фишка Grafana'овских панелей — Transforms (преобразования данных) и вычисляемые поля:
panel "Таблица продаж":
- Query: TOBS (order, total)
- Transform: Organize/rename columns
- Transform: Merge rows
- Field compute: прибыль = total - cost- Join — склейка нескольких запросов по ключу;
- Group by — агрегация по значению лейбла;
- Reduce — превращение серии в скаляр (среднее, макс);
- Thresholds — цветовая подсветка по порогам значений.
// пример поля с порогом:
if total_n > 5000 then "ОК" else "Смотреть"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" роль ограничена)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, а переменные — нет.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, значения — просто читают.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) — так панели читаются без словаря.18. Типовые ошибки и чек-лист дашборда
- лейблы с высокой кардинальностью (uid запросов, временные значения) — «кардинальный шторм» и рост памяти;
- алерты без периода и эскалации — alarm fatigue и ночные звонки по мелочи;
- окно запроса не согласовано со scrape interval — «рваный» график;
- панели без единиц и пояснений — непонятно, какой уровень «хороший»;
- оставленный пароль admin/admin — первое, что проверяет атакующий.
Чек-лист перед выдачей дашборда: четыре сигнала на месте, переменные вместо хардкода хостов, у каждой панели — единицы и описание, алерты с действием (уведомление → эскалация), provisioning лежит в Git, права разложены по папкам.
Что дальше
Подключи Prometheus из урока Prometheus, логи — из ELK, и разверни всё в Docker. Обзор курсов — на главной странице.