Observability и CI/CD
Сервис без наблюдаемости - чёрный ящик, а без CI-ворот баги ловят пользователи. Собес проверяет базу эксплуатации: три столпа observability, разницу liveness и readiness и роль CI как ворот качества до прода.
Типовые формулировки: «зачем logging вместо print?», «чем liveness отличается от readiness?», «что делает CI на каждый пуш».
Логи и три столпа наблюдаемости
logging вместо print - не вкусовщина: модуль logging даёт уровни (debug/info/error), формат (JSON для машинного сбора), хендлеры и централизованную конфигурацию. Можно приглушить шум и поднять детализацию БЕЗ правки кода, а логи маршрутизировать в сборщик. print в проде это ни уровней, ни формата, ни маршрутизации, потом не разобрать.
Три столпа observability дополняют друг друга. Логи - события, ЧТО случилось. Метрики - числовые агрегаты, СКОЛЬКО и как (rps, латентность, ошибки). Трейсы - путь запроса через сервисы, ГДЕ тормозит. Один столп не заменяет другой: по логам не увидишь тренд, по метрикам - конкретную ошибку.
// Структурированные (JSON) логи - потому что их собирает и ищет система; человекочитаемая строка хороша локально, но не в проде под нагрузкой.
- logging
- структурированные логи с уровнями и маршрутизацией
- три столпа
- логи, метрики, трейсы
Liveness/readiness и ворота CI/CD
Health-check (/health) нужен оркестратору, чтобы судить о состоянии инстанса, и делится на два разных вопроса. Liveness - ЖИВ ли процесс: если нет, оркестратор перезапускает. Readiness - ГОТОВ ли принимать трафик (прогрел кэш, поднял соединения): если нет, трафик не шлют, но и не перезапускают. Путать их опасно: перезапускать инстанс, который просто ещё прогревается, уронить его в цикле рестартов.
CI на каждый пуш и PR гоняет линт, типы и тесты, собирает образ - красное НЕ едет в прод. Это автоматические ворота качества ДО пользователей: ломающее ловится в пайплайне, а не в проде. CD затем выкатывает уже проверенный артефакт. Деплой без CI-ворот означает, что баги находят пользователи.
// Health-check держат лёгким: он должен отвечать быстро, а не выполнять тяжёлую операцию, иначе сам станет источником нагрузки и ложных срабатываний.
- liveness/readiness
- жив ли инстанс / готов ли принимать трафик
- CI/CD
- автопроверки перед деплоем / выкатка артефакта
Как отвечать: «Чем liveness отличается от readiness?»
Они отвечают на разные вопросы, и реакция оркестратора на них разная. Liveness - жив ли процесс вообще: если проба не проходит, значит инстанс завис или сломался, и его надо перезапустить. Readiness - готов ли инстанс ПРИНИМАТЬ трафик прямо сейчас: он может быть жив, но ещё прогревает кэш или поднимает соединения к БД, и пока не готов, оркестратор просто не шлёт на него запросы, но НЕ перезапускает. Путаница тут дорого стоит: если на медленный прогрев повесить liveness, оркестратор будет убивать инстанс, который вот-вот был бы готов, и получится цикл рестартов. Поэтому прогрев это readiness, а не liveness. И обе пробы держу лёгкими, чтобы они не создавали нагрузку сами.
Разведены оба вопроса с конкретной реакцией (перезапуск против отвода трафика), назван реальный провал при путанице (цикл рестартов) и добавлено про лёгкость проб - эксплуатационная зрелость.
На чём валят
- −Логировать через print в проде: нет уровней, формата и маршрутизации - потом не разобрать.
- −Путать liveness и readiness: перезапускать инстанс, который лишь прогревается - цикл рестартов.
- −Деплоить без CI-ворот: ломающие изменения ловятся уже на пользователях, а не в пайплайне.
- −Делать health-check тяжёлым: сам станет нагрузкой и источником ложных срабатываний.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Какие три «столпа» наблюдаемости (observability) обычно называют?A)Бэкапы, репликация и алёрты — базовые гарантии надёжности сервисаB)Логи, метрики и трейсы — они отвечают на разные вопросыC)Юнит-, интеграционные и e2e-тесты как способ наблюдать за системойD)CPU, память и диск — три метрики, которых достаточно сервису
показать ответ и разбор
+B)Логи, метрики и трейсы — они отвечают на разные вопросы// разбор: Три столпа: логи (дискретные события — что и когда произошло), метрики (числовые агрегаты во времени — сколько запросов, какая задержка, ошибки) и трейсы (путь одного запроса через сервисы — где именно тормозит). Вместе они дают разные срезы: логи для деталей, метрики для трендов и алёртов, трейсы для распределённой диагностики.
- Зачем сервису эндпоинт health-check (например /health)?A)Чтобы пользователи видели красивую страницу статуса сервисаB)Чтобы отдавать версию приложения браузеру при каждом заходе на сайтC)Оркестратор проверяет живость и готовность инстанса по немуD)Чтобы измерять точное время ответа всех остальных эндпоинтов сразу
показать ответ и разбор
+C)Оркестратор проверяет живость и готовность инстанса по нему// разбор: Health-check — точка, по которой оркестратор (Kubernetes) и балансировщик судят о состоянии инстанса: liveness (жив ли — иначе перезапустить) и readiness (готов ли принимать трафик — иначе не слать запросы, пока прогревается или отвалилась БД). Обычно это лёгкая проверка ключевых зависимостей, а не тяжёлая операция.
- Что обычно делает CI-пайплайн до деплоя?A)Гоняет линт и тесты, собирает артефакт — красный не едет в продB)Общается с пользователями, собирая обратную связь о новой версииC)Форматирует код разработчика прямо в его рабочей ветке за негоD)Просто копирует код на сервер без каких-либо проверок в процессе
показать ответ и разбор
+A)Гоняет линт и тесты, собирает артефакт — красный не едет в прод// разбор: CI на каждый пуш/PR прогоняет линтеры, типы (mypy) и тесты, собирает образ — и не пускает изменения дальше, если что-то красное. Это автоматические ворота качества: до прода доезжает только проверенный код. CD затем выкатывает собранный артефакт. Так ломающие изменения ловятся до пользователей, а не после.
- Почему в проде логируют через модуль logging, а не через print?A)logging даёт уровни, формат и маршрутизацию — можно управлять без правки кодаB)print запрещён синтаксисом Python при запуске приложения в контейнере или на сервереC)print в проде вообще не выводит ничего, его сообщения теряются на пути к консолиD)logging работает быстрее print, поэтому его и выбирают для нагруженного прода
показать ответ и разбор
+A)logging даёт уровни, формат и маршрутизацию — можно управлять без правки кода// разбор: logging даёт то, чего нет у print: уровни (debug/info/warning/error), настраиваемый формат (в т.ч. JSON для сбора), хендлеры и маршрутизацию, централизованную конфигурацию. Можно приглушить шум и поднять детализацию без правки кода, добавить контекст (id запроса). print — просто вывод строки без структуры и управления; в проде он не даёт разобрать инцидент. Отсюда правило: logging, не print.
- Три столпа observability — что это и зачем разные?A)Три обязательных внешних сервиса, без покупки всех сразу observability не работаетB)Три уровня доступа к системе мониторинга для разработчиков, админов и менеджеровC)Это три разных названия одного и того же: по сути все они являются просто логамиD)Логи (что случилось), метрики (сколько/как), трейсы (где тормозит) — разные вопросы
показать ответ и разбор
+D)Логи (что случилось), метрики (сколько/как), трейсы (где тормозит) — разные вопросы// разбор: Логи, метрики и трейсы — три взаимодополняющих сигнала. Логи — дискретные события (что именно случилось, с контекстом). Метрики — числовые агрегаты во времени (сколько запросов, задержка, ошибки — для дашбордов и алертов). Трейсы — путь одного запроса через сервисы (где именно он проводит время, где узкое место). Вместе они отвечают на разные вопросы при диагностике; полагаться лишь на один недостаточно.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.