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

Наблюдаемость

Error budget policy, latency SLO и составные journeys

Суть Подписанная error budget policy превращает сгоревшие алерты в организационное действие. Latency SLO требуют границ histogram-bucket на пороге. Составные journeys перемножают провалы SLO: 5 сервисов по 99.9% дают ~99.5% потолок journey.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 16 min

Каждый сервис в пути checkout показывает 99.9% доступности на своём дашборде. User-facing success rate checkout’а — 99.5%. Оба числа верны — команда мониторит не тот слой.

Error budget policy: больше чем правило

Error budget policy — это написанный, подписанный документ, задающий, что происходит при исчерпании бюджета. Без подписей — это рекомендация, которую давящие on-call-команды игнорируют в релизных авралах. С подписью director-уровня — это завет.

Обязательное содержание:

  • Триггер заморозки деплоев: «при достижении нуля — стопаем feature-деплои, кроме P0-фиксов и security-патчей»
  • Триггер postmortem: «если один инцидент сжигает >20% бюджета — postmortem обязателен»
  • Выход из заморозки: «фокус на работе по надёжности до восстановления бюджета выше 50%»
  • Путь эскалации: «если заморозка длится >2 недель — эскалация VP/CTO»

Out-of-scope exclusions (события, не сжигающие бюджет):

  • Load test и penetration test запросы (помечены header’ом или IP-диапазоном)
  • Известные боты и сканеры
  • Запросы во время запланированных maintenance window
  • Запросы, отброшенные rate-limit’ом на границе

Эти категории должны быть явно зафиксированы в документе policy и применяться как label-фильтры в SLO-платформе — иначе каждый postmortem превращается в спор о том, считать ли инцидент против бюджета.

Latency SLO: bucket’ы, а не квантили

Availability SLO тривиально — отношение счётчиков: 5xx_count / total_count. Latency SLO выражает «X% запросов под Y мс». Это звучит как percentile, но реализуется как счётчик:

latency_sli = http_request_duration_seconds_bucket{le="0.2"} / http_request_duration_seconds_count

Histogram bucket на пороге SLO даёт этот счётчик напрямую — histogram_quantile не нужен, и никакой погрешности оценки, загрязняющей бюджет. Именно поэтому RED-Duration histogram обязан иметь границу bucket’а ровно на пороге SLO: без неё SLO нельзя оценить без аппроксимации.

Multi-threshold latency SLO: «90% запросов под 100мс И 99% под 500мс» ловит tail-latency, прячущийся за одним percentile’ом. Сервис может пройти 99%-под-500мс, скрывая деградированный хвост, проваливающий 90%-под-100мс. Production-grade SLO-платформы поддерживают несколько порогов через отдельные SLI-отношения с worst-of-логикой.

Составные SLO: проблема умножения

Сервисов в цепочкеКаждый на 99.9%Потолок journey
1 сервис99.9%99.9%
2 сервиса99.9% каждый99.8%
5 сервисов99.9% каждый~99.5%
10 сервисов99.9% каждый~99.0%

Journey через API gateway → auth → inventory → payment → database означает, что запрос «хороший» только если все пять сервисов были хорошими. Каждый сервис независимо на 99.9% даёт потолок journey 0.999⁵ ≈ 99.5% — не 99.9%. При зависимых отказах (разделяемые зависимости, региональные инциденты) потолок ещё ниже, потому что отказы кластеризуются во времени.

Фикс: добавить journey-level SLI на API gateway — считать успешные завершения checkout / всего попыток checkout, не per-service 200-е коды. Per-service SLO становятся диагностическим контекстом; заголовок — journey SLO. Именно этот слой испытывают пользователи.

Найти доминирующего виновника: когда journey SLO красный, а per-service дашборды зелёные — вытаскиваем per-service failure rate’ы и ранжируем. Применяется Pareto: 80% journey-отказов обычно от 1–2 сервисов. Фиксируем их первыми — максимальный рычаг за инженерный час.

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

Скоррелированные отказы (например, разделяемая БД, шумный сосед, региональный сетевой инцидент) делают составной потолок хуже, чем предсказывает расчёт при независимости. Все пять сервисов могут отказывать одновременно из-за разделяемой зависимости. Именно поэтому journey-level SLI на API gateway — авторитетное измерение: оно захватывает скоррелированные отказы, которые per-service SLO по определению пропускают.

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

Упорядочи SLO-инструментальный конвейер от сырого сигнала до actionable-алерта:

  1. 1 Определи SLI (отношение good/total на уровне user journey, а не per-service)
  2. 2 Выбери SLO-цель (например 99.9% за 28 дней)
  3. 3 Инструментируй счётчики с границами bucket'ов ровно на пороге SLO
  4. 4 Рассчитай recording rules для ratio_rate на каждое окно (5м, 1ч, 30м, 6ч, 6ч, 3д)
  5. 5 Определи MWMBR-алерты (пейджи на 14.4x и 6x; тикет на 1x)
  6. 6 Напиши error budget policy (триггер заморозки, триггер postmortem, подписи)
  7. 7 Ежеквартально: пересматривай, соответствует ли SLO реальному пользовательскому опыту
Викторина

Checkout-journey проходит через 5 сервисов, каждый с 99.9% availability SLO. Каков теоретический потолок доступности journey (при независимых отказах)?

Викторина

Почему histogram для latency SLO обязан иметь границу bucket'а ровно на пороге SLO (например 200мс)?

Викторина

99.95% error budget команды достигает 5% остатка на 18-й день из 28. Что происходит дальше по policy?

Вспомните перед уходом
  1. 01
    Что должна содержать error budget policy и почему важны подписи?
  2. 02
    Checkout-запрос проходит через 5 сервисов. Per-service дашборды показывают 99.9%. User-facing success rate — 99.5%. В чём диагноз и фикс?
Итог

Error budget policy — подписанный документ, определяющий, что происходит при исчерпании бюджета: деплои фич стопаются, работа по надёжности в приоритете, postmortems обязательны при крупных сгораниях. Подписи — то, что даёт ей вес: без director-уровня подписанта on-call команды получают давление её игнорировать. Latency SLO реализуются как отношения histogram bucket’ов — не оценки percentile’ов — histogram должен иметь границу bucket’а ровно на пороге SLO. Составные journeys через N сервисов перемножаются: 5 сервисов по 99.9% дают ~99.5% потолок journey, а не 99.9%. Фикс — journey-level SLI на API gateway и ранжирование per-service failure rate’ов для нахождения доминирующего виновника.

Связанные уроки
встречается в268
Продолжить восхождение ↑SLO-платформы и 90-дневный rollout
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.