Grafana: дашборды, источники (Prometheus, ClickHouse, Loki), алерты

↑ Этап 7 · Observability и эксплуатация

Желательно~6 мин чтенияУровень: middle+

Зачем это на собесе

Grafana — витрина данных мониторинга. Нужны дашборды «по делу», источники данных, алерты и provisioning как код.

Возможности

Визуализация метрик, логов и трейсов из разных источников в одном интерфейсе, дашборды, алерты, аннотации, explore, совместное использование и разграничение доступа.

Источники данных (data sources)

ИсточникДля чего
Prometheus / VictoriaMetrics / Mimir / Thanosметрики (PromQL)
Lokiлоги (LogQL)
Tempo / Jaegerтрассировки
ClickHouse (плагин)аналитика, логи/трейсы OTel, бизнес-данные (SQL)
PostgreSQL / MySQL / MSSQLбизнес-метрики из БД
Elasticsearch / OpenSearchлоги и поиск
CloudWatch, Azure Monitor, Google Cloudоблачные метрики
InfluxDB, Graphite, Zabbixдругие TSDB
Pyroscopeпрофили

Настройка: URL, авторизация, права только на чтение (отдельный пользователь/токен с минимальными правами), таймауты, Default.

Дашборды

Панели (Time series, Stat, Gauge, Bar, Table, Heatmap, Logs, Traces, State timeline) + строки + переменные ($env, $service, $instance, $__interval, $__rate_interval) + аннотации (релизы, инциденты).

# панель: RPS по сервису, выбранный $service
sum by (route) (rate(http_server_request_duration_seconds_count{service="$service"}[$__rate_interval]))
# p95
histogram_quantile(0.95, sum by (le) (rate(http_server_request_duration_seconds_bucket{service="$service"}[$__rate_interval])))

Переменные: Query (label_values(up, instance)), Custom, Interval, Datasource, Constant, Text; Multi-value/All, зависимость между переменными (цепочка env → service → pod).

Хороший дашборд: отвечает на вопрос (не «всё подряд»), сверху — обобщение (SLO, золотые сигналы, RED/USE), ниже — детали; единицы и пороги; одинаковые оси и цвета; ссылки (drill-down на логи/трейсы/runbook); не более 15–20 панелей; осмысленные названия и описания; уровни: обзор → сервис → инстанс/под.

Готовые дашборды: Node Exporter Full (ID 1860), Kubernetes (15757…), PostgreSQL (9628), Nginx, ClickHouse, Loki, cAdvisor; импорт по ID (Dashboards → Import) с последующей адаптацией.

Логи и трейсы в Grafana

Explore и панели Logs: запросы LogQL (Loki), ClickHouse SQL; связь: derived fields по trace_id → открыть трейс в Tempo; из трейса — логи по trace_id; метрики → примеры (exemplars) ведут на трейсы; «Correlations».

{namespace="clinic", app="api"} |= "error" | json | level="error" | line_format "{{.message}} trace={{.trace_id}}"
sum by (app) (rate({namespace="clinic"} |= "error" [5m]))

Alerting (Grafana Alerting)

Правила по любым источникам: выражение → условие → for → метки → контактные точки.

  • Alert rules (запросы + Reduce/Math/Threshold), состояния Normal/Pending/Firing/NoData/Error;
  • Notification policies: маршрутизация по меткам (severity, team), группировка, повторы, mute timings (окна тишины);
  • Contact points: Telegram, Slack, email, PagerDuty, Opsgenie, webhook;
  • Silences, шаблоны сообщений с ссылками на дашборд и runbook;
  • Multi-dimensional alerts: одно правило создаёт экземпляры на каждую серию;
  • в смешанных окружениях часто: Prometheus rules + Alertmanager для инфраструктуры и Grafana alerts для источников без PromQL (ClickHouse, SQL, облака).

Принципы: алертить на симптомы (влияние на пользователя) и критичные причины, с for: и понятным действием, ссылкой на runbook; избегать шума.

Provisioning как код

Дашборды, источники данных, алерты — в Git, а не кликами.

# provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    jsonData: { timeInterval: 30s, exemplarTraceIdDestinations: [{ name: trace_id, datasourceUid: tempo }] }
  - name: ClickHouse
    type: grafana-clickhouse-datasource
    jsonData: { host: clickhouse, port: 9000, username: grafana_ro, defaultDatabase: otel }
    secureJsonData: { password: "${CLICKHOUSE_PASSWORD}" }
  - { name: Loki, type: loki, url: "http://loki:3100", uid: loki }
# provisioning/dashboards/dash.yaml
apiVersion: 1
providers:
  - { name: clinic, folder: Clinic, type: file, options: { path: /var/lib/grafana/dashboards }, allowUiUpdates: false }

Способы хранения дашбордов: JSON в репозитории, grafonnet/Jsonnet, Grafana Terraform provider, Grafana Operator (Kubernetes CRD), Helm (kube-prometheus-stack — sidecar загружает ConfigMap с меткой grafana_dashboard: "1"). Экспорт JSON — «Share → Export → for sharing externally».

Доступ и безопасность

  • аутентификация: локальная, OIDC/SSO (Keycloak), LDAP; отключить анонимный доступ и регистрацию; роли (Admin/Editor/Viewer), организации и команды, папки с правами; service accounts и API-токены для автоматизации;
  • секреты источников хранить в secureJsonData/переменных окружения;
  • за reverse proxy с TLS (root_url, serve_from_sub_path); заголовки безопасности; ограничение iframe/публичных снапшотов;
  • SQL-источники: пользователь read-only, ограничения на тяжёлые запросы (таймауты, лимиты);
  • персональные данные в панелях логов — маскирование, ограничение доступа.

Эксплуатация

  • хранение: БД Grafana (SQLite по умолчанию; для HA — PostgreSQL/MySQL), бэкапы;
  • HA: несколько инстансов + внешняя БД + общий LB;
  • версии: обновления, плагины фиксировать (GF_INSTALL_PLUGINS);
  • мониторинг самой Grafana (/metrics);
  • производительность: лёгкие запросы, $__interval, лимит точек, кэширование, recording rules в Prometheus для тяжёлых панелей, min interval;
  • стандартизация: папки по командам, общие шаблоны дашбордов, соглашения об именах, владельцы, описание, теги; регулярный аудит неиспользуемых дашбордов.

Dashboards as code: подход «сервис из коробки»

Шаблон дашборда сервиса (RED + ресурсы + логи + трейсы) создаётся автоматически для каждого нового сервиса (Jsonnet/Helm) — единый стандарт и быстрый старт.

Вопросы с ответами