9. Производительность и best practices
Тяжёлый дашборд — это не только «долго крутится кружок»: он многократно бьёт по Prometheus, раздувает трафик и может уронить Grafana при одновременном открытии онколлом. Ниже — как оптимизировать запросы, держать кардинальность под контролем, проектировать дашборды без перегруза и снижать нагрузку на Prometheus.
См. также: производительность Prometheus.
Откуда берётся нагрузка
| Источник | Комментарий |
|---|---|
| Много панелей × много запросов | Каждый refresh дашборда = пачка запросов к TSDB |
| Высокая кардинальность | Сотни рядов на график → большой ответ и рендер |
| Слишком мелкий шаг | min step / разрешение времени ниже scrape_interval не даёт новой правды, но даёт нагрузку |
| Длинный time range | Больше точек, тяжелее агрегации |
Оптимизация запросов (Prometheus datasource)
Согласовать интервалы
В настройках datasource (JSON) полезно задать:
jsonData:
timeInterval: 30s # не чаще реального scrape_interval
queryTimeout: 60s # защита от «зависших» запросов
На панели: Query options → Min interval (или $__interval) — не форсировать 1s, если scrape 30s.
Упростить PromQL
| Было (тяжело) | Стало (легче) |
|---|---|
sum(rate(huge[5m])) без by на 10k контейнеров |
sum by (deployment) (...) + переменная $deployment |
Десятки or в одном запросе |
Несколько recording rules или отдельные панели |
histogram_quantile на сыром потоке с лишними лейблами |
Агрегат в recording rule (см. PromQL в Grafana) |
Комментарий: откройте Query inspector на панели и смотрите Stats (время, размер ответа).
Cardinality control в дашбордах
- Переменные: не включайте Multi + All на лейблах с тысячами значений без regex-фильтра.
topk/bottomkдля «топ N» вместо вывода всех серий.- Repeating panels — осторожно: N панелей × M запросов.
# Пример: только 10 самых нагруженных pod по CPU
topk(10, sum by (pod) (rate(container_cpu_usage_seconds_total{namespace="$ns"}[5m])))
Дизайн дашбордов: не перегружать
| Принцип | Смысл |
|---|---|
| Один экран — одна история | «Здоровье API» отдельно от «Ёмкость кластера» |
| 3–6 ключевых графиков вверху | Остальное — свернутые rows |
| Правильные агрегации | Для алертов/SLO — то же, что в recording rules, без расхождений |
| Лимит легенды | Скрыть лишние лейблы в легенде, Max data points в разумных пределах |
Anti-pattern: 40 панелей на одной вкладке «на всякий случай» — при инциденте всё равно смотрят 3–4.
Практика: ускорить «медленный» дашборд
- Query inspector на самой долгой панели — какой запрос, сколько серий.
- Сузить time range по умолчанию (например 6h вместо 30d для детальных рядов).
- Поднять Min interval до ≥ 2× scrape_interval.
- Вынести тяжёлый кусок в recording rule в Prometheus; в Grafana — один простой селектор.
- Убрать repeat или сократить число значений переменной.
Практика: снизить нагрузку на Prometheus
- Разнести «тяжёлые» дашборды по разным командам и расписаниям обновления (реже refresh у редко смотримых).
- Включить caching где поддерживается (зависит от архитектуры: query-frontend, Mimir, proxy).
- Alerting на длинных окнах не дублировать теми же тяжёлыми запросами, что и дашборд — вынести в recording rule.
# Пример recording rule (сторона Prometheus) — один раз считать, много панелей читают
groups:
- name: dashboard_helpers
interval: 1m
rules:
- record: cluster:container_cpu_usage:sum5m
expr: sum by (namespace) (rate(container_cpu_usage_seconds_total[5m]))
Grafana как сервис
| Ресурс | Замечание |
|---|---|
| CPU/RAM pod Grafana | Растёт с числом одновременных пользователей и сложностью рендера |
| БД Grafana (Postgres/SQLite) | Большое число избранного/истории — планировать retention и бэкап |
| Реплики | Несколько инстансов за LB при stateless + общая БД |
Чеклист
| # | Практика |
|---|---|
| 1 | timeInterval, timeouts, min interval согласованы со scrape |
| 2 | Тяжёлый PromQL → recording rules |
| 3 | Переменные и topk против взрыва кардинальности |
| 4 | Дашборды дробить по ролям и сценариям |
| 5 | Раз в квартал — «аудит» самых тяжёлых дашбордов по метрикам Ingress/Gateway и самого Prometheus |
Дополнительные материалы
- Optimize Prometheus queries
- Query optimization (официальная документация PromQL)
- Panel query options