Система мониторинга StackScout построена на базе Prometheus и Grafana и обеспечивает полный контроль над состоянием всех компонентов приложения.
- URL: http://localhost:9090
- Назначение: Сбор и хранение метрик
- Retention: 30 дней
- Scrape interval: 15s (backend: 30s)
- URL: http://localhost:3001
- Логин: admin
- Пароль: admin
- Назначение: Визуализация метрик и алертинг
- Port: 9187
- Метрики: Подключения, транзакции, размер БД, производительность запросов
- Port: 9121
- Метрики: Клиенты, операции, память, hit rate
- HTTP метрики: Request rate, response time (p95, p99), error rate
- JVM метрики: Heap/non-heap memory, GC паузы, thread pool
- Database pool: Активные/idle соединения, время ожидания
- Custom метрики: Бизнес-метрики приложения
pg_stat_database_numbackends- активные подключенияpg_stat_database_xact_commit- коммиты транзакцийpg_stat_database_xact_rollback- откаты транзакцийpg_database_size_bytes- размер БД
redis_connected_clients- подключенные клиентыredis_commands_processed_total- обработанные командыredis_memory_used_bytes- использование памятиredis_keyspace_hits_total/redis_keyspace_misses_total- cache hit rate
rabbitmq_queue_messages- сообщения в очередиrabbitmq_queue_messages_ready- готовые к обработкеrabbitmq_queue_messages_unacknowledged- необработанныеrabbitmq_connections- активные подключения
UID: stackscout-overview
Основной дашборд с обзором всей системы:
- Service Status - статус всех сервисов (Backend, PostgreSQL, Redis, RabbitMQ)
- Request Rate - количество запросов в секунду по эндпоинтам
- Response Time - p95 и p99 перцентили времени ответа
- JVM Memory - использование heap памяти
- Database Connection Pool - активные/idle/total соединения
- PostgreSQL Connections - активные подключения к БД
- Redis Clients - подключенные и заблокированные клиенты
- RabbitMQ Queue Messages - сообщения в очередях
- Redis Operations Rate - операций в секунду
File: backend-metrics.json
Детальные метрики backend приложения.
Настроены следующие алерты (файл: prometheus/rules/alerts.yml):
- ApplicationDown - Backend недоступен > 1 мин
- PostgresDown - PostgreSQL недоступен > 1 мин
- RedisDown - Redis недоступен > 1 мин
- RabbitMQDown - RabbitMQ недоступен > 1 мин
- HighResponseTime - среднее время ответа > 1с в течение 5 мин
- HighErrorRate - error rate > 5% в течение 5 мин
- DatabaseConnectionPoolLow - использование пула > 80% в течение 5 мин
- HighMemoryUsage - JVM heap > 90% в течение 5 мин
- RabbitMQHighQueueSize - > 1000 сообщений в очереди в течение 10 мин
docker compose up -d prometheus grafana postgres-exporter redis-exportercurl http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'- Откройте http://localhost:3001
- Войдите (admin/admin)
- Перейдите в Dashboards → StackScout → StackScout System Overview
curl http://localhost:8081/actuator/prometheus | grep http_server_requests- Config:
infrastructure/monitoring/prometheus/prometheus.yml - Rules:
infrastructure/monitoring/prometheus/rules/alerts.yml
- Datasources:
infrastructure/monitoring/grafana/provisioning/datasources.yml - Dashboards:
infrastructure/monitoring/grafana/provisioning/dashboards.yml - Dashboard files:
infrastructure/monitoring/grafana/dashboards/
@Component
public class CustomMetrics {
private final MeterRegistry registry;
public CustomMetrics(MeterRegistry registry) {
this.registry = registry;
}
public void recordCustomMetric(String name, double value) {
registry.counter("custom.metric." + name).increment(value);
}
}Отредактируйте prometheus/rules/alerts.yml:
- alert: CustomAlert
expr: your_metric > threshold
for: 5m
labels:
severity: warning
annotations:
summary: "Alert summary"
description: "Alert description"Перезагрузите конфигурацию:
curl -X POST http://localhost:9090/-/reload# Проверить логи Prometheus
docker compose logs prometheus
# Проверить доступность target
curl http://app:8081/actuator/prometheus- Проверьте datasource: Configuration → Data Sources → Prometheus
- Проверьте, что Prometheus собирает метрики: http://localhost:9090/targets
- Проверьте query в панели дашборда
Уменьшите retention period в docker-compose.yml:
command:
- '--storage.tsdb.retention.time=15d' # вместо 30d- Регулярно проверяйте дашборды - минимум раз в день
- Настройте алерты - интегрируйте с Slack/Email/PagerDuty
- Мониторьте тренды - обращайте внимание на постепенный рост метрик
- Документируйте инциденты - записывайте причины и решения
- Тестируйте алерты - периодически проверяйте, что алерты срабатывают
topk(5, histogram_quantile(0.95, rate(http_server_requests_seconds_bucket[5m])))
rate(http_server_requests_seconds_count{status=~"5.."}[5m]) / rate(http_server_requests_seconds_count[5m])
(jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}) * 100
rate(pg_stat_database_xact_commit[5m]) + rate(pg_stat_database_xact_rollback[5m])
rate(redis_keyspace_hits_total[5m]) / (rate(redis_keyspace_hits_total[5m]) + rate(redis_keyspace_misses_total[5m]))