Типичные ошибки начинающих, рекомендации по хранению данных и масштабированию
«Опыт — это имя, которое мы даём своим ошибкам» — Oscar Wilde
Вы изучили основы Prometheus, Grafana и Loki. Теперь важно понять, как не построить систему, которая упадёт в production.
В этой теме собраны типичные ошибки и рекомендации из реальной практики.
# ПЛОХО: user_id имеет миллионы уникальных значений
Counter('requests', 'Requests', ['user_id', 'request_id'])Каждая уникальная комбинация лейблов = отдельный временной ряд.
Результат:
# ХОРОШО: низкая кардинальность
Counter('requests', 'Requests', ['method', 'endpoint', 'status'])Правило: лейблы должны иметь ограниченное количество уникальных значений (< 1000).
Хорошие лейблы:
method (GET, POST, PUT, DELETE)endpoint (/api/users, /api/orders)status (200, 404, 500)env (production, staging)Плохие лейблы:
user_id (миллионы пользователей)request_id (уникален для каждого запроса)timestamp (постоянно растёт)email (уникален для каждого пользователя)Prometheus по умолчанию хранит данные бесконечно (пока есть место).
Результат:
Настройте retention:
command:
- '--storage.tsdb.retention.time=15d'
- '--storage.tsdb.retention.size=10GB'Рекомендации:
retention.time: 15-30 дней для локального храненияretention.size: ограничьте по месту (10-50GB)Для долгосрочного хранения:
# ПЛОХО: слишком часто
scrape_interval: 1sРезультат:
# ХОРОШО: разумная частота
global:
scrape_interval: 15s
# Для критичных метрик можно чаще
- job_name: 'critical'
scrape_interval: 5sРекомендации:
Помните: rate()[5m] требует окно больше scrape_interval (минимум 2x).
# ПЛОХО: нет range vector
rate(http_requests_total)
# ПЛОХО: слишком маленькое окно
rate(http_requests_total[10s]) # Если scrape_interval = 15s# ХОРОШО: окно больше scrape_interval
rate(http_requests_total[1m]) # Минимум
rate(http_requests_total[5m]) # РекомендуетсяПравило: окно rate() должно быть минимум в 2-3 раза больше scrape_interval.
# ПЛОХО: слишком чувствительный алерт
- alert: HighCPU
expr: node_cpu_usage_percent > 50
for: 0mРезультат:
# ХОРОШО: разумные пороги и окна
- alert: HighCPU
expr: node_cpu_usage_percent > 80
for: 15m
labels:
severity: warningРекомендации:
for для фильтрации скачковДашборд с 50 панелями, на каждой по 10 линий.
Результат:
Структура дашборда:
┌─────────────────────────────────────────────────────────┐
│ KPI (4-6 Stat панелей) │
│ - Requests/s, Errors, Latency, Uptime │
├─────────────────────────────────────────────────────────┤
│ Основные метрики (3-5 Time series) │
│ - Traffic, Performance, Saturation │
├─────────────────────────────────────────────────────────┤
│ Детали (2-3 панели) │
│ - По эндпоинтам, по методам │
├─────────────────────────────────────────────────────────┤
│ Логи (1 панель Loki) │
│ - Recent errors │
└─────────────────────────────────────────────────────────┘
Рекомендации:
# ПЛОХО: текст, который сложно парсить
2026-03-18 14:30:00 INFO User John Doe with email john@example.com logged in from 192.168.1.1
Результат:
{
"timestamp": "2026-03-18T14:30:00Z",
"level": "INFO",
"message": "User logged in",
"user_id": 123,
"ip": "192.168.1.1"
}Преимущества:
{level="ERROR"}sum by (user_id)# ПЛОХО: непонятно, что измеряет метрика
requests = Counter('req', 'Reqs')# ХОРОШО: подробное описание
http_requests_total = Counter(
'http_requests_total',
'Total HTTP requests received by the server',
['method', 'endpoint', 'status']
)Добавляйте:
Не мониторите Prometheus и Grafana.
Результат:
Добавьте self-monitoring:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'grafana'
static_configs:
- targets: ['grafana:3000']Ключевые метрики:
prometheus_tsdb_head_samples_appended_total — записывается лиprometheus_target_scrape_pool_exceeded_target_limit — проблемы со скрапингомup — доступен лиАлерты:
- alert: PrometheusDown
expr: up{job="prometheus"} == 0
for: 1m
severity: critical
- alert: PrometheusTargetMissing
expr: count(up == 0) > 0
for: 5m
severity: warningPrometheus на одном сервере справляется, но:
Вариант 1: Federation
Несколько Prometheus, каждый собирает свою часть, центральный агрегирует.
Вариант 2: Thanos
Вариант 3: Cortex/Mimir
Когда масштабировать:
1 млн активных временных рядов
100GB данных на диске
500 уникальных лейблов
for.Вы завершили курс «Prometheus и Grafana для начинающих»!
Теперь вы умеете:
Следующий шаг: курс «Prometheus и Grafana для Middle» — углублённое изучение PromQL, Recording Rules, Thanos, и продвинутые паттерны алертинга.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.