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

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

Multi-window multi-burn-rate-алертинг: почему AND лучше OR

Суть Одно-оконные SLO-алерты либо шумные (короткое окно), либо медленно гасятся (длинное). Паттерн MWMBR — AND между длинным и коротким окнами — даёт и быструю детекцию, и быстрый сброс.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 15 min

On-call-команда использует один алерт: «фаер если error rate за последний час выше 1.44%.» Пейджер срабатывает в 2 ночи. Инженер логинится. Проблема ушла сама 55 минут назад — но часовое окно всё ещё содержит плохие данные. Инженер не спит зря.

Почему наивные SLO-алерты ломаются двумя способами

SRE Workbook классифицирует шесть подходов к SLO-алертингу. Пять ломаются предсказуемо.

Approach 1 (сырой error rate > SLO-порог): срабатывает сотни раз в день на мелких всплесках. Один плохой батч запросов — пейдж; команды учатся игнорировать пейджер — классическая спираль alert fatigue.

Approach 5 (одно-оконный burn-rate-порог, например 14.4x за 1ч): лучше — ловит реальные outage’и — но сброс медленный. После устранения инцидента часовое окно ещё час содержит 55 минут плохих данных. Инженеры не могут понять, помог ли их фикс.

Approach 6 (MWMBR) — единственный, балансирующий задержку детекции, устойчивость к шуму и задержку восстановления. Production-default в Google, Datadog, Grafana, Splunk, Honeycomb, Sloth, Pyrra.

Двухоконный трюк

Ключевая идея: комбинировать длинное окно (устойчивость к шуму) AND короткое окно (разрешение восстановления):

  • Длинное окно (например 1ч): подтверждает, что горение устойчивое, а не транзиентный спайк
  • Короткое окно (например 5м): подтверждает, что горение всё ещё происходит прямо сейчас

Логика AND:

  • Только длинное окно высокое: инцидент, вероятно, завершился; короткое очистилось
  • Только короткое окно высокое: короткий спайк, ещё не накопившийся в устойчивое горение
  • Оба высокие: реальный outage, и серьёзный, и живой — пейджить

Когда инцидент устраняется, короткое окно очищается в течение 5 минут. Алерт гаснет в течение 5 минут, а не 55. Задержка детекции и время сброса оба ограничены.

Каноническая MWMBR-конфигурация (99.9% SLO)

SeverityДлинное окноКороткое окноBurn rateБюджет при устойчивом горении
Page>14.4x2% за 1ч — быстрый outage, срочно
Page30м>6x5% за 6ч — умеренное устойчивое горение
Ticket>1x10% за 3д — медленное горение, требует внимания
Канонические числа MWMBR на 99.9% SLO
14.4x burn rate = error rate
1.44% (при 99.9% SLO)
14.4x за 1ч = потрачено бюджета
~2% от 28-дневного бюджета
6x за 6ч = потрачено бюджета
~5% от 28-дневного бюджета
1x за 3д = потрачено бюджета
~10% от 28-дневного бюджета
Время сброса алерта (5м короткое окно)
<5 минут после фикса
Время сброса алерта (одиночное 1ч окно)
до 55 минут после фикса

Реализация на Prometheus

# Recording rule: fast-request ratio за 1ч
record: job:slo_latency_fast:ratio_rate1h
expr: |
  sum(rate(http_request_duration_seconds_bucket{le="0.2"}[1h]))
  /
  sum(rate(http_request_duration_seconds_count[1h]))

# Page-алерт: 1ч И 5м оба выше 14.4x burn
alert: SLOLatencyBurnFast
expr: |
  (
    (1 - job:slo_latency_fast:ratio_rate1h) > (14.4 * 0.001)
    and
    (1 - job:slo_latency_fast:ratio_rate5m) > (14.4 * 0.001)
  )
labels:
  severity: page
annotations:
  summary: "Latency SLO горит с >14.4x за 1ч И 5м"

14.4 * 0.001 — это burn_rate × (1 − SLO) = 14.4 × 0.001 = 0.0144 — порог error rate, соответствующий 14.4x burn на 99.9% SLO.

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

Пороги 14.4, 6 и 1 — не произвольные. Они получаются решением: «какой burn rate потратит X% бюджета за окно W?» При 30-дневном периоде: 2% за 1ч — burn = (0.02 × 720ч) / 1ч = 14.4. 5% за 6ч — burn = (0.05 × 720ч) / 6ч = 6. 10% за 3 дня (72ч) — burn = (0.10 × 720ч) / 72ч = 1. Эти пороги выводятся из первых принципов, а не эмпирической настройки — любая команда может пересчитать их для другой длины SLO-окна.

Заполни page-алерт 6ч+30м для того же 99.9% SLO

1/3
Викторина

Одно-оконный алерт срабатывает на 14.4x burn за 1 час. Инцидент устранён в 12:00. Когда алерт гаснет?

Викторина

MWMBR-алерт срабатывает когда 1ч burn выше 14.4x И 5м burn выше 14.4x. 1ч burn — 15x, 5м burn — 12x (чуть ниже порога). Сработает ли алерт?

Вспомните перед уходом
  1. 01
    Назови два способа, которыми ломается одно-оконный SLO-алертинг.
  2. 02
    Почему MWMBR использует AND между окнами, а не OR?
  3. 03
    Выведи burn-rate-порог 14.4x для page-алерта 1ч+5м на 99.9% SLO с 30-дневным окном.
Итог

Наивные SLO-алерты ломаются одним из двух способов: короткие окна шумные и срабатывают на каждом транзиентном спайке, длинные окна медленно сбрасываются и держат on-call проснувшимся после устранения инцидента. Multi-window multi-burn-rate-алертинг решает оба, комбинируя длинное окно (устойчивость к шуму) с коротким (разрешение восстановления) через AND-логику: страница срабатывает только когда горение и устойчивое, и происходит прямо сейчас. Канонические пороги — 14.4x/6x/1x на 1ч/6ч/3д — выводятся из «какой burn потребляет 2%/5%/10% бюджета за каждое окно?» При 99.9% SLO 14.4x означает 1.44% error rate; 5-минутное короткое окно гасит алерт в течение 5 минут после фикса. Самостоятельно писать MWMBR PromQL на каждый сервис ненадёжно; используй Sloth или Pyrra для декларативной генерации.

Связанные уроки
встречается в167
Продолжить восхождение ↑Error budget policy, latency SLO и составные journeys
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.