Эксплуатация и наблюдаемость: сервис учится говорить
Отсутствие админ-панели (яма из гл. 1) не значит отсутствия наблюдаемости — оно значит, что наблюдаемость часть кода вашего приложения. Глава даёт трём столпам исполнение в XServer.
Обзор
43.1 Введение
Три вопроса наблюдаемости: сервис жив (здоровье), что сервис делал (логи), сервис всё ещё здоров (тренды ресурсов). В контексте XServer у каждого сверхкороткий путь: здоровье = один маршрут; логи = xrtLogger (76 API — уровни/форматирование/несколько приёмников) или printf; ресурсы = отчёты памяти + замеры RSS. Важно поставить всё с первого дня, а не чинить после аварии.
43.2 Структурное логирование
/* разработка: printf достаточно (путь демо) */
printf("[demo] handler done: %s\n", sPath);
/* эксплуатация: xrtLogger — уровни, несколько приёмников, перехват */
/* logger строится в Init (файл + stdout, уровень конфигурируется) */
G_pLog = xrtLoggerCreate(...);
/* путь запроса: с уровнем и меткой модуля */
xrtLogInfo(G_pLog, "api", "item %lld fetched in %lld us", iId, iUs);
xrtLogWarn(G_pLog, "api", "slow query: %lld us", iUs);
/* уничтожение в ServiceUnit — logger тоже состояние поколения */
- Дисциплина уровней: INFO — нормальный ход (отключаемый), WARN — автоматически восстановимые аномалии, ERROR — требующее человека
- ID запроса: в слое модулей генерируйте короткий ID и несите его через все строки лога одного запроса — «нить Ариадны» при отладке
- Вывод: stdout уходит в journald/сервис-менеджер; файловый вывод ротируйте сами (или доверьте logrotate резать по размеру)
43.3 Наблюдение за памятью
- Внешние тренды: замеры RSS (способ drill: PowerShell WorkingSet64 / /proc VmRSS) в мониторинг — ровная линия здорова, наклон требует разбора
- Внутренняя структура: система отладки памяти xrt (канарейки / UAF / отчёты распределений, TEXT и JSON) — включается в конфигурации сборки хоста (см. учебник xrt, гл. 06), в продакшне по потребности
- Сверка при смене поколений: счёт finalized (гл. 30) + активные распределения отчёта — ежедневное доказательство «горячая перезагрузка без утечек»
43.4 Инспекционные маршруты
/* /health: предельно простой эндпоинт для балансировщика и мониторинга */
ReplyText(pReq, 200, "ok"); /* никакой сложной логики */
/* /stats: метрики уровня приложения (за аутентификацией) */
xvalue* p = xrtValueObject();
xrtValueObjectSetNew(p, "uptime_s", xrtValueInt64(UpSec()));
xrtValueObjectSetNew(p, "requests", xrtValueInt64((int64)G_iTotal));
xrtValueObjectSetNew(p, "ws_online", xrtValueInt64(ConnCount()));
xrtValueObjectSetNew(p, "reload", ReloadSummary()); /* счёт терминалов */
ReplyJSON(pReq, 200, p); xrtValueRelease(p);
Точки паттерна: /health отвечает только жив/мёртв (проверки зависимостей заставят LB снимать здоровые экземпляры); /stats отдаёт бизнес-метрики за аутентификацией (дисциплина гл. 27). Нужен формат Prometheus? xvalue → текст однострочным циклом.
43.5 Контракт
- Столпы: маршрут здоровья, структурные логи, тренды ресурсов — с первого дня.
- Дисциплина: /health минимален; /stats за аутентификацией; уровни логов делятся на три.
- Базлайны: тесты и учения (func/drill/routebench) бегут на всём пути эволюции версий — они контрольная группа регрессий поведения.
Частые ошибки
- Симптом
- База вздрогнула — LB снимает все экземпляры, лавина на весь сайт.
- Причина
- «Глубокий медосмотр» втиснут в «датчик жизни». Зонд LB отвечает только «может ли процесс обслуживать»; здоровье зависимостей — в отдельном /deep (для людей или алертов).
- Симптом
- Под конкурентностью логи переплетаются, след одного запроса не собрать.
- Причина
- Голый printf без контекста запроса. Генерируйте короткий ID в слое модулей и несите в каждой строке (дисциплина ID из 43.2).
Упражнения
Дайте демо /health, /stats и логирование запросов через xrtLogger.
Внешний скрипт каждые 10 с берёт RSS + /stats в CSV и рисует график.
Реализуйте /metrics: экспортируйте ws_online, счётчики запросов, счётчики смен и другое из реестров.
Итоги
| Тезис | Вывод |
|---|---|
| Три столпа | /health (жизнь), логи (следы), тренды ресурсов (самочувствие) |
| Логирование | в dev printf / в эксплуатации xrtLogger; нить ID запроса |
| Память | RSS-тренды собираются снаружи; отчёты распределений сверяются внутри |
| Инспекция | health минимален, stats за аутентификацией, deep отдельно |
- справочник xrt · logger — полный API уровней / форматирования / приёмников
- справочник xrt · memory_stats — снимки статистики распределений