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

Требования

  • Python установлен
  • Пип установлен

Прометей

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

Установка Прометея

Чтобы установить Prometheus, вы можете использовать образ Docker или загрузить предварительно скомпилированный двоичный файл. Мы будем использовать предварительно скомпилированный бинарный файл, чтобы его скачать, нам нужно зайти на этот сайт.

Сервер prometheus запустится на порту 9090. Итак, мы переходим к localhost:9090, чтобы увидеть его пользовательский интерфейс.

Создание сервера FastAPI

Теперь мы собираемся построить сервер FastAPI. Нам необходимо установить FastAPI, Uvicorn и клиент Prometheus.

pip install fastapi uvicorn prometheus-client

main.py

from fastapi import FastAPI

from prometheus_client import make_asgi_app

app = FastAPI()


metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app)

@app.get("/")
def index():
    return "Hello, world!"

В этом файле мы импортируем make_asgi_app из prometheus_client, чтобы создать приложение метрик Prometheus. Мы передаем этот реестр make_asgi_app() для создания приложения метрик. Мы подключаем это приложение метрик к маршруту /metrics, используя app.mount("/metrics", metrics_app).

Запускаем сервер и переходим к localhost:8000/metrics. Мы должны увидеть следующий ответ в нашем веб-браузере.

Создание счетчика

from fastapi import FastAPI, Request
from prometheus_client import make_asgi_app, Counter

app = FastAPI()

index_counter = Counter('index_counter', 'Description of counter')

metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app)

@app.get("/")
def index():
    index_counter.inc()

    return "Hello, world!"

Далее создаем счетчик. Для каждого запроса к маршруту «/» счетчик увеличивается на 1.

Запускаем сервер. И перейдите к localhost:8000/, а затем к localhost:8000/metrics, мы должны увидеть следующий ответ.

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

from fastapi import FastAPI, Request
from prometheus_client import make_asgi_app, Counter

app = FastAPI()

all_requests = Counter('all_requests', 'A counter of the all requests made')

...

@app.middleware("tracing")
def tracing(request: Request, call_next):
    all_requests.inc()
    response = call_next(request)
    return response

Здесь мы создаем промежуточное программное обеспечение FastAPI и создаем счетчик для подсчета всех запросов. Мы создаем функцию трассировки и добавляем функцию all_request.inc(), которая будет увеличиваться на 1 для каждого запроса, сделанного на сервер.

prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: fastapi-server
    static_configs:
      - targets: ["localhost:8000"]

prometheus.yml — это файл конфигурации сервера Prometheus. Мы добавляем еще одно имя_задания для сбора показателей нашего сервера Gin и определяем его как fastapi-server. Нам нужно указать порт, который прослушивает экспортер, в нашем случае 8000. Теперь мы можем перейти к localhost:9090 и выполнить запрос, чтобы проверить, собирает ли Prometheus какие-либо метрики.

Пишем all_requests_total, чтобы посмотреть, сколько запросов было сделано к серверу, и нажимаем выполнить.

Заключение

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

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

Спасибо, что нашли время прочитать эту статью.

Если у вас есть какие-либо рекомендации по поводу других пакетов, архитектур, как улучшить мой код, мой английский или что-то еще; оставьте комментарий или свяжитесь со мной через Twitter или LinkedIn.

Исходный код находится здесь.

Ресурсы

Первоначально опубликовано на https://carlosmv.hashnode.dev.

На простом английском языке

Спасибо, что вы являетесь частью нашего сообщества! Прежде чем уйти: