Что такое персентили, какой персентиль важен и когда
Что проверяют
Для бэкендщика это вопрос про мониторинг и цели по качеству сервиса: умеете ли вы снимать задержки так, чтобы цифре можно было верить, и понимаете ли разницу между способами сбора в клиенте метрик.
Как отвечать
Персентиль это значение, ниже которого лежит заданная доля наблюдений. Медиана отвечает на вопрос, как обычно, а p95 и p99 на вопрос, как плохо бывает у заметной части пользователей. Цели по задержке формулируют на хвосте, потому что среднее прячет и очередь, и повторы, и редкие тяжёлые запросы.
Как снимать в Go: клиент Prometheus предлагает гистограмму и сводку. Гистограмма копит счётчики по корзинам, персентиль считается уже на сервере по корзинам, значение приближённое, зато метрики разных реплик складываются. Сводка считает квантиль внутри процесса точнее, но агрегировать её между репликами нельзя. Для сервиса из нескольких подов берут гистограмму и подбирают границы корзин вокруг целевых значений.
h := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Buckets: prometheus.DefBuckets,
}, []string{"route", "code"})Хорошо добавить: мерить и на сервере, и на клиенте, разница покажет сеть и очередь; смотреть персентиль в разрезе ручки и кода ответа, иначе быстрые ошибки улучшают картину.
Где спотыкаются
Складывают или усредняют готовые квантили по репликам. Так нельзя: агрегируются только корзины гистограммы или сырые наблюдения, а среднее из квантилей не соответствует ничему.
Оставляют корзины по умолчанию, не глядя на свои значения. Если целевое время попадает в широкую корзину, оценка получается интерполяцией внутри неё и живёт своей жизнью. Обратная крайность: корзин делают слишком много, и растёт кардинальность метрик вместе со стоимостью хранения.
Смотрят на свой персентиль и забывают про усиление хвоста. Если ручка веером опрашивает несколько зависимостей и ждёт всех, шанс поймать медленный ответ складывается, и наружу хвост оказывается хуже, чем у каждой зависимости по отдельности. Лечится таймаутом с запасным ответом и дублирующим запросом, а не подкруткой мониторинга.