awesome-everything EN
↑ Обратно к восхождению

Производительность

Observability-стек и CI gates: ловить регрессии до выпуска

Суть Пять интегрированных потоков данных — метрики, логи, трейсы, профили, RUM — плюс pre-merge CI gates, которые ловят регрессии до достижения пользователей. Самое дешёвое исправление — то, которое не выходит в production.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Дежурный инженер получает алерт о SLO burn p99 в 2 часа ночи. У неё есть непрерывное профилирование, распределённые трейсы и RUM. Она находит первопричину за 4 минуты. Её коллега в другой компании получает тот же алерт, но имеет только серверные логи. Она всё ещё разбирается в 6 утра. Разница не в инциденте — в стеке observability, который у неё был до инцидента.

Пять production-сигналов

Production-grade работа с производительностью требует пяти интегрированных потоков данных. Каждый отвечает на разный вопрос; вместе они дают полную картину.

СигналПримеры инструментовВопрос, на который отвечаетОбновление / хранение
МетрикиPrometheus + GrafanaЗдоров ли сервис? p50/p99 latency, RPS, error rate15–60 с / 13 месяцев
ЛогиLoki / ELK / Datadog LogsЧто произошло для этого запроса?По запросу / 7–90 дней
ТрейсыTempo / Jaeger / HoneycombКакой span владеет задержкой?На запрос / 7–30 дней
ПрофилиPyroscope / Parca / Polar SignalsКакая функция съела CPU / аллокации?Непрерывно / 7–30 дней
RUMSentry / Datadog RUM / Vercel Speed InsightsЧто испытали реальные пользователи? Core Web VitalsНа сессию / 30–90 дней

Связь сигналов: единый дашборд

Мощь не в каждом сигнале по отдельности — в связях между ними. Алерт SLO burn ведёт к RED-дашборду. RED-дашборд ведёт к трейс-вью, отфильтрованному по burn-окну. Трейс ведёт к профилю, отфильтрованному по trace-id. Профиль ведёт к исходному коду.

Хорошо инструментированный сервис позволяет пройти эту цепочку менее чем за пять минут:

  1. Алерт SLO (Prometheus → alertmanager).
  2. Открыть RED-дашборд: что изменилось — p99, error-rate или RPS?
  3. Перейти к трейсам, отфильтрованным по последним 10 минутам: какой span медленный?
  4. Нажать “профилировать этот трейс” в Pyroscope: какая функция горячая?
  5. Нажать “git blame” на функцию: какой коммит и деплой?

Без связей (кросс-сигнальный join по trace-id) каждый шаг требует ручной корреляции — копировать timestamp, искать в другом инструменте, угадывать окно деплоя. Медианный MTTR без связи сигналов — 30–90 минут; с ней — 3–10 минут.

OpenTelemetry стандартизирует wire-формат (OTLP) и SDK по всем пяти сигналам. Команды, инструментирующие через OTel, могут менять бэкенды без повторной инструментации. Сигнал профиля (стандартизирован в OTel 2024–2026) присоединяется к метрикам, логам и трейсам в одном Collector-пайплайне.

Pre-merge CI gates: ловить до выпуска

Самое дешёвое исправление — то, которое никогда не попадает в production. Четыре gate запускаются на каждом PR, занимают 1–5 минут и ловят 90%+ потенциальных регрессий:

Bundle-size gate — не пропускает PR, если JS-бандл любого маршрута превышает per-route бюджет. Установить бюджет на post-fix уровне после оптимизации бандла; любой PR, выходящий за него, требует явного согласования. Инструменты: bundlewatch, Lighthouse CI, Next.js bundle analyzer в CI.

Query-count gate — не пропускает PR, если любой endpoint вводит N+1-запросы. Реализация: middleware в тест-сьюте, считающий DB-запросы на запрос и проверяющий, что счётчик ниже порога. Ловит самый частый класс backend-регрессий до слияния.

Allocation-rate diff — не пропускает PR, если allocation rate в бенчмарке критического пути регрессирует выше порога. Бенчмарк-хarnest (go test -bench, criterion для Rust, JMH для Java) запускается на горячем пути и проверяет, что alloc/op в пределах бюджета.

Load-test diff — запускает краткий load-сценарий против PR и не пропускает, если p99 на критическом пути регрессирует выше X%. Тяжелее остальных (5–15 минут), но ловит архитектурные регрессии, которые microbenchmarks пропускают.

Почему это работает

Ментальная модель gate: каждый gate кодирует урок из одного прошлого инцидента. Bundle gate = урок из момента, когда сторонний скрипт раздул LCP до 4 с. Query gate = урок из N+1, который перевёл /orders с 30 мс до 1,5 с. Allocation gate = урок из аллокации логгера, давшей спайк GC. Каждый ретроспективный разбор инцидента должен завершаться вопросом “какой gate это бы поймал?” — и добавлением этого gate. Набор gate никогда не бывает завершён; он растёт вместе с историей отказов системы.

Числа по observability-инвестициям
MTTR с полным стеком и связью сигналов
3–10 минут
MTTR без непрерывного профилирования
30–90 минут
Процент ловли регрессий pre-merge gates (известные классы)
90%+
Стоимость Pyroscope OSS (self-hosted) в месяц
~$500
Стоимость Sentry RUM в год (небольшая команда)
~$30k
Инженерное время на performance firefighting без дисциплины
20–40%
Инженерное время с дисциплиной (стабильное состояние)
5–10%
Викторина

Команда имеет CI gates для бандла, query count и allocation rate. Они всё равно получают production p99 регрессию раз в квартал. Наиболее вероятный пробел?

Викторина

Почему trace-id является ключевым ключом объединения между сигналами в unified observability-стеке?

Расставь шаги по порядку

Упорядочите пять production-сигналов от самого широкого (вид всего сервиса) до самого узкого (одна функция в одном запросе):

  1. 1 Метрики — p99 latency, RPS, error rate по всем запросам
  2. 2 RUM — Core Web Vitals с реальных устройств пользователей по маршруту
  3. 3 Трейсы — per-request waterfall, показывающий какой span медленный
  4. 4 Логи — структурированная детализация событий для конкретного запроса
  5. 5 Профили — какая функция внутри span потребила CPU или аллокации
Вспомните перед уходом
  1. 01
    Какова роль trace-id в связи пяти observability-сигналов?
  2. 02
    Назовите четыре типа CI gate, что каждый ловит и как реализован.
  3. 03
    Почему CI gates и observability дополняют друг друга, а не заменяют?
Итог

Production-grade работа с производительностью работает на пяти интегрированных потоках данных: метрики (агрегированное здоровье), логи (per-request события), трейсы (per-request waterfall span), профили (per-function CPU и аллокации) и RUM (реальные Core Web Vitals пользователей). Trace-id — ключ объединения, связывающий их: SLO алерт ведёт к трейсу, трейс ведёт к профилю, профиль называет функцию. С полным стеком и связью сигналов MTTR падает с 30–90 минут до 3–10. До выпуска четыре CI gates ловят 90% регрессий: bundle-size, query-count, allocation-rate diff и load-test diff. Каждый gate кодирует урок из прошлого инцидента. Набор gate никогда не завершён — он растёт после каждой production-регрессии через ретроспективные разборы, отвечающие на вопрос “какой gate это бы поймал?”

Связанные уроки
встречается в260
Продолжить восхождение ↑От инцидента к enforcement: SLO burn до верифицированного исправления за 35 минут
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.