Интерфейс Grafana, панели, визуализации и связка с Prometheus
«Хороший дашборд отвечает на вопросы, которые вы ещё не успели задать»
Grafana — это платформа для визуализации данных и аналитики.
Prometheus хранит метрики, но не умеет строить красивые графики. Grafana подключается к Prometheus (и другим источникам данных) и превращает числа в информативные дашборды.
Возможности Grafana:
После входа (http://localhost:3000, admin/admin) вы увидите:
┌─────────────────────────────────────────────────────────────┐
│ Grafana 🏠 Home 📊 Dashboards ⚙️ Settings 🔔 👤 │
├─────────────────────────────────────────────────────────────┤
│ │
│ + New Dashboard + New Visualization │
│ │
│ Recent dashboards: │
│ - Prometheus Stats │
│ - Application Metrics │
│ │
└─────────────────────────────────────────────────────────────┘
Вы увидите редактор запросов:
┌────────────────────────────────────────────────────────────┐
│ Query │
├────────────────────────────────────────────────────────────┤
│ A ▼ prometheus │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ rate(http_requests_total[5m]) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ▶ Run Legend: {{method}} - {{endpoint}} │
└────────────────────────────────────────────────────────────┘
Поля:
{{лейбл}})Справа от редактора — панель настроек:
Visualization types:
Panel settings:
Нажмите Save (Ctrl+S), введите название дашборда.
Для чего: временные ряды, тренды, сравнение метрик.
Примеры запросов:
# Запросов в секунду
rate(http_requests_total[5m])
# Использование памяти
node_memory_Used_bytes / node_memory_MemTotal_bytes * 100
# 95-й перцентиль времени ответа
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))Настройки:
Для чего: одно ключевое значение (KPI).
Примеры запросов:
# Текущее количество ошибок
sum(rate(http_requests_total{status=~"5.."}[5m]))
# Uptime в процентах
avg_over_time(up[5m]) * 100
# Количество инстансов
count(up == 1)Настройки:
Для чего: метрики с пределами (проценты, квоты).
Примеры запросов:
# Использование памяти в процентах
node_memory_Used_bytes / node_memory_MemTotal_bytes * 100
# Заполненность диска
(node_disk_size_bytes - node_disk_free_bytes) / node_disk_size_bytes * 100Настройки:
Для чего: детализированные данные, сравнение по инстансам.
Примеры запросов:
# CPU по инстансам
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Топ запросов по эндпоинтам
topk(10, sum by (endpoint) (rate(http_requests_total[1h])))Настройки:
Для чего: распределение значений во времени (идеально для histogram).
Примеры запросов:
# Распределение времени ответа
rate(http_request_duration_seconds_bucket[5m])Настройки:
Переменные позволяют создавать динамические дашборды.
Query — значения из запроса Prometheus:
Name: instance
Type: Query
Query: label_values(up, instance)
Refresh: On Dashboard Load
Теперь в запросах можно использовать:
rate(http_requests_total{instance="$instance"}[5m])Custom — фиксированный список:
Name: environment
Type: Custom
Values: production, staging, development
All — специальный вариант для выбора всех значений.
# Одна переменная
rate(http_requests_total{instance="$instance"}[5m])
# Несколько значений (через запятую)
rate(http_requests_total{instance=~"$instance"}[5m])
# Переменная в legend
Legend: {{instance}} - $instanceGrafana 8+ поддерживает алерты (Unified Alerting).
Condition:
WHEN last() OF query A, 5m, IS ABOVE 80
Означает: если последнее значение за 5 минут выше 80.
Evaluation:
Notifications:
# Запрос
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Condition
WHEN last() OF query A, 5m, IS ABOVE 80
# Evaluate
Every: 1m
For: 5m
# Annotations
Summary: High CPU on {{ $labels.instance }}
Description: CPU usage is {{ $value }}% on {{ $labels.instance }}Grafana имеет каталог готовых дашбордов: https://grafana.com/grafana/dashboards/
| ID | Название | Описание |
|---|---|---|
| 3662 | Prometheus Stats | Метрики самого Prometheus |
| 8919 | Node Exporter Full | Полный мониторинг сервера |
| 10798 | cAdvisor | Метрики Docker контейнеров |
| 11666 | Application Dashboard | Шаблон для приложений |
Каждый дашборд должен отвечать на вопросы:
Инфраструктура:
Приложение:
Бизнес:
┌─────────────────────────────────────────────────────────┐
│ Application Dashboard │
├─────────────────────────────────────────────────────────┤
│ Overview (Stat) │
│ - Requests/s, Errors, Latency p95, Uptime │
├─────────────────────────────────────────────────────────┤
│ Traffic (Time series) │
│ - Requests by endpoint │
│ - Requests by method │
├─────────────────────────────────────────────────────────┤
│ Performance (Time series) │
│ - Latency p50, p95, p99 │
│ - Request duration heatmap │
├─────────────────────────────────────────────────────────┤
│ Errors (Time series + Table) │
│ - Error rate over time │
│ - Errors by endpoint (table) │
└─────────────────────────────────────────────────────────┘
# ПЛОХО
Panel Title
# ХОРОШО
HTTP Requests per Second by Endpoint
Description появляется при наведении — используйте для объяснения метрики.
Цветовая индикация помогает быстро понять состояние:
Green: 0-60% (OK)
Yellow: 60-80% (Warning)
Red: 80-100% (Critical)
Причины:
Решение:
Причины:
Решение:
rate()[5m] вместо rate()[1h]Решение: используйте форматирование:
# Шаблон легенды
{{instance}} - {{method}} {{endpoint}}
# Результат
server1 - GET /api/users
Создадим дашборд для Flask приложения из предыдущей темы.
sum(rate(http_requests_total[5m]))Visualization: Stat Unit: requests/s Description: Total HTTP requests per second
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
* 100Visualization: Stat Unit: Percent Thresholds: 0, 1, 5 (green < 1%, yellow < 5%, red > 5%)
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))Visualization: Stat Unit: Seconds
sum by (endpoint) (rate(http_requests_total[5m]))Visualization: Time series Legend: {{endpoint}}
sum by (method) (http_requests_in_progress)Visualization: Time series
avg_over_time(up[5m]) * 100Visualization: Gauge Min/Max: 0, 100 Thresholds: 99, 99.9
Теперь вы умеете создавать дашборды. В следующей теме вы научитесь настраивать алерты в Prometheus — чтобы система сама уведомляла о проблемах.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.