RED описывает запросы сервиса, USE — ресурсы. SLI — что меряем, SLO — цель, SLA — договор с клиентом, обычно слабее SLO. Хвост смотрят по P99, не по среднему.
Наблюдаемость и секреты observability собеседование
Метрика — число с подписями во времени. Сколько запросов. Сколько ошибок. Как долго отвечали. Без этого «медленно» и «упало» не отладить: нет знаменателя и нет сравнения с прошлой неделей.
Лог инцидента не заменяет ряд. Ряд не заменяет лог. Это разные инструменты.
RED и USE
RED — про запросы. Rate — сколько в секунду. Errors — какая доля сломалась. Duration — как долго. Для HTTP-сервиса это базовый язык.
USE — про ресурсы. Utilization — насколько заняты. Saturation — очередь, а не «CPU 70%». Errors — сбои пула, диска, железа.
- Rate. Запросы в секунду по ручке и коду ответа.
- Errors. Доля 5xx. Иногда ошибки бизнеса, если они в SLO.
- Duration. Гистограмма, не одно среднее.
- Saturation. Очередь к CPU, диску, пулу соединений. Не просто процент загрузки.
Пример. API зелёный по RED, а обработка очереди вчерашняя. Смотрите USE и лаг консьюмера. Иначе чините не то.
package metrics
var (
reqs = prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "http_requests_total",
Help: "HTTP-запросы",
}, []string{"route", "code"})
dur = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Латентность золотого пути",
Buckets: prometheus.DefBuckets,
}, []string{"route"})
)
func observe(route, code string, seconds float64) {
reqs.WithLabelValues(route, code).Inc()
dur.WithLabelValues(route).Observe(seconds)
}
Счётчик запросов и гистограмма длительности. Из гистограммы считают P99.
SLI, SLO, SLA
SLI — измерение. Например: доля запросов checkout без 5xx за 30 дней. Или доля быстрее 300 мс.
SLO — цель по этому измерению. Например 99.9%. Это обещание себе.
SLA — договор с клиентом. Часто слабее, например 99.5%. Запас, чтобы не платить штраф при каждом внутреннем сбое.
Error budget = 1 − SLO. Топливо на релизы и эксперименты. Выжгли бюджет — стоп рискованным выкатам.
Пример. SLO 99.9% за месяц. Бюджет ошибок — 0.1%. Если за неделю сожгли почти весь бюджет, новые фичи не катят, пока ряд не выровняется.
Почему P99, не среднее
Среднее врёт. Девяносто девять запросов по 50 мс и один за 5 секунд. Среднее почти нормальное. Один человек ждал 5 секунд.
P99 — порог, который хуже только у 1% запросов. Вместе с P95 он показывает хвост. Хвост бьёт UX и касса. Среднее его прячет.
Лейблы в метриках держите грубыми: route, code, revision. user_id в метке убьёт Prometheus: слишком много рядов.
Пример. Canary жжёт только на новой ревизии. Общий средний график спокоен. График P99 с лейблом revision сразу показывает проблему.
Типичная ошибка
Назвать SLA внутренние 99.9%, а SLO — договор с юристом. Наоборот: SLI меряем, SLO цель, SLA внешний договор слабее. Вторая ошибка — дашборд со средним latency без гистограммы: инцидент в хвосте невидим.
На собеседовании
RED для API, USE для пулов. SLI — измерение, SLO — цель, SLA — договор. P99 потому что среднее прячет редкие медленные запросы. Error budget — сколько можно жечь на релизы.