Как подсчитать количество входящих HTTP-запросов в веб-приложении на Python

Ответ

Подсчет HTTP-запросов — базовая задача мониторинга. Подход кардинально отличается для локальной отладки и production-окружения.

1. Для отладки: Middleware

В рамках веб-фреймворка можно создать промежуточное ПО (middleware), которое будет перехватывать каждый запрос и инкрементировать счетчик. Этот метод подходит для простых сценариев и демонстраций, но не для production, так как счетчик в памяти не является потокобезопасным и сбрасывается при перезапуске процесса.

Пример для Django в middleware.py:

from django.db import connection

class RequestCounterMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.request_count = 0

    def __call__(self, request):
        self.request_count += 1
        print(f"Обработан запрос №{self.request_count}")
        response = self.get_response(request)
        return response

2. Для Production: Система мониторинга (Prometheus)

В production-системах для сбора метрик используется стандартный индустриальный подход — система мониторинга Prometheus.

Принцип работы:

  1. Приложение с помощью клиентской библиотеки (например, prometheus-client) предоставляет специальный эндпоинт (/metrics), на котором публикует свои метрики в текстовом формате.
  2. Сервер Prometheus периодически опрашивает этот эндпоинт и сохраняет значения метрик в свою базу данных временных рядов.
  3. Данные визуализируются с помощью Grafana или используются для настройки алертов.

Пример для Flask с prometheus-flask-exporter:

# pip install prometheus-flask-exporter
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app) # Автоматически добавляет /metrics

@app.route('/')
def home():
    return "Hello, World!"

# При обращении к '/' счетчик http_requests_total будет увеличен

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

Ответ 18+ 🔞

Ну, слушай, смотри, как это всё работает, а то я тут вижу, люди путают, где что применить — а это, блядь, две большие разницы, как говорят в Одессе.

1. Для отладки, когда ты просто дебажишь на своей машине: Middleware

Вот ты сидишь, пишешь свой веб-сервис, и тебе надо быстро прикинуть, сколько запросов прилетает. Ну, логично же вставить какую-нибудь хуйню прямо в код приложения, которая будет считать. Это и есть промежуточный слой, middleware. Он ловит каждый запрос, увеличивает счётчик и, например, пишет в консоль.

Но, ёпта, это же чисто для локального просмотра! Потому что счётчик этот живёт в оперативке твоего процесса. Ты его перезапустил — и всё, ноль, пиздец. Да и с безопасностью потоков там обычно полный атас, если ты не озаботился этим специально.

Вот смотри, как это может выглядеть в Django, в файле middleware.py:

from django.db import connection

class RequestCounterMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.request_count = 0

    def __call__(self, request):
        self.request_count += 1
        print(f"Обработан запрос №{self.request_count}")
        response = self.get_response(request)
        return response

Видишь? Просто, наглядно. Запустил, видишь в терминале "Запрос №1, №2..." — и доволен как слон. Но пытаться так считать запросы на боевом сервере — это, ядрёна вошь, верх идиотизма.

2. Для Production, когда всё серьёзно: Система мониторинга (Prometheus)

А вот когда твоё приложение уже работает на серверах и на него смотрят реальные люди, тут нужен уже взрослый, промышленный подход. Стандарт де-факто — это Prometheus, ёпта.

Как это, блядь, работает, в двух словах:

  1. Твоё приложение с помощью специальной библиотеки (например, prometheus-client) заводит себе отдельный URL, обычно /metrics. На нём оно в открытом виде выкладывает все свои внутренние счётчики, таймеры и прочую хуйню в специальном текстовом формате.
  2. Отдельно стоящий сервер Prometheus, как маньяк, периодически (скажем, каждые 15 секунд) ходит по всем этим эндпоинтам и считывает эти метрики. Всё аккуратно складывает в свою базу данных, которая заточена под временные ряды.
  3. Потом эти цифры можно смотреть на красивых графиках в Grafana или настраивать алерты: "Если количество ошибок 500 за 5 минут превысило 10 — блядь, буди меня, даже если я сплю!".

Вот тебе живой пример для Flask с библиотекой prometheus-flask-exporter:

# pip install prometheus-flask-exporter
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app) # Автоматически добавляет /metrics

@app.route('/')
def home():
    return "Hello, World!"

# При обращении к '/' счетчик http_requests_total будет увеличен

Вот и всё! Ты почти ничего не делаешь, а библиотека уже сама считает все запросы, их длительность, статусы ответов — овердохуища полезной информации. Этот подход масштабируется, переживает перезапуски приложений и вообще сделан для реальной жизни, а не для игрушек на столе.

Короче, запомни: для дебага — middleware в консоль, для продакшена — Prometheus в Grafana. И не путай, а то будет тебе, как Герасиму с Муму, — совесть потом замучает, что всё неправильно сделал.