Обычно мы подключаем сбор метрик в prometheus к нашим веб-приложениям, используя какие-то клиентские библиотеки, которые отправляют метрики на /metrics
. В этой статье я хочу показать вам, как визуализировать задержку с помощью метрики гистограммы. Будет полезно тем, кто еще не строил метрики из Prometheus, а также тем, кто хочет понять, как их интерпретировать.
На картинке “четыре золотых сигнала” (четыре золотых сигнала) — это набор показателей, которые Google рекомендует отслеживать в подходе SRE (Site Reliability Engineering). Это задержка, трафик, ошибки и насыщение. Мониторинг этих «четырех золотых сигналов» может помочь инженерам быстро реагировать на проблемы с производительностью и надежностью системы, а также выявлять узкие места и планировать масштабирование.
Contents
Прометей
Прометей — это открытая система мониторинга и оповещения, разработанная SoundCloud. В среде распределенных систем Prometheus широко используется для сбора и визуализации метрик в реальном времени.

Prometheus собирает и хранит метрики в виде данных временных рядов, каждый временной ряд идентифицируется именем и набором меток (пары, ключ, значение и т. д.).
# Пример метрики с /metrics
request_latency_seconds_bucket{le="0.1"} 32.0
Что такое метрика
Метрика – количественный показатель, используемый для измерения и оценки производительности системы.
Сбор метрик. Прометей использует тянуть модель для сбора метрик, что предполагает, что Prometheus сам инициирует процесс сбора информации с отслеживаемых им сервисов. Это отличает его от толкать модели, где сервисы самостоятельно отправляют свои метрики на сервер мониторинга. Однако у prometheus есть push-шлюз.
Задержка (или латентность) — время, необходимое для обработки запроса. В контексте веб-сервисов это обычно время, необходимое для обработки HTTP-запроса. Мониторинг задержки важен, потому что он напрямую влияет на взаимодействие с пользователем. Важно не только отслеживать среднюю задержку, но и изучать ее распределение, чтобы понимать, как ведет себя система при разных условиях нагрузки.
быстрое веб-приложение API
Для иллюстрации создадим простое приложение, Grafana находится на: порт 3000, логин/пароль admin/admin. Вам нужно добавить источник данных – http://prometheus:9090.
Код приложений в 28 строк 🙂
import time
from typing import Union
from prometheus_client import Histogram, make_asgi_app
from fastapi import FastAPI
app = FastAPI()
metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app)
REQUEST_LATENCY = Histogram(
name="request_latency_seconds",
documentation='Time spent processing a request',
buckets=(.1, .2, .3, .4, .5)
)
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
@REQUEST_LATENCY.time()
def read_item(item_id: int, q: Union[str, None] = None):
time.sleep(item_id / 100)
return {"item_id": item_id, "q": q}
Dockerfile для приложения
FROM python:3.10
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose
version: '3.9'
services:
web:
build: .
ports:
- 8000:8000
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
depends_on:
- web
grafana:
image: grafana/grafana
ports:
- 3000:3000
depends_on:
- prometheus
Как собирать метрики для увеличения задержки
Prometheus собирает данные о задержке с помощью наблюдателей в клиентских библиотеках. В мире Prometheus есть четыре основных типа наблюдателей: счетчик, датчик, сводка и гистограмма. Гистограмма обычно используется для измерения задержки.
Гистограмма подсчитайте наблюдения(образцы), такие как HTTP-запросы, которые он сортирует по пользовательским сегментам (ведра) по продолжительности. Он также подсчитывает общее количество наблюдений и сумму всех наблюдаемых значений.
Например, вы можете определить сегменты следующим образом: 0,1, 0,2, 0,3, 0,4, 0,5 секунды. Каждый раз, когда Prometheus получает новое значение задержки, он увеличивает соответствующий счетчик сегментов.
Как выбрать раздачу по сегментам
Например, в клиенте prometheus_client предлагается следующее значение:
DEFAULT_BUCKETS = (.005, .01, .025, .05, .075, .1, .25, .5, .75, 1.0, 2.5, 5.0, 7.5, 10.0, INF)
Сегменты по умолчанию не всегда имеют смысл для вашего приложения. Я бы рекомендовал выбирать сегменты из СРБ (целевой уровень обслуживания). А также несколько сегментов выше/ниже SLO.
Например, если SLO для микросервисов составляет около 500 мс. Слишком маленькие сегменты (5мс, 10мс, 25мс, 50мс) и слишком большие сегменты (2500мс, 5000мс, 7500мс, 10000мс) бесполезны.
Гистограмма состоит из трех элементов:
-
<имя>_считатьподсчет количества наблюдений;
-
_сумма сумма всех наблюдаемых значений; -
набор сегментов
_ведро помечен НАШИ (меньше или равно), содержащее количество наблюдений, значение которых меньше или равно числовому значению, содержащемуся в сегменте.

