Grafana и визуализация данных
(Раздел: Технологии и Инфраструктура)
Краткое резюме
Grafana — витрина всей наблюдаемости: метрики, логи, трассировки, бизнес-показатели и алерты в одном месте. Для iGaming это: мониторинг p95/p99, конверсия платежей, Time-to-Wallet, доступность провайдеров игр, гео-распределение инцидентов и сравнение релизов (stable vs canary). Успех: шаблоны (переменные), понятные панели, аннотации релизов, SLO-дашборды и дисциплина прав доступа.
1) Архитектура подключений
Datasources: Prometheus (метрики), Loki/ELK (логи), Tempo/Jaeger (трейсы), ClickHouse/BigQuery/PG (бизнес-данные), OTLP через Gateway.
Ключевые связи: из метрики → exemplar → trace → связанные логи по `trace_id`.
Папки и RBAC: отдельные папки `SRE`, `Payments`, `Risk`, `Games`, `BizOps`; роли `Viewer/Editor/Admin` и granular permissions.
2) Дизайн дашбордов: принципы
1. Ответ на вопрос за 1–2 клика: от SLO-карты к деталям.
2. RED/USE по каждому сервису + доменные карточки (TTW, конверсия депозитов).
3. Стабильная сетка: 24-колоночная, крупные KPI сверху, детали снизу.
4. Цвета и пороги: минимум, только по SLA/SLO.
5. Аннотации релизов: Git SHA, версия, тип релиза (canary/blue-green).
3) Переменные и темплейты (templating)
Переменные превращают один дашборд в много.
Пример (Prometheus query-variable):- Name: `service`
- Query: `label_values(up, service)`
- Multi-select + include all — удобно для агрегатов.
- `region` → `env` → `service` → `instance`.
- Используйте `regex`/`sort` для UX и `refresh: On dashboard load`.
4) Панели и типы визуализации
Time series: p50/p95/p99, error-rate, throughput.
Stat/Gauge: целевые KPI (availability, TTW p95).
Bar gauge/Table: топ-N маршрутов/PSP/провайдеров игр.
Geomap: тепловые карты инцидентов/латентности по странам/POP.
Canvas: схематичные потоки (Player → API → PSP → Bank).
Node graph: зависимости сервисов, окраска по ошибкам.
- Labels to fields, Outer join (склейка метрик и бизнес-таблиц), Reduce (мин/макс/avg), Add field from calculation (конверсия).
5) Примеры запросов и панелей
5.1 p95 latency (PromQL)
promql histogram_quantile(0. 95,
sum by (le, route) (rate(http_request_duration_seconds_bucket{service="$service",region="$region"}[5m]))
)
5.2 Успешность запросов (SLO proxy)
promql sum(rate(http_requests_total{service="$service",status=~"2.. 3.."}[5m]))
/
sum(rate(http_requests_total{service="$service"}[5m]))
5.3 Конверсия платежей (PromQL агрегат)
promql sum(rate(payments_success_total{psp=~"$psp",currency=~"$currency"}[15m]))
/
sum(rate(payments_attempt_total{psp=~"$psp",currency=~"$currency"}[15m]))
5.4 Быстрый прыжок в трассу (exemplars)
В панели `Time series` включите Exemplars → клик по точке → открывается Tempo с `trace_id`.
5.5 Логи по trace_id (Loki)
logql
{service="$service"} = "$traceID"
6) Аннотации и события
Release annotations: авто-добавление события при деплое (версия, автор, канареечный вес).
Incident/Freeze: отметки начала/конца инцидента и окна заморозки релизов.
Бизнес-события: крупные кампании/турниры — помечайте на графиках.
7) Алерты в Grafana
Alert rules централизованно (на базисе Prometheus/Loki/Cloud).
Contact points: PagerDuty/Slack/Email; Notification policies (рутинг по папке/тегам).
Multi-window burn-rate: быстрая и медленная прожарка бюджета.
Silences: в плановые окна и при дубликатах.
promql histogram_quantile(0. 95,
sum by (le, service) (rate(http_request_duration_seconds_bucket{service="$service"}[5m]))
) > 0. 25
8) Провижининг как код (IaC)
Храните источники/дашборды/алерты в Git.
datasource.yaml
yaml apiVersion: 1 datasources:
- name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true
- name: Loki type: loki url: http://loki:3100
- name: Tempo type: tempo url: http://tempo:3100
dashboard.yaml
yaml apiVersion: 1 providers:
- name: sres folder: SRE type: file disableDeletion: false options:
path: /var/lib/grafana/dashboards/sre
grafana.ini (фрагмент)
ini
[auth]
disable_login_form = false
[users]
viewers_can_edit = false
[alerting]
enabled = true
[unified_alerting. screenshots]
capture = true
9) Безопасность и доступ
SSO (OIDC/SAML), группы → роли → папки.
Права на datasources: только нужным папкам, read-only для Viewer.
PII-гигиена: не тянуть поля с PII в панели; для логов — фильтруйте/маскируйте.
Секреты: только через Vault/secure JSON fields, без «плэйн-текста» в дашбордах.
10) Производительность и стоимость
Recording rules в Prometheus для тяжелых выражений.
Downsampling/Retention в бэкендах длительного хранения.
Кэш дашбордов и честные интервалы (не «1s» везде).
Ограничение кардинальности переменных (не подставляйте `user_id`/`session_id`).
Перераспределение: отдельные инстансы/фолдеры для шумных команд.
11) Специализированные дашборды для iGaming
Payments: попытки/успех/TTW p95, ошибка по PSP/маршруту, гео-карта отклонений.
Games/Providers: latency и error-rate по студиям/играм, конверсия запуска.
Risk/Fraud: скорость действий, всплески устройств/IP, корреляции (таблица + бар-гейдж).
RG/Compliance: сессии > порога, рост стейков, алерты по аномалиям.
Release Compare: стабильная vs канареечная по p95/error/бизнес-метрикам.
Infra/USE: Utilization/Saturation/Errors по кластерам и очередям.
12) Пример JSON-дашборда (фрагмент)
json
{
"title": "Payments SLO",
"tags": ["slo","payments"],
"time": {"from":"now-6h","to":"now"},
"panels": [
{
"type":"stat",
"title":"Availability",
"targets":[{"expr":"sum(rate(http_requests_total{service=\"payments-api\",status=~\"2.. 3..\"}[5m]))/sum(rate(http_requests_total{service=\"payments-api\"}[5m]))"}],
"thresholds":{"mode":"absolute","steps":[{"color":"red","value":0},{"color":"green","value":0. 999}]}
},
{
"type":"timeseries",
"title":"p95 latency",
"exemplars": {"color":"rgba(31,120,193,0. 6)"},
"targets":[{"expr":"histogram_quantile(0. 95,sum by (le) (rate(http_request_duration_seconds_bucket{service=\"payments-api\"}[5m])))"}]
}
]
}
13) Runbooks и UX-улучшения
Каждому алерту — Runbook URL (инструкция действий).
Links на связанные дашборды (Payments ↔ Infra ↔ PSP).
Drilldown: клики по меткам → фильтры (region/psp/route).
Variables defaults: `env=prod`, `region=eu` — ускоряет старт.
14) Чек-лист внедрения
1. Настройте datasources: Prometheus/Loki/Tempo/SQL.
2. Введите папки и RBAC; аудит прав.
3. Создайте шаблонные переменные (region/env/service).
4. Постройте SLO-дашборды (availability, p95, error-rate, бюджет ошибок).
5. Добавьте аннотации релизов и сравнение stable/canary.
6. Включите exemplars и переход к трассам/логам по клику.
7. Настройте алерты (multi-window burn-rate) и рутинг.
8. Провизионьте все как код, храните в Git, делайте ревью.
9. Оптимизируйте производительность: recording rules, интервалы, кэш.
10. Введите бизнес-дашборды (TTW, конверсия платежей, GGR-карточки).
15) Антипаттерны
«Зоопарк» несогласованных дашбордов без переменных и стандартов.
Панели с тяжелыми PromQL без recording rules → медленный UI.
Переизбыток цветов/легенд/ось-Y с разными шкалами.
Подключение PII в панели, открытые для Viewer.
Отсутствие аннотаций релизов — непонятно, откуда скачки.
Один «моновью» дашборд вместо фолдерной структуры.
Итоги
Grafana — интерфейс, где техника встречается с продуктом: метрики, логи и трассы соединяются с бизнес-картинами. Шаблоны, корректные панели, аннотации и алерты превращают данные в решения: быстрый диагноз, предсказуемые релизы и управляемая стоимость наблюдаемости.