Инфраструктура сервиса: мониторинг и трейсинг
Сервис в проде - чёрный ящик, пока ты не сделал его наблюдаемым. Когда в три ночи растут ошибки, спасают не догадки, а телеметрия: логи, метрики, трейсы. На собесе middle-уровня спрашивают именно про эти три столпа и про то, чем мониторинг отличается от observability.
Разберём, что каждый столп отвечает, как устроены типы метрик Prometheus, зачем трейсы и correlation-id, и почему алертить надо на симптом, а не на каждую дрогнувшую цифру.
Три столпа и типы метрик
Логи - дискретные события с контекстом («что случилось»), метрики - числовые агрегаты во времени («сколько и как часто»), трейсы - путь запроса через сервисы («где затормозило»). Мониторинг проверяет заранее известные пороги; observability - свойство системы отвечать на вопросы, которые ты не заготовил, проваливаясь от симптома к причине.
В Prometheus (pull-модель: сервис отдаёт /metrics, сервер скрейпит) три базовых типа. Counter только растёт (события; смотрят rate()). Gauge - мгновенная величина вверх/вниз (активные коннекты, длина очереди). Histogram раскладывает наблюдения по бакетам, чтобы считать перцентили - p95/p99, потому что среднее прячет медленный хвост.
from prometheus_client import Counter, Histogram
REQS = Counter("http_requests_total", "", ["method", "route"])
LAT = Histogram("http_latency_seconds", "")Трейсы, correlation-id, алерты
В микросервисах один запрос идёт через несколько сервисов, и чтобы увидеть, ГДЕ время, нужен распределённый трейс: каждый сервис создаёт спан, все спаны сшиты общим trace-id, контекст пробрасывается по вызовам. Тот же id (correlation/request-id) протаскивают в структурные (JSON) логи - тогда всю историю запроса собираешь по одному ключу.
Алерты вешают на симптом, который бьёт по пользователю (рост ошибок/латентности, сгорающий error budget по SLO), а не на каждую внутреннюю метрику. Иначе шум рождает усталость, и реальный инцидент проспят. И осторожно с метками: user_id в метке взрывает число временных рядов - высокая кардинальность идёт в логи/трейсы, а не в метрики.
- SLO
- service level objective
Как отвечать: «Почему для latency берут гистограмму, а не среднее?»
Потому что среднее прячет хвост: 99% быстрых запросов маскируют тот 1% медленных, который и злит пользователей. Гистограмма раскладывает задержки по бакетам, и из них считаются перцентили - p95 и p99 показывают, как плохо худшим запросам. Именно хвост, а не среднее, обычно определяет SLO и восприятие сервиса пользователем.
Ответ показывает, что человек думает о распределении и о пользовательском опыте, а не берёт первую попавшуюся агрегатную цифру.
На чём валят
- −Метка высокой кардинальности (user_id, request_id) в метрике - взрыв временных рядов, Prometheus ложится.
- −Смотреть среднюю задержку вместо p95/p99 - среднее маскирует медленный хвост.
- −Путать Counter и Gauge: применять rate() к gauge или пытаться уменьшать counter.
- −Алертить на всё подряд и на внутренние причины без влияния на пользователя - шум, важное проспят.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- В чём разница между мониторингом и наблюдаемостью (observability)?A)Это полные синонимы, просто observability — более новое модное словоB)Мониторинг ловит известное; observability — разбирать неизвестноеC)Мониторинг платный и облачный, а observability — только опенсорс-инструментыD)Мониторинг работает лишь в проде, а observability включают исключительно на стадии тестирования
показать ответ и разбор
+B)Мониторинг ловит известное; observability — разбирать неизвестное// разбор: Мониторинг проверяет заранее известные условия («CPU>80%», «5xx растут») и хорош, когда знаешь, что мерить. Observability — свойство системы, дающее по телеметрии отвечать на вопросы, которые не заготовил заранее: провалиться от симптома к причине через метки, трейсы и корреляцию. Одно не заменяет другое.
- Для чего в приложении используют Sentry (или аналог)?A)Хранение всех подряд info-логов приложения для последующего полнотекстового поискаB)Постоянный замер CPU и памяти узлов кластера с построением графиков нагрузкиC)Сбор исключений со стектрейсом, группировкой и контекстомD)Прогон тестов на каждый коммит и блокировку мержа при падении сборки в пайплайне
показать ответ и разбор
+C)Сбор исключений со стектрейсом, группировкой и контекстом// разбор: Sentry — трекер ошибок: перехватывает необработанные исключения, шлёт стектрейс с локальным контекстом (переменные, релиз, пользователь, окружение), группирует одинаковые в одну проблему и дедуплицирует всплески. Это точечный инструмент под ошибки — не замена метрикам и не общий лог-склад.
- Prometheus-клиент даёт типы Counter и Gauge. В чём разница?A)Counter для целых чисел, Gauge — исключительно для дробных значенийB)Counter хранит историю всех значений, Gauge — только самое последнее без прошлогоC)Они взаимозаменяемы, выбор между ними влияет только на цвет линии на дашборде GrafanaD)Counter только растёт (события), Gauge — текущее значение вверх/вниз
показать ответ и разбор
+D)Counter только растёт (события), Gauge — текущее значение вверх/вниз// разбор: Counter — монотонно растущий счётчик событий (запросы, ошибки), его нельзя уменьшать; смотрят обычно rate() — скорость роста. Gauge — мгновенная величина, которая ходит вверх и вниз (число активных соединений, длина очереди, температура). Перепутать типы — исказить графики и алерты.
- Для latency HTTP-запросов берут Histogram, а не Gauge средней задержки. Почему?A)Гистограмма даёт перцентили (p95/p99), среднее их прячетB)Gauge не умеет хранить дробные значения задержки в миллисекундахC)Histogram потребляет меньше памяти, чем один Gauge на всю задержкуD)Среднее по задержке потребовало бы хранить каждый запрос, что дороже гистограммы
показать ответ и разбор
+A)Гистограмма даёт перцентили (p95/p99), среднее их прячет// разбор: Средняя задержка прячет хвост: 99% быстрых запросов маскируют 1% медленных, которые и злят пользователей. Histogram раскладывает наблюдения по бакетам, и из них Prometheus считает перцентили — p95/p99 показывают, как плохо «худшим» запросам. Именно хвост, а не среднее, обычно определяет SLO.
- Запрос идёт через api-gateway → сервис заказов → сервис оплаты, и где-то тормозит. Что покажет, ГДЕ именно?A)Логи одного шлюза — там видно полное время всех внутренних вызовов насквозьB)Распределённый трейс: спаны сервисов по общему trace-idC)Средняя загрузка CPU на узлах, по ней сразу ясно, какой сервис виноват в задержкеD)Счётчик общего числа запросов в минуту, из которого выводится узкое место в цепочке вызовов
показать ответ и разбор
+B)Распределённый трейс: спаны сервисов по общему trace-id// разбор: Распределённый трейс сшивает путь одного запроса: каждый сервис создаёт спан со своим временем, все спаны связаны общим trace-id, а контекст пробрасывается по вызовам. На водопаде видно, какой участок съел время — это то, чего не дадут ни разрозненные логи, ни агрегатные метрики.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.