intDataBlog
← ЖурналМаршруты обучения ↗

SLO и бюджет ошибок: договориться, что значит надёжный сервис

Пользовательский сценарий, измеримый результат и расчёт допустимых ошибок без магического обещания ста процентов.

У сервера uptime почти сто процентов, но пользователи не могут отправить форму. Процесс работает, балансировщик отвечает, графики CPU спокойны. Надёжность инфраструктуры и возможность закончить нужное действие оказались разными вещами.

SLO задаёт целевой уровень надёжности сервиса, а SLI — способ его измерить. В Google SRE эти понятия связывают с приоритизацией инженерной работы и бюджетом допустимых ошибок. Полезность начинается с согласованного определения результата, а не с красивого процента. Google SRE Workbook

Выбрать действие и границы

Возьмём учебный сервис записи на консультацию. Возможные действия пользователя — открыть расписание, создать запись и получить подтверждение. Для первого важны доступность и время ответа, для второго — сохранённая запись, для третьего — завершение фоновой доставки.

Если измерять только HTTP-ответ API, можно пропустить ситуацию «200 получен, запись не создана». Поэтому описание SLI должно отвечать на три вопроса: какие события считаем, как отличаем хороший результат и откуда узнаём об этом результате. Порог задержки и окно измерения тоже входят в определение.

Ошибки пользователя требуют явного правила. Неверно введённая дата и невозможность заполнить корректную форму из-за дефекта сервиса не должны автоматически попадать в одну корзину. Иначе показатель удастся улучшить переименованием ошибок, а не исправлением продукта.

Посчитать бюджет на понятном примере

Допустим, за выбранное учебное окно произошло 100 000 допустимых попыток записи. Цель — 99,9% успешных операций. Тогда бюджет составляет 100 неуспешных попыток. Если их 120, выбранная цель не выполнена: успешность равна 99,88%.

from fractions import Fraction

total = 100_000
failed = 120
target = Fraction(999, 1000)
budget = total * (1 - target)
actual = Fraction(total - failed, total)
assert budget == 100
assert actual == Fraction(9988, 10000)
assert actual < target

Это арифметика вымышленного сценария, не рекомендуемая цель для любого сервиса. Отдельный малопосещаемый критичный маршрут может требовать собственного наблюдения: общий процент по миллиону дешёвых запросов легко скроет десяток неудачных важных операций.

Что делать с исчерпанным бюджетом

До возникновения инцидента полезно согласовать действия: при каком ухудшении команда меняет приоритеты, кто принимает решение и какие работы всё равно обязательны. Пример политики в SRE Workbook показывает бюджет ошибок как механизм согласования скорости изменений и надёжности, а не наказание команды. Google SRE: error budget policy

В учебном процессе можно договориться приостанавливать необязательные изменения, если риск новых сбоев стал выше ожидаемой пользы. Но исправление уязвимости или восстановление доступности не превращается в запрещённый релиз только потому, что бюджет закончился. Политика должна объяснять такие исключения заранее.

Не путать окно и скорость ухудшения

Один и тот же остаток бюджета может расходоваться медленно неделю или исчезнуть за час. Поэтому оповещение полезно связывать с темпом ухудшения и влиянием на пользователей. Уведомление лишь в момент окончательного нарушения цели может прийти слишком поздно.

При этом короткие окна шумят. Для нового SLI сначала проверяют качество исходных событий, отсутствие двойного счёта и поведение при пропаже телеметрии. «Данных нет» не должно молча превращаться в «ошибок нет».

Как принять первую версию

У показателя должны быть владелец, источник данных и воспроизводимый расчёт. На учебном наборе заранее размечают успешные операции, бизнес-отказы, системные ошибки и неизвестный результат. Затем проверяют, что формула даёт ожидаемые числитель и знаменатель.

После этого обсуждают цель с людьми, отвечающими за продукт и эксплуатацию. Слишком слабая цель не защищает пользователя, недостижимая превращается в постоянный красный фон. Рабочий SLO помогает принять конкретное решение: что улучшать следующим и чем подтвердить, что стало лучше.