Troubleshooting
Руководство по диагностике и устранению проблем в системе EFKO Kernel.
Логирование
Структура логов
Система использует Pino для структурированного логирования. Логи пишутся в папку logs/ в dev режиме:
logs/gateway.log— логи API Gatewaylogs/auth-service.log— логи Auth Servicelogs/personnel.log— логи Personnel Servicelogs/production.log— логи Production Servicelogs/etl.log— логи ETL Service
Формат логов
Логи в формате JSON:
{
"level": "info",
"time": "2025-01-15T10:30:00Z",
"requestId": "req-123",
"userId": "user-456",
"service": "gateway",
"message": "Request received",
"context": {
"method": "GET",
"url": "/api/personnel/employees"
}
}
Просмотр логов
# Просмотр логов в реальном времени
tail -f logs/gateway.log
# Поиск по requestId
grep "req-123" logs/*.log
# Поиск ошибок
grep '"level":"error"' logs/*.log
# Фильтрация по уровню
jq 'select(.level == "error")' logs/gateway.log
Loki (Production)
В production логи отправляются в Loki через pino-loki. Используйте Grafana Loki для поиска и анализа логов.
Распространенные проблемы
Сервис не запускается
Симптомы
Диагностика
-
Проверьте, что инфраструктура запущена:
-
Проверьте логи сервиса:
-
Проверьте переменные окружения в
.env -
Проверьте, что порты не заняты:
Решения
PostgreSQL недоступен:
# Перезапуск PostgreSQL
docker-compose restart postgres
# Проверка подключения
docker exec -it postgres psql -U postgres -d efko_kernel -c "SELECT 1"
RabbitMQ недоступен:
# Перезапуск RabbitMQ
docker-compose restart rabbitmq
# Проверка подключения
docker exec -it rabbitmq rabbitmqctl status
MongoDB недоступен:
# Перезапуск MongoDB
docker-compose restart mongo
# Проверка подключения
docker exec -it mongo mongosh --eval "db.stats()"
Порт занят:
# Найти процесс
lsof -i :3000
# Убить процесс
kill -9 <PID>
# Или изменить порт в .env
GATEWAY_PORT=3001
RabbitMQ Connection Error
Симптомы
Диагностика
# Проверьте статус RabbitMQ
docker exec -it rabbitmq rabbitmqctl status
# Проверьте логи RabbitMQ
docker logs rabbitmq
# Проверьте AMQP_URI в .env
grep AMQP_URI .env
Решения
Неверный AMQP_URI:
RabbitMQ не запущен:
Memory/Disk limit:
# Проверьте лимиты
docker exec -it rabbitmq rabbitmqctl list_queues
# Сбросьте лимиты (dev mode)
docker exec -it rabbitmq rabbitmqctl set_vm_memory_high_watermark 0.8
Database Connection Error
Симптомы
Диагностика
# Проверьте статус PostgreSQL
docker exec -it postgres pg_isready
# Проверьте логи PostgreSQL
docker logs postgres
# Проверьте DATABASE_URL в .env
grep DATABASE_URL .env
Решения
Неверный DATABASE_URL:
Миграции не применены:
PostgreSQL не запущен:
Проверьте подключение:
Timeout ошибки в RPC
Симптомы
Диагностика
# Проверьте логи downstream сервиса
cat logs/personnel.log
# Проверьте RabbitMQ queues
docker exec -it rabbitmq rabbitmqctl list_queues
# Проверьте корреляцию
grep "requestId" logs/*.log
Решения
Downstream сервис не запущен:
Очередь заблокирована:
# Проверьте unacked messages
docker exec -it rabbitmq rabbitmqctl list_queues name messages messages_unacked
# Очистите очередь (dev mode)
docker exec -it rabbitmq rabbitmqctl purge_queue personnel-service.commands.queue
Увеличьте timeout:
// В proxy service
await this.amqpConnection.publish(
exchange,
routingKey,
payload,
{ timeout: 10000 }, // Увеличить до 10s
);
Outbox не публикуется
Симптомы
Диагностика
-- Проверьте outbox таблицу
SELECT * FROM outbox_messages
WHERE status = 'FAILED'
ORDER BY created_at DESC
LIMIT 10;
-- Проверьте PENDING события
SELECT COUNT(*) FROM outbox_messages WHERE status = 'PENDING';
Решения
Publisher не запущен:
Ошибка публикации:
-- Посмотрите errorMessage
SELECT eventType, errorMessage, retryCount
FROM outbox_messages
WHERE status = 'FAILED';
Ручной retry:
-- Сбросьте статус на PENDING
UPDATE outbox_messages
SET status = 'PENDING', retryCount = 0, errorMessage = NULL
WHERE id = '<id>';
CSRF ошибки
Симптомы
Диагностика
Решения
CSRF включен в dev:
Токен устарел:
Mobile клиент:
// Убедитесь, что не отправляете cookie
// Refresh токен в теле запроса
{
"refreshToken": "<token>"
}
JWT валидация ошибки
Симптомы
Диагностика
Решения
Токен истек:
Неверный секрет:
Issuer не совпадает:
Rate Limit превышен
Симптомы
Диагностика
Решения
Подождите: - Лимит сбрасывается автоматически через TTL
Увеличьте лимит:
Используйте API ключ: - Для интеграций используйте отдельные механизмы
Health Checks
Проверка сервисов
# Gateway
curl http://localhost:3000/api
# RabbitMQ
curl http://localhost:15672/api/overview \
-u guest:guest
# PostgreSQL
docker exec -it postgres pg_isready
# MongoDB
docker exec -it mongo mongosh --eval "db.stats()"
Health endpoints
Если настроены health endpoints:
# Gateway health
curl http://localhost:3000/health
# Service health
curl http://localhost:3001/health # auth-service
curl http://localhost:3002/health # personnel
Отладка
Debug режим
Включение трассировки
Проблемы с Prisma
# Prisma Studio для визуального просмотра БД
cd apps/<service>
npx prisma studio
# Сброс БД (dev mode)
npx prisma migrate reset
RabbitMQ Диагностика
Проверка очередей
# Список всех очередей
docker exec -it rabbitmq rabbitmqctl list_queues
# Сообщения в очереди
docker exec -it rabbitmq rabbitmqctl list_queues name messages
# Unacked сообщения
docker exec -it rabbitmq rabbitmqctl list_queues name messages_unacked
Проверка exchanges
# Список exchanges
docker exec -it rabbitmq rabbitmqctl list_exchanges
# Bindings
docker exec -it rabbitmq rabbitmqctl list_bindings
Очистка очередей (dev mode)
# Очистить конкретную очередь
docker exec -it rabbitmq rabbitmqctl purge_queue personnel-service.commands.queue
# Удалить очередь
docker exec -it rabbitmq rabbitmqctl delete_queue personnel-service.commands.queue
Management UI
Откройте http://localhost:15672 для визуальной диагностики RabbitMQ.
PostgreSQL Диагностика
Проверка соединений
# Активные соединения
docker exec -it postgres psql -U postgres -c \
"SELECT count(*) FROM pg_stat_activity;"
# Заблокированные запросы
docker exec -it postgres psql -U postgres -c \
"SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';"
Проверка размера БД
docker exec -it postgres psql -U postgres -c \
"SELECT pg_size_pretty(pg_database_size('efko_kernel_auth'));"
Проверка индексов
docker exec -it postgres psql -U postgres efko_kernel_auth -c \
"SELECT * FROM pg_stat_user_indexes;"
Проверка медленных запросов
# Включите log_min_duration_statement
docker exec -it postgres psql -U postgres -c \
"ALTER SYSTEM SET log_min_duration_statement = 1000;"
# Перезагрузите PostgreSQL
docker-compose restart postgres
MongoDB Диагностика
Проверка статуса
Проверка размера коллекций
docker exec -it mongo mongosh --eval "db.getCollectionNames().forEach(function(c) { print(c + ': ' + db[c].count() + ' docs, ' + JSON.stringify(db[c].stats().size) + ' bytes'); })"
Проверка индексов
ETL Проблемы
Импорт застрял в PROCESSING
Диагностика
Решения
// Измените статус на FAILED для retry
db.raw_imports.updateOne(
{ _id: ObjectId("...") },
{ $set: { status: "failed" } }
)
// Или retry через API
POST /etl/imports/:id/retry
Ошибки трансформации
Диагностика
# Проверьте логи ETL
grep "transformation" logs/etl.log
# Проверьте transformation_log в MongoDB
db.transformation_log.find({ status: "ERROR" })
Решения
- Проверьте схему импорта
- Проверьте mapper для источника
- Проверьте валидацию данных
Производительность
Медленные запросы
Диагностика
Решения
- Добавьте индексы в Prisma schema
- Оптимизируйте запросы Prisma
- Используйте
selectдля ограничения полей - Используйте пагинацию
Высокое использование памяти
Диагностика
Решения
- Увеличьте память для Docker контейнеров
- Проверьте утечки памяти в коде
- Оптимизируйте запросы к БД
Мониторинг
Prometheus Metrics
Ключевые метрики:
- http_requests_total — количество HTTP запросов
- http_request_duration_seconds — длительность запросов
- rabbitmq_queue_messages — сообщения в очередях
- database_connections_active — активные соединения с БД
Grafana Dashboard
Если настроен Grafana: - Откройте http://localhost:3000 - Проверьте дашборды для системы - Мониторируйте аномалии
Обращение за помощью
Если проблема не решена:
-
Соберите логи:
-
Соберите информацию об окружении:
-
Опишите шаги воспроизведения
-
Свяжитесь с командой поддержки