Наблюдаемость и мониторинг
Метрики, логи, трейсы, алертинг, дашборды и диагностика деградировавшего хоста или сервиса.
11 вопросов
JuniorТеорияОчень частоКакова цель системы мониторинга и какие распространённые инструменты вы знаете?
Какова цель системы мониторинга и какие распространённые инструменты вы знаете?
Система мониторинга непрерывно собирает сигналы о хостах и сервисах, хранит их во времени, визуализирует и поднимает алерты, когда что-то пересекает порог. Её цель — рано обнаруживать сбои и деградацию и давать данные для их диагностики. Распространённые инструменты — Prometheus, Zabbix, Grafana и стек ELK.
Типичные ошибки
- ✗Сводить мониторинг к одному живому снимку, а не к истории временных рядов
- ✗Путать мониторинг с развёртыванием или надзором за процессами
- ✗Забывать, что алертинг по порогам — ключевая функция, а не опция
Уточняющие вопросы
- →В чём разница между push- и pull-моделями сбора метрик?
- →Почему хранение метрик как временных рядов важно для выявления деградации?
MiddleТеорияОчень частоЧем различаются метрики, логи и трейсы как три столпа наблюдаемости?
Чем различаются метрики, логи и трейсы как три столпа наблюдаемости?
Метрики — это числовые временные ряды: дешёвые агрегаты вроде частоты запросов или CPU, показывающие состояние и тренды сервиса. Логи — это дискретные события с меткой времени и деталями, помогающие понять, что случилось вокруг ошибки. Трейсы прослеживают один запрос через сервисы, вскрывая задержки для поиска узких мест. «Здоров ли?» — метрики, «что случилось?» — логи, «где тормозит?» — трейсы.
Типичные ошибки
- ✗Считать все три взаимозаменяемыми, а не отвечающими на разные вопросы
- ✗Пытаться отладить путь одного запроса по одним лишь агрегатным метрикам
- ✗Думать, что логи масштабируются на высокую кардинальность так же дёшево, как метрики
Уточняющие вопросы
- →Почему метки высокой кардинальности дороги в системе метрик вроде Prometheus?
- →Как трейс передаёт свой контекст через границы сервисов?
JuniorТеорияЧастоТипы метрик Prometheus — counter, gauge, histogram, summary — когда применять каждый?
Типы метрик Prometheus — counter, gauge, histogram, summary — когда применять каждый?
Counter только растёт — запросы или ошибки — и его читают через rate(). Gauge меняется в обе стороны, как память или длина очереди. Histogram раскладывает наблюдения по бакетам, из которых выводят перцентили задержки; summary считает их на стороне клиента. Для задержки берите histogram — среднее прячет хвост.
Типичные ошибки
- ✗Считать среднее задержки вместо перцентиля из histogram
- ✗Думать, что counter может убывать, а gauge — только расти
- ✗Полагать, что summary можно переагрегировать между инстансами, как histogram
Уточняющие вопросы
- →Почему бакеты histogram можно переагрегировать между инстансами, а квантили summary — нет?
- →Чем histogram удобнее для SLO (service-level objective) по задержке?
MiddleТеорияЧастоtop показывает load average 50 20 10 — что это значит и плохо ли это?
top показывает load average 50 20 10 — что это значит и плохо ли это?
Load average — это среднее число процессов, готовых к выполнению или в непрерываемом ожидании, за последние 1, 5 и 15 минут. Здесь 50/20/10 значит, что нагрузка быстро растёт — недавняя сильно превышает старое окно. Плохо ли это, зависит от числа ядер: нагрузка около числа ядер нормальна, а намного выше значит, что задачи стоят в очереди за CPU, диском или I/O.
Типичные ошибки
- ✗Читать load average как процент CPU, а не как длину очереди
- ✗Оценивать значение, не разделив на число ядер
- ✗Забывать, что непрерываемые ожидания I/O тоже поднимают нагрузку
Уточняющие вопросы
- →Почему load average может быть высоким при низкой утилизации CPU?
- →Как чтение по трём окнам 1/5/15 помогает отличить всплеск от тренда?
MiddleКодЧастоДопишите PromQL-запросы для частоты ошибок 5xx в секунду и 95-го перцентиля задержки.
Допишите PromQL-запросы для частоты ошибок 5xx в секунду и 95-го перцентиля задержки.
Частота ошибок — это rate() по счётчику http_requests_total, отфильтрованному по 5xx и за 5m. Для p95 берут histogram_quantile(0.95, ...) по rate от серий _bucket, но сперва нужен sum by (le). Задержку не усредняют, и перцентили нельзя усреднять между инстансами — сначала агрегируют бакеты, затем берут квантиль.
Типичные ошибки
- ✗Усреднять задержку или перцентиль каждого инстанса вместо агрегации бакетов
- ✗Подавать в histogram_quantile итог счётчика, а не rate от серий _bucket
- ✗Забыть
sum by (le), из-за чего бакеты многих инстансов не складываются
Уточняющие вопросы
- →Почему перед
histogram_quantileнуженsum by (le)при опросе многих инстансов? - →Почему среднее двух p95-значений инстансов — это не p95 по всему флоту?
MiddleТеорияЧастоСбор метрик pull против push в Prometheus — когда нужен Pushgateway и как срабатывают правила алертинга?
Сбор метрик pull против push в Prometheus — когда нужен Pushgateway и как срабатывают правила алертинга?
Prometheus работает по pull: он опрашивает цели с интервалом через service discovery, поэтому пропавший scrape уже сигнал недоступности. Batch-задачи, слишком короткие для опроса, пушат в Pushgateway, который Prometheus скрейпит. Правила алертинга пересчитывают PromQL каждый интервал и срабатывают в окне for — алертите на симптомы, не на причины.
Типичные ошибки
- ✗Думать, что Prometheus пушит; он скрейпит, а пропавший scrape — это сигнал
- ✗Слать в Pushgateway долгоживущие сервисы вместо только batch-задач
- ✗Алертить на каждую причину, погребая дежурного под усталостью от алертов
Уточняющие вопросы
- →Почему pull-модель упрощает обнаружение того, что цель недоступна?
- →Почему Pushgateway рискует устаревшими метриками, если batch-задача перестала пушить?
SeniorДебаггингЧастоПользователи жалуются, что хост тормозит — найдите узкое место по метрикам
Пользователи жалуются, что хост тормозит — найдите узкое место по метрикам
Load average 38 на 4 ядрах далеко за пределом, но CPU почти простаивает, а 86,5% — это wa (ожидание I/O), и память в норме — значит хост упирается в диск, а не в CPU. Узкое место — дисковый I/O: процессы заблокированы в ожидании хранилища. Подтвердите через iotop или iostat -x, найдя занятое устройство и виновный процесс.
Типичные ошибки
- ✗Читать высокий load average как насыщение CPU, игнорируя колонку wa
- ✗Принимать ожидание I/O (wa) за простой CPU, а не за время блокировки на диске
- ✗Останавливаться на симптоме, не назвав команду для поиска занятого устройства
Уточняющие вопросы
- →Как колонки
iostat -xвроде%utilиawaitподтвердят дисковое узкое место? - →Если бы ожидание было на сети, какие инструменты вы бы взяли?
MiddleТеорияИногдаЧто такое система управления конфигурацией вроде Ansible и почему она идемпотентна?
Что такое система управления конфигурацией вроде Ansible и почему она идемпотентна?
Система управления конфигурацией вроде Ansible или Puppet описывает желаемое состояние множества хостов как код и приводит каждый хост к нему — пакеты, файлы, службы. Инструмент вносит лишь нужные изменения. Она идемпотентна: повторный запуск того же playbook на уже корректном хосте ничего не меняет, поэтому запуски безопасно повторять, и они сходятся к заданному состоянию.
Типичные ошибки
- ✗Думать, что каждый запуск всё переустанавливает, а не сходится к желаемому состоянию
- ✗Путать управление конфигурацией с разовым развёртыванием или сборкой
- ✗Считать, что идемпотентность означает запуск лишь раз на хост
Уточняющие вопросы
- →Чем безагентная push-модель Ansible отличается от agent-pull модели Puppet?
- →Почему идемпотентность делает запуски управления конфигурацией безопасными для расписания?
SeniorДизайнИногдаНужно раскатать агент мониторинга (например, Zabbix) со стандартным набором параметров примерно на 1000 Linux-хостов. Опишите, как развернуть его в таком масштабе, как удержать конфигурацию единой и какие практические проблемы вы ожидаете — сетевые доступы, разнородность хостов, слабое железо и регистрацию новых агентов.
Нужно раскатать агент мониторинга (например, Zabbix) со стандартным набором параметров примерно на 1000 Linux-хостов. Опишите, как развернуть его в таком масштабе, как удержать конфигурацию единой и какие практические проблемы вы ожидаете — сетевые доступы, разнородность хостов, слабое железо и регистрацию новых агентов.
Не делать это вручную. Используйте управление конфигурацией (Ansible, Puppet или Salt), чтобы идемпотентно установить пакет, разложить шаблонный конфиг и включить службу на всех хостах — единый повторяемый источник правды. Гоните пачками, чтобы не перегрузить сервер мониторинга, и применяйте авторегистрацию за allow-list, регистрируя только ожидаемые хосты. Ожидайте: отсутствие сетевых доступов, разнородность ОС/версий, слабые хосты и раздачу учёток.
Типичные ошибки
- ✗Раскатывать вручную вместо идемпотентного управления конфигурацией
- ✗Регистрировать все агенты разом и перегружать сервер мониторинга
- ✗Считать все хосты доступными и одинаковыми (дыры в файрволе/версиях)
Уточняющие вопросы
- →Как идемпотентность позволяет безопасно перезапустить раскатку после частичного сбоя?
- →Чем помогает авторегистрация и какой риск она вносит?
SeniorПроизводительностьИногдаp99-задержка растёт при ровном CPU — найдите узкое место методами RED и USE.
p99-задержка растёт при ровном CPU — найдите узкое место методами RED и USE.
Ровный CPU значит, что хост не узкое место. Примените RED — rate, errors, duration — по маршрутам: рост duration с редкими ошибками указывает на медленную зависимость, а не на процессор. USE — utilization, saturation, errors — остаётся низким, исключая CPU и память. Читайте p99 из гистограммы, а не среднее, которое прячет хвост.
Типичные ошибки
- ✗Смотреть среднюю задержку, скрывающую плохой хвост p99
- ✗Резать задержку по метке высокой кардинальности вроде user_id, взрывая TSDB (time-series database)
- ✗Считать, что ровный CPU исключает проблему, игнорируя медленную зависимость
Уточняющие вопросы
- →Почему усреднять p99 каждого инстанса ради кластерного p99 статистически неверно?
- →Почему метка user_id для разбивки задержки взрывает time-series database Prometheus?
SeniorТеорияИногдаКак собрать стек наблюдаемости для платформы Kubernetes — сбор, хранение, дашборды, алерты?
Как собрать стек наблюдаемости для платформы Kubernetes — сбор, хранение, дашборды, алерты?
Скрейпьте через Prometheus с service discovery, чтобы новые Pod находились; храните в Thanos или Mimir; визуализируйте в Grafana; алертите через Alertmanager по прогоранию SLO (service-level objective), не по ошибкам. Добавьте логи (Loki) и трейсы (Tempo), связанные correlation id, чтобы дашборд показывал, приложение виновато или зависимость.
Типичные ошибки
- ✗Алертить на сырые ошибки или CPU вместо прогорания пользовательского SLO
- ✗Держать метрики, логи и трейсы несвязанными, теряя переходы между ними
- ✗Игнорировать долгое хранение и кардинальность меток, плавя TSDB (time-series database)
Уточняющие вопросы
- →Как correlation id позволяет перейти от медленного трейса к его логам?
- →Почему метрики хранят долгосрочно отдельно, а не в одном Prometheus?