[GOV-OBS-012] Внедрить структурированное JSON-логирование для ClickHouse
Перевод stdout шлюза на JSON Lines для интеграции с Vector и ClickHouse
NoteКраткая карточка задачи
- Репозиторий / Компонент:
gov-registry-gateway(Go / SOAP Ingress). - Тип задачи: Инфраструктурная / Обсервабилити (Observability).
- Справочник ошибок: [Раздел 5. Справочник ошибок технической документации]
- Статус: Готово к реализации
- Инструкция по шагам:
- Удаление текстовых логов: Полностью удалить из кодовой базы стандартные вызовы
log.Printlnиlog.Fatalfпосле инициализации БД. Логирование вos.Stdoutдолжно содержать строго одну валидную JSON-строку на одно событие (формат JSON Lines). - Подключение логгера: Интегрировать структурированный логгер (рекомендуется встроенный
slogиз Go 1.21+ илиuber-go/zap). Текстовые примеси в потоке вывода запрещены, так как они ломают сборщик логов Vector. - Формирование базовых полей: Настроить автоматическую генерацию полей для каждого события:
timestamp(в формате RFC3339 Nano),level(INFO,WARN,ERROR,FATAL) иui_payload(для данного сервиса всегда передаватьnull). - Реализация логирования бизнес-ошибок (На Шаге 7 и Шаге 13): При возникновении нештатных ситуаций или отказов авторизации, формировать корневое поле
canonical_codeи вложенный объектobservability_jsonв точном соответствии со справочником ошибок:- При невалидном/отозванном токене:
canonical_code: "GOV_AUTH_DENIED", вtransport_statusesпередавать{"grpc": 16, "http": 401}, а вobservability_json.labelsуказывать причинуtoken_invalid_or_revoked. - При отсутствии записи в реестре:
canonical_code: "DB_EMPLOYEE_NOT_FOUND", вtransport_statusesпередавать{"grpc": 5, "http": 200}, а в метрику отправлять ярлыкuser_id_absent.
- При невалидном/отозванном токене:
- Логирование критических сбоев СУБД: В блоке обработки системных ошибок соединения с PostgreSQL формировать лог с уровнем
FATAL, кодомDB_GOV_POSTGRES_DOWN, статусами{"grpc": 14, "http": 500}и таргетомINTERNAL_SYSTEM. Внутри меток ClickHouse передавать точное имя базы данныхgov_registry_db. - Логирование успешных запросов (На Шаге 15): При успешной отдаче персональных данных сотрудника формировать лог со значением
canonical_code: "SUCCESS", уровнемINFOи статусами{"grpc": null, "http": 200}.
- Удаление текстовых логов: Полностью удалить из кодовой базы стандартные вызовы
5. Справочник ошибок и Обсервабилити (ClickHouse / UI Logs)
Для обеспечения сквозного мониторинга (Observability), анализа качества интеграции и сбора метрик в ClickHouse, каждая нештатная ситуация классифицируется по внутреннему коду.
При возникновении ошибки сервис формирует структурированный лог, содержащий контекст для внешних систем и метрики для аналитической СУБД.
| 1. Код (canonical_code) | 2. Уровень (log_level) | 3. Статусы (transport_statuses) | 4. Получатель (error_target) | 5. JSON для Фронтенда (ui_payload) | 6. Метрики для ClickHouse (observability_json) |
|---|---|---|---|---|---|
| GOV_AUTH_DENIED | WARN | {“grpc”: 16, “http”: 401} | EXTERNAL_SYSTEM | null | {“metric”: “auth_fail”, “labels”: {“service”: “gov_gateway”, “reason”: “token_invalid_or_revoked”}} |
| DB_GOV_POSTGRES_DOWN | FATAL | {“grpc”: 14, “http”: 500} | INTERNAL_SYSTEM | null | {“code”: “DB_GOV_POSTGRES_DOWN”, “metric”: “db_conn_lost”, “labels”: {“db”: “gov_registry_db”}} |
| DB_EMPLOYEE_NOT_FOUND | INFO | {“grpc”: 5, “http”: 200} | EXTERNAL_SYSTEM | null | {“metric”: “registry_miss”, “labels”: {“service”: “gov_gateway”, “reason”: “user_id_absent”}} |
| SOAP_XML_BAD_REQUEST | WARN | {“grpc”: 3, “http”: 400} | EXTERNAL_SYSTEM | null | {“metric”: “contract_fail”, “labels”: {“validator”: “go_xml_unmarshal”}} |