Архитектура распределенного мониторинга и сквозного контроля системных состояний
Часть 1: Спецификация доменных ошибок (IAD, MDM, INVENTORY)
1. Домен Идентификации и Доступа: Identity & Access Domain (IAD)
Специализированные коды auth-service для контроля сессий, Dual Token ротации и прав мультитендентных групп.
| Исходный триггер / Исключение (СУБД / gRPC) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
PostgreSQL: users_email_key violation |
ALREADY_EXISTS (6) |
409 Conflict |
IAD_AUTH_EMAIL_DUPLICATE |
Данный Email уже зарегистрирован. | Подсветить поле ввода Email красным цветом. |
Redis: refresh_token blacklist match |
UNAUTHENTICATED (16) |
401 Unauthorized |
IAD_JWT_REFRESH_STOLEN |
Сессия скомпрометирована. Войдите заново. | Очистить secure storage, принудительный вылет на экран Login. |
JWT: signature verification failed |
UNAUTHENTICATED (16) |
401 Unauthorized |
IAD_JWT_ACCESS_INVALID |
Токен доступа невалиден или изменен. | Триггер метода POST /auth/refresh под капотом Dio. |
JWT: TokenExpiredError (Access) |
UNAUTHENTICATED (16) |
401 Unauthorized |
IAD_JWT_ACCESS_EXPIRED |
Срок действия токена доступа истек. | Прозрачный перезапрос токена через Refresh-контур. |
JWT: TokenExpiredError (Refresh) |
UNAUTHENTICATED (16) |
401 Unauthorized |
IAD_JWT_REFRESH_EXPIRED |
Сессия авторизации истекла. Войдите снова. | Выбросить пользователя на экран авторизации. |
PostgreSQL: user_group constraint failure |
FAILED_PRECONDITION (9) |
400 Bad Request |
IAD_GROUP_ALREADY_MEMBER |
Вы уже состоите в другой семье или офисе. | Показать модальное окно: «Покиньте текущую группу». |
PostgreSQL: invite_token TTL < now() |
ABORTED (10) |
410 Gone |
IAD_GROUP_INVITE_EXPIRED |
Срок действия приглашения в группу истек. | Отобразить ошибку: «Запросите новый инвайт у лидера». |
2. Домен Реестров и Мастер-Данных: Master Data Registry Domain (MDM)
Специализированные коды справочников номенклатур и кулинарной книги (recipes-service).
| Исходный триггер / Исключение (СУБД / gRPC) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
PostgreSQL: SELECT WHERE recipe_id NOT FOUND |
NOT_FOUND (5) |
404 Not Found |
MDM_RECIPE_NOT_FOUND |
Рецепт отсутствует в кулинарной книге. | Скрыть кнопку «Готовить», вернуть юзера в Cookbook. |
PostgreSQL: recipe_ingredients dependency missing |
FAILED_PRECONDITION (9) |
422 Unprocessable |
MDM_RECIPE_INTEGRITY_BROKEN |
Технологическая карта содержит битые ID. | Залочить запуск, отправить тикет разработчикам. |
PostgreSQL: product_barcode NOT FOUND |
NOT_FOUND (5) |
404 Not Found |
MDM_BARCODE_UNKNOWN |
Штрих-код отсутствует в глобальном каталоге. | Запустить bpds.mdm.in.product.process для Ollama. |
PostgreSQL: nutrient_matrix_catalog EMPTY |
INTERNAL (13) |
500 Internal |
MDM_CATALOG_DESYNC |
Системный сбой: Матрица БЖУ не загружена. | Заблокировать вкладку Pantry, показать Loader. |
3. Домен Склада и Транзакционного Учета: Inventory Domain (INVENTORY)
Тяжелые транзакционные коды fridge-service, cook-service, consume-service и waste-service.
| Исходный триггер / Исключение (СУБД / gRPC) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
FIFO Engine: batch volume < requested AND OFFICE |
FAILED_PRECONDITION (9) |
422 Unprocessable |
INV_STOCK_INSUFFICIENT_OFFICE |
На полках офиса нет требуемого объема еды. | Жесткий отказ транзакции, заблокировать кнопку списания. |
FIFO Engine: batch volume < requested AND HOME |
OK (0) |
200 OK |
INV_STOCK_MASKED_MINUS |
Балансы успешно обновлены. | Разрешить списание в минус, на экране сменить минус на 0. |
PostgreSQL: merge_items_list contains dead rows |
ABORTED (10) |
409 Conflict |
INV_MERGE_RACE_CONDITION |
Выбранные партии уже были списаны или изменены. | Обновить экран Fridge, сбросить чекбоксы выделения. |
PostgreSQL: item_id already expired |
FAILED_PRECONDITION (9) |
400 Bad Request |
INV_ITEM_EXPIRED_LOCK |
Запрещено использовать гнилые продукты. | Заблокировать добавление этой партии в котел (3. Cook). |
PostgreSQL: row lock timeout on update balances |
RESOURCE_EXHAUSTED (8) |
423 Locked |
INV_DATABASE_ROW_LOCKED |
Сервер склада перегружен. Повторите секунду спустя. | Включить автоматический инкрементальный Retry в Dio. |
B2B Webhook: shop_token verification failed |
UNAUTHENTICATED (16) |
401 Unauthorized |
INV_PARTNER_WEBHOOK_UNAUTHORIZED |
Ключ авторизации торговой сети невалиден. | helper-service мгновенно рубит поток ответом 401. |
B2B Webhook: shop_id mismatch items payload |
INVALID_ARGUMENT (3) |
400 Bad Request |
INV_PARTNER_PAYLOAD_MALFORMED |
Структура чека магазина содержит невалидный JSON. | Залогировать в Event Log, прервать обработку. |
PostgreSQL: insert waste_reason constraint check |
INVALID_ARGUMENT (3) |
400 Bad Request |
INV_WASTE_REASON_INVALID |
Указана недопустимая причина утилизации еды. | Разрешить выбор только из PROPALO или SPOILT. |
4. Домен Асинхронных ИИ-Сервисов и Оркестрации: AI Orchestration Domain (AID)
Специализированные коды тяжелых GPU-воркеров (image-processor, product-vision-processor, grpc-analytics) и ИИ-цензора censorship-control-worker.
| Исходный триггер / Исключение (СУБД / gRPC / CUDA) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
CUDA: RuntimeError: out of memory |
RESOURCE_EXHAUSTED (8) |
503 Service Unavail |
AID_GPU_VRAM_OVERFLOW |
Вычислительный сервер перегружен. Попробуйте позже. | Поставить задачу в очередь повтора Kafka с задержкой Backoff. |
EasyOCR: Tesseract / OCR Engine unreadable text |
DATA_LOSS (15) |
422 Unprocessable |
AID_VISION_OCR_UNREADABLE |
Не удалось считать фискальные позиции. Измените ракурс. | Подсветить ошибку на экране Покупок (1. Shop). |
YOLOv8: object_detection low confidence score |
OUT_OF_RANGE (11) |
422 Unprocessable |
AID_VISION_YOLO_LOW_CONF |
ИИ не уверен в распознавании продуктов в холодильнике. | Триггер топика №5 для ручной модерации черновика в App. |
Whisper: Sound chunks decibel stream corrupted |
ABORTED (10) |
400 Bad Request |
AID_SPEECH_STT_CORRUPTED |
Низкое качество звука или критические помехи записи. | Прервать стрим, отобразить виджет «Повторите диктовку». |
Redis: Abuse Counter >= 2 (Lua atomic lock) |
PERMISSION_DENIED (7) |
403 Forbidden |
AID_CENSOR_PROFANITY_VIOLATION |
Сессия немедленно заблокирована за повторное использование мата. | Немедленный логаут через топик №13 во всех контурах. |
Ollama: Pydantic Structured Output format error |
INTERNAL (13) |
502 Bad Gateway |
AID_LLM_INVALID_STRUCTURE |
Сбой структурирования данных ИИ. Повторите попытку. | Отправить лог сбоя по X-Request-ID в PMA, сбросить кэш. |
WebRTC/WebSockets: Frame buffer packet drop > 40% |
DATA_LOSS (15) |
408 Timeout |
AID_STREAM_FRAME_DROP |
Критическое ухудшение качества связи при видеостриминге. | Отключить WebRTC, перевести камеру в режим покадровых фото. |
5. Домен Предиктивной Аналитики и Скорринга: Predictive Intelligence & Affinity Domain (AFFINITY)
Специализированные коды ошибок аналитического ядра affinity-service и фоновых математических планировщиков.
| Исходный триггер / Исключение (СУБД / gRPC) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
Redis: connection pool exhausted on matrix write |
RESOURCE_EXHAUSTED (8) |
503 Service Unavail |
AFF_CACHE_POOL_EXHAUSTED |
Временный сбой аналитической подсистемы рекомендаций. | Скрыть блок предиктивных подсказок на экране Корзины. |
Cron: Decay engine missing Redis target hashes |
NOT_FOUND (5) |
500 Internal |
AFF_DECAY_TARGET_MISSING |
Ошибка демона затухания: Профиль лояльности не найден. | Прервать Cron, сгенерировать алевр в Alertmanager. |
Affinity Engine: math domain error (NaN score) |
OUT_OF_RANGE (11) |
500 Internal |
AFF_MATH_INVALID_MATRIX |
Критическая ошибка расчета векторов лояльности группы. | Сбросить веса ассоциаций для home_group_id к дефолтным. |
gRPC: query suggestions for empty group context |
INVALID_ARGUMENT (3) |
400 Bad Request |
AFF_SUGGESTION_EMPTY_CONTEXT |
Ошибка запроса подсказок: Не указан контекст орг-группы. | Метод suggestions возвращает пустой плоский JSON-массив. |
6. Домен Сквозного Мониторинга и Аудита Процессов: Process Mining & Audit Domain (PMA)
Специализированные коды ошибок для bupar-audit-service, Grafana Loki и контура проброса trace_id.
| Исходный триггер / Исключение (СУБД / gRPC / Loki) | gRPC Статус | HTTP REST | Каноничный Код Симулятора | Локализованное описание (ru) |
Контекст поведения / Реакция UI |
|---|---|---|---|---|---|
FastAPI: X-Request-ID Header missing on gateway |
INVALID_ARGUMENT (3) |
400 Bad Request |
PMA_TRACE_ID_MISSING |
Нарушена сквозная техническая трассировка запроса. | Nginx принудительно инжектирует новый UUID трейса в поток. |
Grafana Loki: LogQL query timed out (>5000ms) |
DEADLINE_EXCEEDED (4) |
504 Gateway Timeout |
PMA_LOKI_QUERY_TIMEOUT |
Превышено время ожидания сборки сквозного технического следа. | На экране ObservabilityScreen включить Loader-Retry. |
bupar: event log contains broken case_id paths |
DATA_LOSS (15) |
500 Internal |
PMA_BUPAR_INTEGRITY_VIOLATION |
Невозможно построить граф жизненного цикла: битая цепочка. | Скрыть интерфейсную карту Process Mining, выдать алерт. |
FastAPI: SSE connection client disconnect abrupt |
CANCELLED (1) |
499 Client Closed |
PMA_SSE_STREAM_ABORTED |
Поток трансляции терминала логов прерван пользователем. | Корректно закрыть сессию чтения Loki API, очистить буфер. |
Promtail: log delivery pipeline block (disk full) |
RESOURCE_EXHAUSTED (8) |
507 Insufficient |
PMA_COLLECTOR_PIPE_BLOCKED |
Системный сбой: Буфер мониторинга переполнен. | Отключить живой стриминг логов на Flutter-клиент. |