ERRORS: Мониторинг и сквозной контроль (End-to-End) системных состояний
Часть 1: Спецификация доменных ошибок (IAD, MDM, INVENTORY)
В открытом доступе представлена демонстрационная версия метода. В настоящей публичной документации отображены не все шаги, технические сценарии и приватные эндпоинты для системы цифровых симуляторов бизнес-процессов.
- Полная спецификация метода: Будет доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).
1. Домен Идентификации и Доступа: Identity & Access Domain (IAD)
Специализированные коды auth-service для контроля сессий, Dual Token ротации и прав мультитендентных групп.
Login & Register (IAD)
| Исходный триггер (Бэкенд / СУБД / Клиент) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Фронтенда) |
|---|---|---|---|---|---|
DioException: send timeout |
— — |
IAD_CLIENT_SEND_TIMEOUT |
Показать локальный Alert-toast: «Превышено время ожидания отправки. Проверьте сеть». | { "level": "WARN", "metric_name": "client_network_errors_total", "labels": { "type": "send_timeout", "stage": "gateway_entry" } } |
{ "canonical_code": "IAD_CLIENT_SEND_TIMEOUT", "localized_text": "Не удалось отправить запрос. Проверьте интернет-соединение.", "http_status": "0 Client Timeout" } |
HTTP 400 Bad Request: validation fail |
INVALID_ARGUMENT (3) 400 Bad Request |
IAD_AUTH_BAD_REQUEST_FORMAT |
Подсветить поле Email красным цветом и вывески ошибку контракта. | { "level": "WARN", "metric_name": "client_contract_violations", "labels": { "validator": "nginx_gateway", "field": "email_format" } } |
{ "canonical_code": "IAD_AUTH_BAD_REQUEST_FORMAT", "localized_text": "Некорректный формат адреса электронной почты или параметров.", "http_status": "400 Bad Request" } |
Nginx: Rate Limit exceeded |
RESOURCE_EXHAUSTED (8) 429 Too Many Requests |
IAD_AUTH_RATE_LIMIT_EXCEEDED |
Заблокировать форму ввода на 60 секунд, показать таймер обратного отсчета. | { "level": "WARN", "metric_name": "rate_limit_blocks_total", "labels": { "subsystem": "nginx_limit_req", "zone": "auth_endpoints" } } |
{ "canonical_code": "IAD_AUTH_RATE_LIMIT_EXCEEDED", "localized_text": "Слишком много запросов. Пожалуйста, подождите перед следующей попыткой.", "http_status": "429 Too Many Requests" } |
Nginx Proxy: upstream unavailable |
UNAVAILABLE (14) 502 Bad Gateway |
IAD_INFRA_GATEWAY_DOWN |
Перенаправить пользователя на полноэкранную заглушку: «Сервер на техническом обслуживании». | { "level": "ERROR", "metric_name": "nginx_upstream_failures_total", "labels": { "target": "backend_api_container", "status": "502" } } |
{ "canonical_code": "IAD_INFRA_GATEWAY_DOWN", "localized_text": "Сервис временно недоступен. Инженеры уже в курсе.", "http_status": "502 Bad Gateway" } |
FastAPI Gateway: downstream timeout |
DEADLINE_EXCEEDED (4) 504 Gateway Timeout |
IAD_INFRA_GATEWAY_TIMEOUT |
Показать Alert-toast: «Сервер не ответил вовремя. Попробуйте еще раз». | { "level": "ERROR", "metric_name": "gateway_downstream_timeouts_total", "labels": { "service": "auth_service_grpc" } } |
{ "canonical_code": "IAD_INFRA_GATEWAY_TIMEOUT", "localized_text": "Время ожидания ответа от сервера истекло. Повторите попытку.", "http_status": "504 Gateway Timeout" } |
Pydantic: space_creation_mode fail |
INVALID_ARGUMENT (3) 422 Unprocessable Entity |
IAD_CONTRACT_INVALID_SPACE_MODE |
Вывести системную ошибку, заблокировать кнопку отправки формы регистрации. | { "level": "WARN", "metric_name": "client_contract_violations", "labels": { "validator": "pydantic", "field": "space_creation_mode" } } |
{ "canonical_code": "IAD_CONTRACT_INVALID_SPACE_MODE", "localized_text": "Передан некорректный или неподдерживаемый режим инициализации пространства.", "http_status": "422 Unprocessable Entity" } |
PostgreSQL: users_email_key violation |
ALREADY_EXISTS (6) 409 Conflict |
IAD_AUTH_EMAIL_DUPLICATE |
Подсветить поле ввода Email красным цветом, заблокировать сабмит. | { "level": "ERROR", "metric_name": "registration_failed_total", "labels": { "reason": "email_taken", "domain": "auth" } } |
{ "canonical_code": "IAD_AUTH_EMAIL_DUPLICATE", "localized_text": "Данный Email уже зарегистрирован в системе.", "http_status": "409 Conflict" } |
Bcrypt: password validation mismatch |
UNAUTHENTICATED (16) 401 Unauthorized |
IAD_AUTH_INVALID_PASSWORD |
Показать Alert-toast «Неверные учетные данные», полностью очистить поле ввода пароля. | { "level": "WARN", "metric_name": "login_failed_total", "labels": { "reason": "bad_password", "security_level": "low" } } |
{ "canonical_code": "IAD_AUTH_INVALID_PASSWORD", "localized_text": "Неверный логин или пароль.", "http_status": "401 Unauthorized" } |
PostgreSQL: ConnectionPoolTimeout |
UNAVAILABLE (14) 503 Service Unavailable |
IAD_INFRA_DB_TIMEOUT |
Показать системный Full-screen overlay технического обслуживания («База данных перегружена»). | { "level": "ERROR", "metric_name": "infra_db_pool_starvation_total", "labels": {<br/> "pool": "auth_db",<br/> "severity": "high"<br/> } } |
{ "canonical_code": "IAD_INFRA_DB_TIMEOUT", "localized_text": "Сервер базы данных временно перегружен. Попробуйте зайти позже.", "http_status": "503 Service Unavailable" } |
CryptoException: KeySigningError |
INTERNAL (13) 500 Internal Server Error |
IAD_CRYPTO_SIGNING_ERROR |
Показать системный модальный алерт: «Внутренняя ошибка генерации сессии. Обратитесь в поддержку». | { "level": "CRITICAL", "metric_name": "crypto_key_faults_total", "labels": { "operation": "jwt_sign", "algorithm": "RS256" } } |
{ "canonical_code": "IAD_CRYPTO_SIGNING_ERROR", "localized_text": "Критическая ошибка сервера при подписи сессии безопасности.", "http_status": "500 Internal Server Error" } |
DioException: receive timeout |
— — |
IAD_CLIENT_RECEIVE_TIMEOUT |
Показать ненавязчивый Bottom-toast: «Сессия создана, но ответ от сервера задерживается». | { "level": "WARN", "metric_name": "client_network_errors_total", "labels": { "type": "receive_timeout", "stage": "response_delivery" } } |
{ "canonical_code": "IAD_CLIENT_RECEIVE_TIMEOUT", "localized_text": "Превышено время ожидания ответа. Проверьте статус операции в приложении.", "http_status": "0 Client Timeout" } |
Refresh & Logout (IAD)
| Исходный триггер (Бэкенд / СУБД / Клиент) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Фронтенда) |
|---|---|---|---|---|---|
Redis.ConnectionError: Connection refused |
UNAVAILABLE (14) 503 Service Unavailable |
IAD_INFRA_REDIS_FAIL_CLOSE |
Жесткая блокировка UI. Разлогинить пользователя и показать экран «Проблемы с безопасностью сети». | { "level": "CRITICAL", "metric_name": "infra_redis_down_incidents", "labels": { "subsystem": "blacklist", "strategy": "fail_close" } } |
{ "canonical_code": "IAD_INFRA_REDIS_FAIL_CLOSE", "localized_text": "Критическая ошибка безопасности ядра авторизации. Доступ временно заблокирован.", "http_status": "503 Service Unavailable" } |
Redis: refresh_token blacklist match |
UNAUTHENTICATED (16) 401 Unauthorized |
IAD_JWT_REFRESH_STOLEN |
Срабатывание защиты Interceptor: полная очистка SecureStorage и принудительный вылет на экран Login. |
{ "level": "CRITICAL", "metric_name": "security_token_reuse_alerts", "labels": { "token_type": "refresh", "action": "force_logout" } } |
{ "canonical_code": "IAD_JWT_REFRESH_STOLEN", "localized_text": "Текущая сессия скомпрометирована или устарела. Требуется повторный вход.", "http_status": "401 Unauthorized" } |
PostgreSQL: session rows not found |
NOT_FOUND (5) 401 Unauthorized |
IAD_SESSION_NOT_FOUND |
Остановить очередь запросов Dio Interceptor, сбросить токены и открыть форму входа. |
{ "level": "WARN", "metric_name": "session_validation_failures",<br/> "labels": { "reason": "missing_in_db" } } |
{ "canonical_code": "IAD_SESSION_NOT_FOUND", "localized_text": "Активная сессия устройства не найдена в базе данных.", "http_status": "401 Unauthorized" } |
PostgreSQL: user_sessions Deadlock |
ABORTED (10) 500 Internal Server Error |
IAD_SESSION_ROTATION_DEADLOCK |
Заморозить Interceptor на 2 секунды и выполнить повторную автоматическую попытку ротации (Retry). |
{ "level": "ERROR", "metric_name": "db_transaction_deadlocks_total", "labels": { "table": "user_sessions", "operation": "rotate_tokens" } } |
{ "canonical_code": "IAD_SESSION_ROTATION_DEADLOCK", "localized_text": "Внутренняя ошибка коллизии транзакций на сервере при обновлении ключей.", "http_status": "500 Internal Server Error" } |
App: SecureStorage write failure |
— — |
IAD_CLIENT_HARDWARE_KEYSTORE_FAIL |
Показать диалоговое окно ОС: «Недостаточно защищенной памяти устройства для сохранения ключей сессии». | { "level": "ERROR", "metric_name": "client_hardware_faults_total", "labels": { "storage": "ios_keychain_android_keystore", "operation": "write_tokens" } } |
{ "canonical_code": "IAD_CLIENT_HARDWARE_KEYSTORE_FAIL", "localized_text": "Аппаратная ошибка крипто-хранилища смартфона. Попробуйте перезагрузить девайс.", "http_status": "0 Client Storage Error" } |
Ошибки метода динамической синхронизации справочника (GET /api/v1/auth/error-directory)
| Исходный триггер (Бэкенд / СУБД / Клиент) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Фронтенда) |
|---|---|---|---|---|---|
gRPC: INVALID_ARGUMENT (app_lang unsupported) |
INVALID_ARGUMENT (3) 400 Bad Request |
IAD_DIRECTORY_UNSUPPORTED_LANG |
Игнорировать ошибку, принудительно переключить локализацию перехватчика ошибок на дефолтный en. |
{ "level": "WARN", "metric_name": "directory_sync_failed_total", "labels": { "reason": "invalid_lang_code", "fallback": "en" } } |
{ "canonical_code": "IAD_DIRECTORY_UNSUPPORTED_LANG", "localized_text": "Запрошенный язык локализации справочника ошибок не поддерживается сервером.", "http_status": "400 Bad Request" } |
PostgreSQL: table "error_directory" does not exist |
INTERNAL (13) 500 Internal Server Error |
IAD_DIRECTORY_SCHEMA_CORRUPTED |
Использовать жестко захардкоженный дефолтный набор ошибок в коде мобилки. | { "level": "CRITICAL", "metric_name": "db_schema_faults_total", "labels": { "table": "error_directory", "reason": "missing_relation" } } |
{ "canonical_code": "IAD_DIRECTORY_SCHEMA_CORRUPTED", "localized_text": "Внутренняя ошибка сервера: повреждена или отсутствует структура справочников.", "http_status": "500 Internal Server Error" } |
gRPC: DEADLINE_EXCEEDED (DB response too slow) |
DEADLINE_EXCEEDED (4) 504 Gateway Timeout |
IAD_DIRECTORY_SYNC_TIMEOUT |
Повторить фоновый запрос синхронизации через 5 минут. Не блокировать интерфейс. | { "level": "ERROR", "metric_name": "grpc_deadline_exceeded_total", "labels": { "rpc_method": "GetErrorDirectory" } } |
{ "canonical_code": "IAD_DIRECTORY_SYNC_TIMEOUT", "localized_text": "Истекло время ожидания ответа от мастер-сервиса справочников.", "http_status": "504 Gateway Timeout" } |
App: JsonUnsupportedObjectError during parsing |
— — |
IAD_CLIENT_JSON_PARSING_FAIL |
Записать инцидент в Crashlytics, отменить применение кэша и использовать локальный стейт. | { "level": "ERROR", "metric_name": "client_serialization_faults_total", "labels": { "parser": "dart_json_decode", "target": "error_directory" } } |
{ "canonical_code": "IAD_CLIENT_JSON_PARSING_FAIL", "localized_text": "Не удалось распарсить конфигурационный файл реестра ошибок. Структура пакета повреждена.", "http_status": "0 Client Parsing Error" } |
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)
B2B Store Webhook Sync (STORE)
| Исходный триггер (Бэкенд / СУБД / Клиент) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса / Интеграции (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Партнера/Фронтенда) |
|---|---|---|---|---|---|
gRPC: UNAUTHENTICATED (Shop token invalid) |
UNAUTHENTICATED (16) 401 Unauthorized |
STORE_B2B_INVALID_TOKEN |
Мгновенно отклонить запрос внешней торговой сети на шлюзе Nginx/FastAPI, заблокировать повторную обработку. | { "level": "ERROR", "metric_name": "b2b_webhook_auth_failures_total", "labels": { "reason": "bad_secret", "partner": "magnum" } } |
{ "canonical_code": "STORE_B2B_INVALID_TOKEN", "localized_text": "Переданный B2B API-ключ партнера X-Shop-Token не валиден или заблокирован.", "http_status": "401 Unauthorized" } |
gRPC: NOT_FOUND (Loyalty card token missing) |
NOT_FOUND (5) 404 Not Found |
STORE_B2B_LOYALTY_CARD_NOT_LINKED |
Вернуть партнеру 404 ошибку. Продукт в базу не зачисляется. Требуется привязка карты в приложении. | { "level": "WARN", "metric_name": "b2b_webhook_mapping_failures_total", "labels": { "reason": "card_not_found" } } |
{ "canonical_code": "STORE_B2B_LOYALTY_CARD_NOT_LINKED", "localized_text": "Указанный токен карты лояльности loyalty_card_token не привязан ни к одному аккаунту.", "http_status": "404 Not Found" } |
Kafka: TimeoutException on message publish |
— 500 Internal Server Error |
STORE_INFRA_KAFKA_PUBLISH_TIMEOUT |
Перехватить ошибку в store-service. Сбросить аварийный сырой JSON чека в буфер Promtail/Loki для ручного разбора инженерами. |
{ "level": "CRITICAL", "metric_name": "infra_kafka_broker_timeouts_total", "labels": { "topic": "store.inventory.in.receipt.imported", "action": "promtail_dump" } } |
{ "canonical_code": "STORE_INFRA_KAFKA_PUBLISH_TIMEOUT", "localized_text": "Внутренняя ошибка шины данных при асинхронной фиксации чека. Запрос сохранен в лог.", "http_status": "500 Internal Server Error" } |
PostgreSQL: processed_b2b_receipts duplicate match |
— — |
STORE_B2B_RECEIPT_DUPLICATE_DROP |
Идемпотентный сброс: Асинхронный воркер fridge-service тихо гасит транзакцию без вызова алертов. Продукты повторно не начисляются. |
{ "level": "WARN", "metric_name": "b2b_idempotency_blocks_total", "labels": { "strategy": "drop_message", "reason": "receipt_already_processed" } } |
{ "canonical_code": "STORE_B2B_RECEIPT_DUPLICATE_DROP", "localized_text": "Данный фискальный номер чека для указанного магазина уже был успешно обработан ранее.", "http_status": "200 OK (Idempotent Drop)" } |
WebSocketException: ConnectionResetError on push |
— — |
STORE_CLIENT_WEBSOCKET_DISCONNECTED |
Воркер зачислил продукты в базу, но пропускает пуш-ивент обновления экрана, так как клиент оффлайн. Стейт обновится при следующем открытии приложения. | { "level": "INFO", "metric_name": "client_websocket_push_dropped_total", "labels": {<br/> "reason": "client_offline",<br/> "event": "STOCK_INTEGRATION_UPDATED"<br/> } } |
{ "canonical_code": "STORE_CLIENT_WEBSOCKET_DISCONNECTED", "localized_text": "Продукты успешно зачислены на баланс, но real-time уведомление смартфона не удалось из-за обрыва связи.", "http_status": "0 Client WebSocket Offline" } |
B2B Financial Processing (BILLING)
| Исходный триггер (Бэкенд / СУБД / Кластер) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса / Интеграции (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Аналитики) |
|---|---|---|---|---|---|
Kafka: CommitFailedException |
— — |
BILLING_KAFKA_COMMIT_FAULT |
Офсет не зафиксирован. Брокер повторно доставит сообщение (Retry). Воркер ожидает дубль и полагается на слой идемпотентности. |
{ "level": "ERROR", "metric_name": "billing_kafka_commit_failures_total", "labels": { "consumer_group": "billing-b2b-group", "topic": "bpds.inventory.in.receipt.import" } } |
{ "canonical_code": "BILLING_KAFKA_COMMIT_FAULT", "localized_text": "Ошибка фиксации смещения в кластере Kafka. Запущена повторная обработка события.", "http_status": "500 Kafka Consumer Error" } |
NumericOverflowException on calculate |
— — |
BILLING_NUMERIC_OVERFLOW |
Критический сбой расчетов: Прервать итерацию, отправить чек в карантинный топик (Dead Letter Queue — DLQ) для ручной проверки цен вендора. | { "level": "CRITICAL", "metric_name": "billing_math_overflow_total", "labels": { "method": "CalculateReceiptTotal", "action": "route_to_dlq" } } |
{ "canonical_code": "BILLING_NUMERIC_OVERFLOW", "localized_text": "Арифметическое переполнение при вычислении итоговой суммы чека. Чек отправлен в DLQ.", "http_status": "422 Unprocessable Entity" } |
PostgreSQL: b2b_transactions unique match |
— — |
BILLING_TRANSACTION_DUPLICATE_DROP |
Идемпотентный сброс: Воркер биллинга обнаружил повторный чек, логирует событие BILLING_DUPLICATE_IGNORE и завершает задачу без начисления денег. |
{ "level": "WARN", "metric_name": "billing_idempotency_blocks_total", "labels": { "strategy": "drop_silently", "subsystem": "financial_audit" } } |
{ "canonical_code": "BILLING_TRANSACTION_DUPLICATE_DROP", "localized_text": "Данная финансовая транзакция по чеку уже учтена. Повторное начисление заблокировано.", "http_status": "200 OK (Financial Idempotency)" } |
PostgreSQL: b2b_transactions Deadlock |
— — |
BILLING_DB_TRANSACTION_DEADLOCK |
Транзакция откатывается СУБД. Воркер Kafka делает кратковременную паузу (Backoff) и повторяет попытку записи. | { "level": "ERROR", "metric_name": "billing_db_deadlocks_total", "labels": { "table": "b2b_transactions",<br/> "retry": "automatic" } } |
{ "canonical_code": "BILLING_DB_TRANSACTION_DEADLOCK", "localized_text": "Коллизия параллельных транзакций в финансовой БД. Инициирован автоматический повтор.", "http_status": "500 Internal Server Error" } |
Batch Inventory Consolidation (MERGE)
| Исходный триггер (Бэкенд / СУБД / Клиент) | gRPC / HTTP Статус | Каноничный код (canonical_code) |
Реакция интерфейса / Интеграции (ui_reaction) |
JSON для логов и метрик (Бэкенд аналитика / ELK / Prometheus) | JSON для маппинга из error_directory (Ответ для Фронтенда) |
|---|---|---|---|---|---|
Pydantic: empty or singular item_ids_list |
— 422 Unprocessable Entity |
FRIDGE_MERGE_EMPTY_ARRAY |
Заблокировать кнопку отправки в интерфейсе, вывести подсказку: «Выберите как минимум две партии для объединения». | { "level": "WARN", "metric_name": "inventory_merge_failed_total", "labels": { "reason": "validation_empty_list" } } |
{ "canonical_code": "FRIDGE_MERGE_EMPTY_ARRAY", "localized_text": "Некорректный запрос. Для слияния необходимо передать массив, содержащий минимум два идентификатора партий.", "http_status": "422 Unprocessable Entity" } |
PostgreSQL: row lock timeout on FOR UPDATE |
— 500 Internal Server Error |
FRIDGE_DB_ROW_LOCK_TIMEOUT |
Показать Alert-toast: «Позиция сейчас редактируется системой. Пожалуйста, повторите попытку через несколько секунд». | { "level": "ERROR", "metric_name": "db_row_locking_timeouts_total", "labels": { "table": "fridge_inventory", "conflict_with": "fifo_mutation" } } |
{ "canonical_code": "FRIDGE_DB_ROW_LOCK_TIMEOUT", "localized_text": "Превышено время ожидания блокировки строк СУБД. Позиции заняты параллельным процессом автосписания.", "http_status": "500 Internal Server Error" } |
Business Logic: heterogeneous products match |
— 400 Bad Request |
INVENTORY_MUTATION_HETEROGENEOUS_PRODUCTS_ERR |
Вывести модальное окно: «Ошибка смешивания. Нельзя объединять разнородные продукты (например, яблоки с персиками) или разные единицы измерения». | { "level": "WARN", "metric_name": "inventory_merge_failed_total", "labels": { "reason": "heterogeneous_data_mix" } } |
{ "canonical_code": "INVENTORY_MUTATION_HETEROGENEOUS_PRODUCTS_ERR", "localized_text": "Бизнес-отказ: выбранные партии не являются однородными. Проверьте соответствие SKU, названий продуктов и единиц измерения.", "http_status": "400 Bad Request" } |
PostgreSQL: delete/update deadlocks |
— 500 Internal Server Error |
FRIDGE_MERGE_DB_DEADLOCK |
Транзакция сбрасывается. Сервер автоматически инициирует повторную попытку выполнения (Retry Backoff). Интерфейс ожидает. | { "level": "ERROR", "metric_name": "db_transaction_deadlocks_total", "labels": { "operation": "batch_merge", "table": "fridge_inventory" } } |
{ "canonical_code": "FRIDGE_MERGE_DB_DEADLOCK", "localized_text": "Внутренняя коллизия транзакций при одновременном удалении и обновлении строк инвентаря.", "http_status": "500 Internal Server Error" } |
Kafka: QueueFullException on merge event |
— — |
FRIDGE_KAFKA_BUFFER_EXHAUSTED |
Отказоустойчивое сохранение: Метод завершается успешно для юзера, но ивент временно пишется в локальный файловый буфер для отложенной отправки. | { "level": "CRITICAL", "metric_name": "fridge_kafka_buffer_overflow_total", "labels": { "topic": "bpds.pma.out.process.event", "action": "local_buffer_fallback" } } |
{ "canonical_code": "FRIDGE_KAFKA_BUFFER_EXHAUSTED", "localized_text": "Внутренний буфер отправки шины данных перегружен. Событие аудита сохранено во временный кэш.", "http_status": "200 OK (Buffered Event)" } |
Bupar: UnknownEventTypeException |
— — |
BUPAR_UNKNOWN_EVENT_TYPE |
Игнорирование брокера: Воркер Bupar ломает обработку сообщения, сбрасывает лог и инкрементирует метрику. На UI пользователя никак не влияет. | { "level": "ERROR", "metric_name": "bupar_invalid_events_total", "labels": { "bad_type": "unknown_mutation_code" } } |
{ "canonical_code": "BUPAR_UNKNOWN_EVENT_TYPE", "localized_text": "Аналитическая шина Bupar не смогла распознать тип переданного бизнес-события мутации.", "http_status": "500 Kafka Consumer Error" } |
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-клиент. |