Вопросы по мониторингу на собеседовании: Prometheus, алерты, логи
Мониторинг проверяют на понимании, а не на списке инструментов. Почему лейбл с идентификатором пользователя роняет хранилище, чем sum(rate(...)) отличается от rate(sum(...)), почему алерт на загрузку процессора будит зря, а деградацию сервиса пропускает.
Что спрашивают
- +Метрики: pull-модель и экспортеры, counter, gauge и histogram, кардинальность и число рядов
- +PromQL: rate и обработка сброса счётчика, порядок агрегации, квантили из бакетов гистограммы
- +Алертинг: параметр for, симптомы против причин, группировка и подавление в Alertmanager
- +Логи и трассы: структурный формат, сквозной идентификатор запроса, сэмплирование, золотые сигналы
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.
- Логи8
- Алертинг и дежурство7
- Метрики и Prometheus7
- PromQL и правила6
- Трейсинг и золотые сигналы6
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- Метрики и Prometheus: типы и кардинальность7 вопросов
- PromQL: rate, агрегация, квантили6 вопросов
- Алерты и дежурство без шума7 вопросов
- Логи: структура, объём, идентификатор запроса8 вопросов
- Трассировка и золотые сигналы6 вопросов
Примеры вопросов с разбором
- В правиле алерта указано for: 5m. Что это даёт?A)Алерт повторно шлётся каждые пять минут, пока не погаснетB)Условие должно держаться все пять минутC)Метрика усредняется за пятиминутное окно перед сравнениемD)После срабатывания алерт молчит пять минут и не дублируется
показать ответ и разбор
+B)Условие должно держаться все пять минут// разбор: Правило переходит в состояние pending, как только условие стало истинным, и превращается в firing, только если оно продержалось указанное время. Так отсекаются секундные всплески и дребезг у порога. Оборотная сторона — задержка обнаружения: для быстро деградирующих сервисов держат короткое ожидание или комбинируют два правила с разными окнами и порогами.
- Почему в проде просят писать логи структурно, а не свободной строкой?A)Структурный лог занимает меньше места на дискеB)Только такой формат принимают системы сбора логовC)По полям можно искать и фильтровать без разбора регуляркамиD)Структурный формат исключает попадание секретов в лог
показать ответ и разбор
+C)По полям можно искать и фильтровать без разбора регулярками// разбор: Строка «ошибка у пользователя 42 при оплате» требует регулярки, которая ломается от любой правки формулировки. Запись с полями (уровень, сервис, идентификатор запроса, код ошибки, длительность) индексируется и ищется запросами, агрегируется в дашборд, связывается с трассой по общему полю. Плата — чуть больший объём и дисциплина: набор полей должен быть общим для всех сервисов.
- Как Prometheus получает метрики сервиса?A)Сервис шлёт метрики в Prometheus по протоколу statsdB)Агент на ноде собирает метрики и пересылает их в базуC)Prometheus сам забирает значения по HTTPD)Метрики попадают через журнал: Prometheus читает логи сервиса
показать ответ и разбор
+C)Prometheus сам забирает значения по HTTP// разбор: Модель pull: сервис отдаёт текущее состояние счётчиков на эндпоинте, а Prometheus по расписанию обходит цели, найденные через service discovery. Плюсы — сервер знает, кто жив (метрика up), нет очередей и обратного давления от приёмника. Минус — короткоживущие задачи не успевают попасть под опрос; для них есть pushgateway, но им не злоупотребляют: метрика теряет привязку к экземпляру.
- Почему частоту запросов считают через rate по счётчику, а не разностью соседних значений?A)Разность запрещена синтаксисом языка запросовB)Rate сглаживает данные и убирает выбросы измеренийC)Разность считает в штуках, а нужны процентыD)Rate даёт частоту и переживает сброс
показать ответ и разбор
+D)Rate даёт частоту и переживает сброс// разбор: Счётчик обнуляется при каждом рестарте процесса, и наивная разность даёт отрицательный скачок или чудовищный всплеск. Rate за окно видит сброс, чинит его и делит прирост на длительность — получается частота в секунду, сравнимая между инстансами и окнами. Для алертов чаще берут rate за 5 минут, для быстрых графиков — irate, который смотрит два последних отсчёта.
- Метрики и логи уже есть. Что добавляет распределённая трассировка?A)Разбивку одного запроса по сервисам с временем каждого шагаB)Хранение метрик с высоким разрешением за длительный периодC)Автоматическое обнаружение аномалий в поведении сервисовD)Проверку доступности сервисов из разных точек сети
показать ответ и разбор
+A)Разбивку одного запроса по сервисам с временем каждого шага// разбор: Метрики отвечают «сколько и как быстро в целом», логи — «что случилось в конкретном месте», трасса — «куда ушло время внутри одного запроса»: цепочка спанов с длительностью каждого вызова, включая базы и внешние API. Это единственный удобный способ увидеть, что 300 миллисекунд из 400 съел один медленный вызов на четвёртом уровне вложенности.
- Дежурного будят алертом «CPU ноды выше 90%». Пользователи при этом ничего не замечают. В чём беда правила?A)Порог занижен: будить стоит от 95% и вышеB)Алерт нужно вешать на среднее по кластеру, а не на нодуC)Правилу не хватает окна: с пятиминутным ожиданием оно замолчитD)Это алерт на причину, а будить должны симптомы для пользователя
показать ответ и разбор
+D)Это алерт на причину, а будить должны симптомы для пользователя// разбор: Высокая загрузка процессора сама по себе не беда: сервис может отвечать в срок и на 95%. Будят по симптомам — росту ошибок, задержкам выше цели, сжиганию бюджета ошибок, — то есть по тому, что чувствует пользователь. Метрики ресурсов остаются на дашбордах и помогают разбираться после срабатывания, а в правила попадают только там, где упор в ресурс гарантированно ведёт к отказу.
- После релиза объём логов вырос в десять раз, хранилище задыхается. Что делать в первую очередь?A)Поднять срок хранения, чтобы данные не терялись при чисткеB)Найти болтливые источники, урезать уровеньC)Перевести сбор логов на push-модель с агентом на каждой нодеD)Сжать индексы и отключить полнотекстовый поиск по всем полям
показать ответ и разбор
+B)Найти болтливые источники, урезать уровень// разбор: Сначала находят источник: обычно это debug, забытый включённым, или лог на каждый запрос в горячем пути. Дальше — уровень логирования по сервисам, сэмплирование повторяющихся событий, вынос детальной отладки во включаемый по требованию режим. Заодно проверяют срок хранения по классам логов: аудит держат долго, отладку — дни.
- Считаем число обработанных заказов, текущий размер очереди и распределение времени ответа. Какие типы метрик брать?A)Counter, gauge и histogram соответственноB)Gauge, counter и summary соответственноC)Три counter: остальные типы нужны только для системных метрикD)Histogram для всех трёх: он покрывает и счётчики, и текущие значения
показать ответ и разбор
+A)Counter, gauge и histogram соответственно// разбор: Counter только растёт и обнуляется при рестарте — им считают события: запросы, ошибки, заказы. Gauge меняется в обе стороны и показывает мгновенное значение: длина очереди, число соединений, свободная память. Histogram раскладывает наблюдения по бакетам и позволяет считать квантили на сервере и агрегировать их между экземплярами — то, чего summary с его локальными квантилями не умеет.
- Нужна суммарная частота запросов по сервису. Почему пишут sum(rate(...)), а не rate(sum(...))?A)Rate считают до агрегации, иначе сброс портит суммуB)Sum не работает с диапазонными векторами по синтаксисуC)Порядок не важен, sum(rate) просто короче записываетсяD)Rate после агрегации даст значения в других единицах измерения
показать ответ и разбор
+A)Rate считают до агрегации, иначе сброс портит сумму// разбор: Rate умеет чинить обнуление, только пока видит каждый ряд отдельно. Если сначала сложить счётчики, то рестарт одного пода уронит сумму, и функция примет это за сброс или пропустит скачок — цифры поедут. Потому канон такой: rate по каждому ряду, затем sum by нужным лейблам. Тот же принцип действует для гистограмм: сначала rate по бакетам, потом суммирование и квантиль.
это 9 из 34
Ещё 25 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.
Частые вопросы
Что такое кардинальность и почему она важна?
Временной ряд задаётся именем метрики и полным набором лейблов. Значение с большим числом вариантов, например идентификатор пользователя, порождает ряд на каждого: хранилище распухает и падает по памяти. Уникальное место в логах и трассах, а не в лейблах.
По чему правильно будить дежурного?
По симптомам, которые чувствует пользователь: рост ошибок, задержка выше цели, быстрое сжигание бюджета ошибок. Загрузка процессора и памяти остаются на дашбордах и помогают в разборе, но сами по себе не означают, что сервису плохо.