Глава 43 / 51
Том 5 · Расширения, эксплуатация и практика

Эксплуатация и наблюдаемость: сервис учится говорить

Отсутствие админ-панели (яма из гл. 1) не значит отсутствия наблюдаемости — оно значит, что наблюдаемость часть кода вашего приложения. Глава даёт трём столпам исполнение в XServer.

Обзор

Позиционирование: справочник отладки из гл. 06 в эксплуатационной редакции. Продукты: система структурных логов, переключатели отчётов памяти, инспекционные маршруты /health и /stats — сразу в ваш modules/.

43.1 Введение

Три вопроса наблюдаемости: сервис жив (здоровье), что сервис делал (логи), сервис всё ещё здоров (тренды ресурсов). В контексте XServer у каждого сверхкороткий путь: здоровье = один маршрут; логи = xrtLogger (76 API — уровни/форматирование/несколько приёмников) или printf; ресурсы = отчёты памяти + замеры RSS. Важно поставить всё с первого дня, а не чинить после аварии.

43.2 Структурное логирование

От printf к logger
/* разработка: 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 и /stats (паттерн)
/* /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) бегут на всём пути эволюции версий — они контрольная группа регрессий поведения.

Частые ошибки

В /health лезут в базу
Симптом
База вздрогнула — LB снимает все экземпляры, лавина на весь сайт.
Причина
«Глубокий медосмотр» втиснут в «датчик жизни». Зонд LB отвечает только «может ли процесс обслуживать»; здоровье зависимостей — в отдельном /deep (для людей или алертов).
Логи без нити ID
Симптом
Под конкурентностью логи переплетаются, след одного запроса не собрать.
Причина
Голый printf без контекста запроса. Генерируйте короткий ID в слое модулей и несите в каждой строке (дисциплина ID из 43.2).

Упражнения

БазовыйТри столпа установлены

Дайте демо /health, /stats и логирование запросов через xrtLogger.

Приёмка: /health <1 мс; /stats по токену; логи фильтруются по ID запроса.
ПродвинутыйСбор трендов

Внешний скрипт каждые 10 с берёт RSS + /stats в CSV и рисует график.

Приёмка: через стрессовый отрезок с 10 сменами кривая ровная и читаемая.
ВызовТекстовый эндпоинт Prometheus

Реализуйте /metrics: экспортируйте ws_online, счётчики запросов, счётчики смен и другое из реестров.

Приёмка: Prometheus успешно забирает и рисует минимальный дашборд.

Итоги

ТезисВывод
Три столпа/health (жизнь), логи (следы), тренды ресурсов (самочувствие)
Логированиев dev printf / в эксплуатации xrtLogger; нить ID запроса
ПамятьRSS-тренды собираются снаружи; отчёты распределений сверяются внутри
Инспекцияhealth минимален, stats за аутентификацией, deep отдельно
Что дальше по xrt