Сегмент le="0.1"
указывает, что 2 запроса были выполнены за 0,1 секунды или быстрее.

Частоты для каждого отдельного сегмента, сообщаемые клиентом Prometheus, суммируются. Это означает, что счетчик сегментов le="0,4"
также включает счетчик сегментов le="0,3"
, le="0,2"
, le="0,1"
.
Гистограмму можно использовать для расчета квантилей (процентилей).
Что такое процентиль
квантиль это значение, которое данная случайная величина не превышает с фиксированной вероятностью. Если вероятность выражается в процентах, квантиль называется процентилем или процентилем. Если 25% всех наблюдений меньше или равны значению, мы можем сказать, что значение является 25-м процентилем, и это значение может быть представлено p25.
процентиль — статистическая мера, показывающая, какой процент наблюдений в группе не превышает определенного значения. Процентили используются в статистике для лучшего понимания распределения наблюдений.
В контексте задержки процентили обычно используются для описания распределения времени отклика системы.
Возьмем пример. Предположим, у вас есть веб-сервер, и вы измерили время ответа сервера на 1000 запросов. Вы записали это время отклика и отсортировали его в порядке возрастания.
Пусть 50-й процентиль (или медиана) равен 200 миллисекундам. Это означает, что 50% всех запросов были обработаны за 200 миллисекунд или быстрее.
Если 95-й процентиль равен 500 миллисекундам, это означает, что 95% всех запросов были обработаны за 500 миллисекунд или быстрее, а обработка 5% запросов заняла больше времени.
Например, 99-й процентиль, который может составлять 800 миллисекунд, показывает, что 99% всех запросов были обработаны за 800 миллисекунд или быстрее, а самый медленный 1% запросов обрабатывался дольше.
Таким образом, процентили дают важную информацию о том, как система работает не только в среднем, но и в экстремальных условиях, позволяя определить как нормальную работу системы, так и ее поведение в условиях пиковой нагрузки.


Как построить график задержки в Grafana
Для графика задержки мы будем использовать процентиль 95%, вы также можете создать другие процентили. Для рендеринга в Grafana вам нужно запустить запрос PromQL (Prometheus Query Language):
histogram_quantile(
0.95,
sum(
rate(
request_latency_seconds_bucket[1m]
)
) by (le)
)
request_latency_seconds_bucket
— Временной ряд Прометея.
rate
– используется для расчета средней скорости изменения временного ряда в указанный период времени, как часто происходит определенное событие в течение определенного времени. В основном, как производная от математики.

sum
— это оператор агрегации, добавляющий значения по группе элементов. Используется для получения общей суммы значений для всех подходящих временных рядов.

histogram_quantile
– ищет значение, не превышающее определенный процент от всех запросов. Вы можете интерпретировать это как: «N% всех запросов обрабатываются быстрее, чем это значение».


Заключение
Чтобы построить задержку, вы можете использовать выражение:
histogram_quantile(0.95, sum(rate(request_latency_seconds_bucket[1m])) by (le))
Это выражение дает вам задержку на уровне 95-го процентиля запроса за последнюю минуту. Это означает, что 95% всех запросов, измеренных за последнюю минуту, имели задержку меньше или равную расчетному значению.
Гистограммы не являются эффективным инструментом для точного измерения задержки, особенно на границах сегментов. Так как если латентность уменьшилась на 20 мс, ее заметность на графике зависит от настроенных сегментов. Эта диаграмма может широко использоваться для качественной оценки оптимизации, но не для количественной оценки.
Не стоит использовать много сегментов, потому что каждый сегмент формирует свой временной ряд в базе данных Prometheus.
материалы
Мой тг-канал, где я пишу заметки/мысли о бэкенде, системном дизайне, архитектуре и инженерии.