Открыть трейс — полдела; извлечь из него диагноз — навык. Разбираем оба представления и типовые паттерны, которые видны в них мгновенно.
Waterfall (Gantt)
Вид по умолчанию: горизонтальная шкала времени, каждый спан — полоса от старта до конца. Что читать:
- Глубина вложенности = дерево вызовов; ширина = длительность;
- «Пустые места» между полосами — время, когда ваш сервис ничего не делал, а просто ждал: сеть, очередь, чужую систему;
- Наложение полос на одном уровне — параллельные вызовы (fan-out);
- Красные полосы — спаны со статусом ERROR;
- Клик по спану — атрибуты, события, ссылки; это «открыть дело» конкретного шага.
Типовые паттерны waterfall
| Картина | Диагноз |
|---|---|
| Один глубокий спан ≈ 80% трейса | узкое место — тот вызов: БД, чужой API |
| Серия одинаковых последовательных спанов (10 × SELECT) | N+1 запрос — классика; нужен батч/join |
| Промежуток в корневом спане, не занятый детьми | локальная работа: сериализация, вычисления, GC-пауза, лок |
| Много параллельных узких полос | fan-out работает; проверьте общий бюджет |
| Хвостовой тонкий спан в конце трейса | часто что-то «на выходе»: запись аудита, метрика, очистка |
Flame graph
Переключение вида показывает свернутое дерево: ширина сегмента — доля времени, глубина — стек вызовов. Полезен, когда waterfall слишком длинный (сотни спанов):
- сразу видно, какой «поддерево» съедает время;
- одинаковые повторяющиеся ветки (N+1) сливаются в заметный блок;
- отлично для докладов/скриншотов: «вот 60% запроса уходит сюда».
💡 Совет: waterfall — для понимания последовательности и ожиданий, flame graph — для пропорций. Для инцидента откройте оба: первый отвечает «что после чего», второй — «что главное».
Время и масштаб
- Проверяйте общую длительность трейса (в шапке) — сверяйте с метрикой endpoint'а: расхождение говорит о выборке не того запроса;
- Смотрите на start-time детей: вызовы, начавшиеся сильно позже родителя, намекают на очередь внутри приложения;
- Спаны с нулевой длительностью — события-маркеры (например, публикация в шину): не тратят время, но фиксируют момент.
Практика
- Создайте в тестовом сервисе N+1: цикл из 10 запросов к БД вместо одного батча — найдите паттерн «10 одинаковых спанов» в waterfall и во flame graph.
- Добавьте
time.sleep(0.5)вне любого дочернего вызова — найдите «пустой промежуток» в корневом спане. - Сделайте параллельный fan-out (2-3 конкурентных запроса) — сравните общее время трейса с последовательным вариантом.
- Откройте самый длинный трейс вашего реального приложения и опишите письменно: где критичный путь, что бы вы оптимизировали первым.
Мини-квиз
1. 12 одинаковых последовательных SELECT в трейсе — что это почти наверняка? — N+1: цикл запросов; лечится батчем.
2. Когда flame graph полезнее waterfall? — При сотнях спанов и вопросе «какое поддерево доминирует».
3. Промежуток в родителе без детей — что это? — Время работы самого сервиса: сериализация, вычисления, блокировки.