Финальная практика модуля: трёхактный детектив. Воспроизводим три типовые аварии и находим их по трейсам, применяя приёмы уроков 4.1–4.3.
Подготовка: намеренно больной сервис
Добавьте в свой сервис endpoint /checkout со скрытыми «дефектами» (переключатели
через env):
BUG_N1=1: цикл из 10 SQL-запросов (N+1);BUG_LOCK=1: удержание локальной блокировки 800 мс в критической секции (пустой промежуток в корневом спане);BUG_EXT=1: внешний HTTP-вызов с таймаутом 2с и тремя ретраями.
Акт 1. «p99 вырос, никто ничего не деплоил»
- Включите
BUG_N1=1и запустите нагрузку; - Поиск: Service + Min Duration 1s;
- В waterfall найдите паттерн «10 одинаковых последовательных SELECT»;
- Вывод, который должен сформулироваться сам: батч/JOIN вместо цикла.
Акт 2. «Все процессы живы, а запросы висят»
- Выключите N1, включите
BUG_LOCK=1; - Поиск по длительности; трейс показывает промежуток без детей в корне — сервис «жил своей жизнью»;
- Атрибуты корневого спана/события подскажут, на какой секции;
- Урок кейса: трейс видит не только внешние вызовы — «пустые промежутки» это тоже диагноз.
Акт 3. «Внешний партнёр тормозит»
- Включите
BUG_EXT=1, найдите трейсы с хвостовыми длинными спанами HTTP; - Обратите внимание: 3 ретрая = 3 клиентских спана + общий таймаут; сравните два трейса (удачный и ретрайный) — разница сегментов очевидна;
- Включите critical path: почти всё время — внешний вызов. Решение: кеш, circuit breaker, асинхронное подтверждение.
Разбор вслепую (главное упражнение)
Попросите коллегу (или случайный генератор) включить один из трёх BUG-флагов без вашего ведома. Ваша задача — методом поиска и чтения waterfall назвать дефект за ≤ 5 минут и оформить мини-отчёт:
- Запрос поиска в UI;
- Скриншот/описание найденного трейса;
- Гипотеза причины + предлагаемые изменения кода.
Эталонные цифры
Что вы должны были увидеть (развернуть после выполнения)
Акт 1: ~10 спанов SQL по 5–15 мс последовательно, общий прирост 100–150 мс. Акт 2: корневой спан 800+ мс, внутри детей почти нет, затем короткая работа. Акт 3: серия HTTP-спанов по ~2с с ошибками таймаута между ними; корневой спан ~6с.
Чек-лист готовности модуля
☑ Составляю поиск: сервис/операция/теги/длительность + Trace ID из лога.
☑ Читаю waterfall: вижу N+1, ожидания, параллелизм, «пустые промежутки».
☑ Использую critical path для приоритизации оптимизаций.
☑ Сравниваю трейсы «до/после» и нахожу появившиеся сегменты.
☑ Довожу расследование до конкретного изменения кода.