Обычно мы подключаем сбор метрик в prometheus к нашим веб-приложениям, используя какие-то клиентские библиотеки, которые отправляют метрики на /metrics. В этой статье я хочу показать вам, как визуализировать задержку с помощью метрики гистограммы. Будет полезно тем, кто еще не строил метрики из Prometheus, а также тем, кто хочет понять, как их интерпретировать.

На картинке “четыре золотых сигнала” (четыре золотых сигнала) — это набор показателей, которые Google рекомендует отслеживать в подходе SRE (Site Reliability Engineering). Это задержка, трафик, ошибки и насыщение. Мониторинг этих «четырех золотых сигналов» может помочь инженерам быстро реагировать на проблемы с производительностью и надежностью системы, а также выявлять узкие места и планировать масштабирование.

Прометей

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

Архитектура Прометея - https://prometheus.io/docs/introduction/overview/

Prometheus собирает и хранит метрики в виде данных временных рядов, каждый временной ряд идентифицируется именем и набором меток (пары, ключ, значение и т. д.).

# Пример метрики с /metrics
request_latency_seconds_bucket{le="0.1"} 32.0
Что такое метрика

Метрика – количественный показатель, используемый для измерения и оценки производительности системы.

Сбор метрик. Прометей использует тянуть модель для сбора метрик, что предполагает, что Prometheus сам инициирует процесс сбора информации с отслеживаемых им сервисов. Это отличает его от толкать модели, где сервисы самостоятельно отправляют свои метрики на сервер мониторинга. Однако у prometheus есть push-шлюз.

Задержка (или латентность) — время, необходимое для обработки запроса. В контексте веб-сервисов это обычно время, необходимое для обработки HTTP-запроса. Мониторинг задержки важен, потому что он напрямую влияет на взаимодействие с пользователем. Важно не только отслеживать среднюю задержку, но и изучать ее распределение, чтобы понимать, как ведет себя система при разных условиях нагрузки.

быстрое веб-приложение API

Для иллюстрации создадим простое приложение, Grafana находится на: порт 3000, логин/пароль admin/admin. Вам нужно добавить источник данных – http://prometheus:9090.

ЧИТАТЬ   25 июля — круглый стол «Коммунальная техника. Трансформация рынка»
Код приложений в 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мс) бесполезны.

Гистограмма состоит из трех элементов:

  • <имя>_считатьподсчет количества наблюдений;

  • _суммасумма всех наблюдаемых значений;

  • набор сегментов _ведро помечен НАШИ (меньше или равно), содержащее количество наблюдений, значение которых меньше или равно числовому значению, содержащемуся в сегменте.

Было два запроса по 30мс - данные из /metrics

Было два запроса по 30мс – данные из /metrics

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

Сделал еще один запрос 468 мс - данные из /metrics

Сделал еще один запрос 468 мс – данные из /metrics

Частоты для каждого отдельного сегмента, сообщаемые клиентом 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% запросов обрабатывался дольше.

Таким образом, процентили дают важную информацию о том, как система работает не только в среднем, но и в экстремальных условиях, позволяя определить как нормальную работу системы, так и ее поведение в условиях пиковой нагрузки.

Выполнение запросов к веб-приложению

Выполнение запросов к веб-приложению

489c8b83d00e66a669d097cafd51d44c

Получите эти показатели с помощью /metrics

Как построить график задержки в 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% всех запросов обрабатываются быстрее, чем это значение».

95% запросов обрабатываются быстрее

95% запросов обрабатываются быстрее

50% запросов обрабатываются быстрее

50% запросов обрабатываются быстрее

Заключение

Чтобы построить задержку, вы можете использовать выражение:

histogram_quantile(0.95, sum(rate(request_latency_seconds_bucket[1m])) by (le))

Это выражение дает вам задержку на уровне 95-го процентиля запроса за последнюю минуту. Это означает, что 95% всех запросов, измеренных за последнюю минуту, имели задержку меньше или равную расчетному значению.

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

Не стоит использовать много сегментов, потому что каждый сегмент формирует свой временной ряд в базе данных Prometheus.

материалы

Материалы изделия

Мой тг-канал, где я пишу заметки/мысли о бэкенде, системном дизайне, архитектуре и инженерии.

Source

От admin