Архитектура распределенного мониторинга и сквозного контроля системных состояний

Часть 1: Спецификация доменных ошибок (IAD, MDM, INVENTORY)

Author

Lead Systems Architect / FoodLifeCycle Core Team

Published

July 13, 2026

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-клиент.