Ответ
Подсчет 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.
Принцип работы:
- Приложение с помощью клиентской библиотеки (например,
prometheus-client) предоставляет специальный эндпоинт (/metrics), на котором публикует свои метрики в текстовом формате. - Сервер Prometheus периодически опрашивает этот эндпоинт и сохраняет значения метрик в свою базу данных временных рядов.
- Данные визуализируются с помощью 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, ёпта.
Как это, блядь, работает, в двух словах:
- Твоё приложение с помощью специальной библиотеки (например,
prometheus-client) заводит себе отдельный URL, обычно/metrics. На нём оно в открытом виде выкладывает все свои внутренние счётчики, таймеры и прочую хуйню в специальном текстовом формате. - Отдельно стоящий сервер Prometheus, как маньяк, периодически (скажем, каждые 15 секунд) ходит по всем этим эндпоинтам и считывает эти метрики. Всё аккуратно складывает в свою базу данных, которая заточена под временные ряды.
- Потом эти цифры можно смотреть на красивых графиках в 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. И не путай, а то будет тебе, как Герасиму с Муму, — совесть потом замучает, что всё неправильно сделал.