Client Logging Strategy
Решение о стратегии фронтенд-логирования и его связи с серверной диагностикой.
Дата: 2026-02-22 Статус: Accepted Контекст: Предпродакшн-ревью системы observability
Проблема
При диагностике проблем через Grafana (Loki) доступны только бэкенд-логи. Фронтенд-события (клики, навигация, состояние UI, ошибки API на стороне клиента) — слепая зона.
Вопрос: Нужно ли расширять клиентское логирование для полноценной диагностики?
Анализ
Текущее покрытие
| Слой | Покрытие | Инструмент |
|---|---|---|
| Backend HTTP | Полное | Request Logger Hook (auto) |
| Backend бизнес-логика | Полное | Domain tags [Quest], [Case], etc. |
| Backend бизнес-события | Полное | logBusinessEvent() → [BUSINESS] |
| Backend отказы | Полное | reason codes (NOT_COMPLETED, COOLDOWN, etc.) |
| Frontend lifecycle | Частичное | clientLogger — используется в bootstrapPerformanceTracker (summary, images) |
| Frontend user actions | Нет | — |
| Frontend API errors | Нет (видны на backend) | — |
| Frontend UI state | Нет | — |
Типичные сценарии диагностики
| Сценарий | Частота | Достаточно backend логов? |
|---|---|---|
| "Квест не засчитался" | Часто | Да — reason code в бэкенд логах |
| "Награда не пришла" | Часто | Да — [BUSINESS] event или warn с reason |
| "Ошибка 500" | Иногда | Да — error в цепочке requestId |
| "Кнопка не работает" | Редко | Нет — но воспроизводится на staging |
| "Белый экран" | Редко | Частично — clientLogger покрывает загрузку |
| "Уникальный баг у одного пользователя" | Очень редко | Зависит от случая |
Рабочий процесс разработчика
- Пользователь жалуется →
/diagnosticsпо userId → 95% случаев root cause найден - Не найден → разработчик воспроизводит на staging сам
- Проблема массовая (баг в коде), а не уникальная для одного пользователя
- Необходимость запрашивать действия у конечного пользователя — крайне редка
Решение
Оставить clientLogger в текущем минимальном виде. Расширять по необходимости.
Что уже работает (оставляем)
clientLoggerдля lifecycle (загрузка, phase transitions)POST /api/client-logsendpoint (без авторизации, rate-limited)- Логи попадают в Loki как
[ClientLog]→ доступны в Grafana
Что НЕ делаем сейчас
- Расширение clientLogger на все user actions
- Передача userId из frontend (требует рефакторинг auth flow)
- Стандартизация frontend event categories
- Отдельный скилл для добавления диагностических логов
Когда расширять
Триггеры для пересмотра решения:
| Триггер | Действие |
|---|---|
| >3 инцидентов за месяц, где бэкенд логов недостаточно | Добавить userId в clientLogger |
| Повторяющийся класс проблем (e.g., "кнопка не работает") | Добавить логирование API errors на фронте |
| Необходимость удалённой диагностики без staging | Расширить clientLogger до полной системы |
Инфраструктура готова
Когда понадобится расширение — всё уже на месте:
clientLogger.log() → POST /api/client-logs → backend stdout → Promtail → Loki → Grafana
Нужно только:
- Добавить
userIdв clientLogger после авторизации - Расширить категории (те же domain tags что на бэке)
- Обновить
/diagnosticsдля поиска[ClientLog]
Оценка: ~2-4 часа работы когда реально понадобится.
Альтернативы (отклонены)
A. Полная фронтенд-система логирования
Логировать все: API calls, navigation, clicks, state changes.
Отклонено: YAGNI. Бэкенд покрывает 95% диагностики. Дополнительная нагрузка на сеть и Loki без доказанной необходимости.
B. Скилл /instrument для динамического добавления логов
Claude-скилл, который анализирует проблему и добавляет целевые логи в код.
Отклонено: Over-engineering. Claude уже умеет добавлять clientLogger.log() ad-hoc без формализованного скилла. Если потребуется — достаточно сказать "добавь фронтенд-логи для проблемы X".
C. Конвенция + Guidelines для фронтенд-логирования
Документ аналогичный logging-guidelines.md, но для фронтенда.
Отклонено (пока): Преждевременно без реального использования. Создать вместе с расширением clientLogger, когда появится практика.
Последствия
- Разработчики продолжают использовать
/diagnostics+ ручное воспроизведение на staging - clientLogger остаётся для loading diagnostics — не трогаем
- Решение пересматривается при появлении триггеров (см. таблицу выше)
- Инфраструктура (endpoint, pipeline) уже готова для быстрого расширения
Related
- Observability — Backend logging, metrics, tracing
- Logging Architecture — Pipeline: Pino → Loki → Grafana
- Troubleshooting Guide — Operational runbook
- Logging Guidelines — Backend logging standards