В цепочке из пяти сервисов у пользователей выросло время ответа. Как вы будете искать причину и что для этого должно быть построено заранее?
- Как искать причину роста задержки в микросервисах?
- Зачем нужна распределённая трассировка?
Метрики показывают, где и когда выросло; трейсы — в каком шаге ушло время; логи по trace_id — почему. Работает, только если корреляция построена заранее.
- По метрикам: какой сервис, с какого момента, перцентили, насыщение (очереди, пулы)
- По трейсам медленных запросов: какой спан длинный — свой код, база, внешний вызов, ожидание пула
- По логам этого trace_id: ошибки, повторы, медленный запрос
А ещё Заранее: сквозной traceparent (W3C), OpenTelemetry, структурированные логи, tail-based семплирование
Подробно
1. Локализовать по метрикам. Смотрим p95/p99 по каждому сервису и эндпоинту: где выросло и с какого времени. Сопоставляем с событиями — выкатка, всплеск трафика, изменение конфигурации. Смотрим насыщение: длину очередей, занятость пулов соединений и потоков, паузы GC — они выдают причину раньше утилизации CPU.
2. Найти шаг по трейсам. Берём трейсы медленных запросов: видно, какой спан занял время — запрос в базу, внешний вызов, ожидание соединения из пула, повторы. Важно сравнить с трейсами нормальных запросов.
3. Объяснить по логам. По trace_id находим структурированные логи всех сервисов этого запроса: ошибки, таймауты, план медленного запроса.
Что должно быть построено заранее:
- сквозной идентификатор трассы через все сервисы и брокеры — заголовок
traceparent(W3C Trace Context), автоматическая инструментация OpenTelemetry; - структурированные логи (JSON) с trace_id и span_id;
- метрики в виде гистограмм с разрезом по версии и экземпляру;
- tail-based семплирование — решение о сохранении трейса после его завершения: медленные и ошибочные сохраняются всегда. При head-based (решение в начале, например 1%) редкие медленные запросы до вас не доедут;
- связь метрик с трейсами (exemplars).
Что хотят услышать
- Последовательность: метрики → трейсы → логи.
- Насыщение как ранний признак.
- Что нужно заранее: сквозная корреляция, OpenTelemetry, структурированные логи.
- Tail-based семплирование — плюс.
Частые ошибки
- Начинать с чтения логов всех сервисов подряд.
- Не иметь сквозного идентификатора и пытаться сопоставлять по времени.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Читать логи всех пяти сервисов по времени
- ✗Сразу добавить инстансы в каждый сервис цепочки
- ✓Метрики — где и когда, трейсы — какой шаг, логи по trace_id — почему; корреляция заранее
- ✗Профилировать по очереди каждый сервис под нагрузочным тестом, пока не найдётся самый медленный метод
Что спросят дальше
- Почему хвост усиливается при параллельных вызовах?
- Что бы вы измеряли, чтобы предсказать эту проблему заранее?
Разбор темы
- Наблюдаемость: метрики, логи, трассировка и SLO
Чем наблюдаемость отличается от мониторинга, три сигнала и что каждый умеет, RED и USE, почему среднее врёт, взрыв кардинальности, SLI/SLO/error budget и алерты на симптомы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.