This commit is contained in:
roma-dxunvrs
2026-10-03 22:09:58 +03:00
commit 8d4b15dbcf
33 changed files with 1655 additions and 0 deletions
+316
View File
@@ -0,0 +1,316 @@
# Гайд по метрикам и мониторингу
## Быстрый старт
1. **Доступ к сервисам:**
- Приложение: http://localhost:8080
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (admin/admin)
2. **Дашборды автоматически загружены:**
- Spring Boot Application Metrics
- PostgreSQL & HikariCP Monitoring
## Основные метрики
### HTTP метрики
**Что смотреть:**
- `http_server_requests_seconds_count` — количество запросов
- `http_server_requests_seconds_sum` — суммарное время выполнения
- `http_server_requests_seconds_bucket` — распределение времени ответа
**Зачем:**
- Отслеживать нагрузку на эндпоинты
- Находить медленные запросы (p95, p99)
- Видеть ошибки по статус-кодам
**Пример запроса в Prometheus:**
```promql
# Request rate по эндпоинтам
rate(http_server_requests_seconds_count{application="todo"}[1m])
# 95-й перцентиль времени ответа
histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le, uri))
# Количество ошибок 5xx
sum(rate(http_server_requests_seconds_count{status=~"5.."}[1m]))
```
### JVM метрики
**Что смотреть:**
- `jvm_memory_used_bytes` — используемая память (heap/non-heap)
- `jvm_memory_max_bytes` — максимальная доступная память
- `jvm_gc_pause_seconds` — время на GC паузах
- `jvm_threads_live_threads` — количество потоков
**Зачем:**
- Проверить утечки памяти (постоянный рост heap)
- Оптимизировать GC (частые паузы = проблема)
- Контролировать создание потоков
**Алерты:**
```promql
# Память heap больше 80%
(jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}) > 0.8
# GC паузы больше 100ms
rate(jvm_gc_pause_seconds_sum[1m]) > 0.1
```
### Database Connection Pool (HikariCP)
**Что смотреть:**
- `hikaricp_connections_active` — активные соединения
- `hikaricp_connections_idle` — простаивающие соединения
- `hikaricp_connections_pending` — ожидающие потоки
- `hikaricp_connections_timeout_total` — таймауты соединений
- `hikaricp_connections_acquire_seconds` — время получения соединения
**Зачем:**
- Настроить размер пула (если active = max постоянно, увеличить)
- Найти медленные запросы (высокое usage time)
- Обнаружить connection leaks (timeouts растут)
**Оптимальные значения:**
- Active connections < 70% от max
- Acquire time < 10ms (p95)
- Pending threads = 0
- Timeouts = 0
**Алерты:**
```promql
# Пул заполнен больше 80%
(hikaricp_connections_active / hikaricp_connections_max) > 0.8
# Таймауты соединений
rate(hikaricp_connections_timeout_total[1m]) > 0
# Медленное получение соединений (p95 > 50ms)
histogram_quantile(0.95, rate(hikaricp_connections_acquire_seconds_bucket[1m])) > 0.05
```
### System метрики
**Что смотреть:**
- `system_cpu_usage` — CPU системы
- `process_cpu_usage` — CPU процесса
- `disk_free_bytes` — свободное место на диске
**Зачем:**
- Контролировать нагрузку на CPU
- Предотвратить переполнение диска
## Использование Grafana
### Навигация по дашбордам
1. **Spring Boot Application Metrics:**
- HTTP Request Rate — количество запросов в секунду по эндпоинтам
- HTTP Request Duration — время ответа (p95, p99)
- HTTP Status Codes — распределение статус-кодов
- JVM Memory — использование heap/non-heap памяти
- Database Connection Pool — состояние пула соединений
- JVM Threads — количество потоков
- GC Pause Time — время на сборку мусора
- System CPU Usage — нагрузка на CPU
2. **PostgreSQL & HikariCP Monitoring:**
- Connection Pool Status — статистика пула (active, idle, total, pending)
- Connection Pool Utilization — процент использования пула
- Connection Acquire Time — время получения соединения (перцентили)
- Connection Timeout Count — количество таймаутов
- Connection Creation Time — время создания нового соединения
- Connection Usage Time — среднее время использования соединения
### Полезные функции Grafana
**Time Range:**
- Последние 5 минут — реал-тайм мониторинг
- Последний час — анализ недавних инцидентов
- Последние 24 часа — дневные паттерны
**Refresh:**
- 5s — активный мониторинг
- 30s — обычный режим
- Off — анализ истории
**Zoom:**
- Выдели область на графике для zoom-in
- Двойной клик — zoom-out
**Legend:**
- Клик на метрику — скрыть/показать
- Shift+клик — изолировать метрику
## Практические сценарии
### 1. Медленный эндпоинт
**Признаки:**
- Request Duration (p95) > 1s для конкретного URI
- Connection Acquire Time растет
**Диагностика:**
```promql
# Найти медленный эндпоинт
topk(5, histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le, uri)))
# Проверить время получения соединения
histogram_quantile(0.95, rate(hikaricp_connections_acquire_seconds_bucket[1m]))
```
**Решение:**
- Оптимизировать SQL запрос
- Добавить индексы
- Включить кеширование
### 2. Memory Leak
**Признаки:**
- Heap memory постоянно растет
- Частые Full GC паузы
- OutOfMemoryError в логах
**Диагностика:**
```promql
# Рост памяти
jvm_memory_used_bytes{area="heap"}
# Частота GC
rate(jvm_gc_pause_seconds_count[1m])
```
**Решение:**
- Heap dump анализ (jmap)
- Проверить кеши и коллекции
- Закрывать ресурсы (connections, streams)
### 3. Connection Pool Exhausted
**Признаки:**
- Active connections = Max connections
- Pending threads > 0
- Timeouts растут
- Медленные запросы
**Диагностика:**
```promql
# Утилизация пула
(hikaricp_connections_active / hikaricp_connections_max) * 100
# Ожидающие потоки
hikaricp_connections_pending
# Таймауты
rate(hikaricp_connections_timeout_total[1m])
```
**Решение:**
- Увеличить `spring.datasource.hikari.maximum-pool-size`
- Найти медленные запросы
- Проверить connection leaks (незакрытые соединения)
### 4. Высокая нагрузка
**Признаки:**
- Request rate резко вырос
- CPU usage > 80%
- Response time увеличилось
**Диагностика:**
```promql
# Request rate
sum(rate(http_server_requests_seconds_count[1m]))
# CPU
system_cpu_usage
# Response time
histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le))
```
**Решение:**
- Горизонтальное масштабирование (больше инстансов)
- Rate limiting
- Кеширование частых запросов
## Настройка алертов (опционально)
Создай файл `prometheus-alerts.yml`:
```yaml
groups:
- name: app_alerts
interval: 30s
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[1m]) > 0.1
for: 1m
labels:
severity: critical
annotations:
summary: "High 5xx error rate"
- alert: HighMemoryUsage
expr: (jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}) > 0.9
for: 2m
labels:
severity: warning
annotations:
summary: "JVM heap usage > 90%"
- alert: ConnectionPoolExhausted
expr: (hikaricp_connections_active / hikaricp_connections_max) > 0.9
for: 1m
labels:
severity: critical
annotations:
summary: "Connection pool almost full"
- alert: SlowEndpoint
expr: histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le, uri)) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "Endpoint p95 latency > 2s"
```
Добавь в `prometheus.yml`:
```yaml
rule_files:
- /etc/prometheus/prometheus-alerts.yml
```
## Best Practices
1. **Регулярно проверяй метрики** — открывай Grafana хотя бы раз в день
2. **Настрой алерты** — получай уведомления о проблемах
3. **Анализируй тренды** — сравнивай метрики по неделям
4. **Документируй инциденты** — записывай что пошло не так и как исправил
5. **Тестируй под нагрузкой** — используй JMeter/Gatling + метрики для нагрузочного тестирования
6. **Не игнорируй warning** — маленькие проблемы перерастают в большие
## Полезные PromQL запросы
```promql
# Top 5 медленных эндпоинтов
topk(5, histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le, uri)))
# Request rate по методам
sum(rate(http_server_requests_seconds_count[1m])) by (method)
# Error rate %
(sum(rate(http_server_requests_seconds_count{status=~"[45].."}[1m])) / sum(rate(http_server_requests_seconds_count[1m]))) * 100
# Memory growth rate (MB/hour)
rate(jvm_memory_used_bytes{area="heap"}[1h]) * 3600 / 1024 / 1024
# Database connection wait time
sum(rate(hikaricp_connections_pending[1m]))
# Thread count trend
jvm_threads_live_threads - jvm_threads_live_threads offset 1h
```