Перейти к содержанию

6. Grafana (визуализация)


Prometheus хранит метрики и считает алерты, но без дашбордов сложно держать в голове картину системы. Grafana — стандартная оболочка: datasource на Prometheus, дашборды с PromQL, переменные для окружений и узлов, при необходимости — алертинг. Ниже — как связать компоненты, чем отличаются алерты Grafana и Alertmanager, и как собрать панели для ноды, приложения и кластера Kubernetes.


Datasource Prometheus

Параметр Production-комментарий
URL Внутрикластерный http://prometheus-operated:9090 или сервис с mTLS/NetworkPolicy
Access Server (Grafana backend ходит в Prometheus) чаще, чем Browser
Auth Basic/mTLS при внешнем Prometheus; в K8s — сервисный аккаунт / sidecar
timeInterval Согласовать с scrape_interval (например 30s), чтобы UI не «дёргал» тяжёлее реальности

Провижининг datasource (файл)

# provisioning/datasources/prometheus.yaml
apiVersion: 1
datasources:
  - name: Prometheus
    uid: prom-main
    type: prometheus
    access: proxy
    url: http://kube-prom-kube-prometheus-prometheus.monitoring.svc:9090
    isDefault: true
    jsonData:
      httpMethod: POST
      timeInterval: 30s
    editable: false

Комментарий: url и имя сервиса зависят от релиза Helm; зафиксируйте UID datasource — он нужен в JSON дашбордов при экспорте.


Dashboards: структура

  • Row — логическая группа панелей (Node / App / K8s).
  • Panel — тип Time series, Stat, Gauge, Table; запросы на PromQL.
  • Repeat панели по переменной (например по всем instance).

Best practices:

  • дашборды хранить в Git (json или as-code Grizzly/Terraform);
  • общие панели — библиотечные panel library (Grafana 10+);
  • не дублировать один и тот же тяжёлый запрос в 20 виджетах — вынести в recording rule.

Variables (переменные)

Тип Применение
Query Список namespace, pod, instance из label_values(...)
Custom Фиксированный список сред (prod, stage)
Interval Динамический $__interval для rate() в зависимости от масштаба графика

Примеры Query variable:

label_values(node_uname_info, nodename)
label_values(kube_namespace_labels, namespace)

В панелях используйте $instance, $namespace в PromQL:

100 - (
  avg by (instance) (rate(node_cpu_seconds_total{instance=~"$instance",mode="idle"}[$__rate_interval])) * 100
)

Комментарий: $__rate_interval удобен во встроенных дашбордах Grafana для согласования с zoom; иначе фиксируйте [5m] осознанно.


Алертинг: Grafana vs Prometheus

Аспект Prometheus + Alertmanager Grafana alerting
Источник правил prometheus.yml / recording+alert rules UI или provisioning
Маршрутизация Alertmanager (inhibit, silence) Contact points, mute timings
Мульти-дatasource Нет (только метрики Prom) Да (Loki, CloudWatch…)
Типичный выбор в prod Инфраструктурные SLO, единый on-call поток Продуктовые панели, составные условия

Best practice: не создавать две копии одного и того же критичного условия без согласования — иначе двойные звонки. Часто: алерты данных в Prometheus, визуализация запасов и аннотации в Grafana.


Практика: собрать дашборд

Блок «Node metrics»

Панель Идея PromQL
CPU 100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[$__rate_interval])) * 100
RAM 100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
Диск 100 - ((node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100)

Блок «App metrics»

Панель Идея PromQL
RPS sum by (job) (rate(http_requests_total[$__rate_interval]))
Ошибки 5xx sum(rate(http_requests_total{status=~"5.."}[$__rate_interval])) / sum(rate(http_requests_total[$__rate_interval]))
Latency p95 histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[$__rate_interval])))

Блок «Kubernetes cluster» (kube-state-metrics / cAdvisor)

Панель Идея PromQL
Pods not Ready sum by (namespace) (kube_pod_status_phase{phase!~"Running|Succeeded"})
CPU по namespace sum by (namespace) (rate(container_cpu_usage_seconds_total{container!=""}[$__rate_interval]))
Рестарты increase(kube_pod_container_status_restarts_total[$__rate_interval])

Имена метрик зависят от версии kube-state-metrics и cadvisor — подставьте свои после Metrics explorer в Prometheus.


Production checklist

# Практика
1 SSO (OIDC/LDAP) и роли Viewer/Editor по командам
2 Запрет anon доступа в prod
3 Бэкап SQLite/БД Grafana или только Git-as-source для дашбордов
4 Тяжёлые запросы → recording rules
5 Переменные без «All» на огромных кластерах без лимита — риск таймаутов

Дополнительные материалы