Пользовательские метрики рабочего ASGI с помощью OpenTelemetry
Возможно ли создать пользовательские метрики открытой телеметрии для вычисления среднего времени нахождения запроса в очереди в ASGI перед выполнением, а также среднего размера очереди на одного рабочего? Или если это невозможно по работникам, то просто в целом по ASGI-серверу. Я пробовал искать в интернете, но не нашел ни одного примера такого использования. ChatGPT предложил мне создать промежуточное ПО и сделать это следующим образом:
import time
from starlette.middleware.base import BaseHTTPMiddleware
from opentelemetry import metrics
# Create a Meter
meter = metrics.get_meter_provider().get_meter("asgi.queue")
# Define a histogram for queue time
queue_time_histogram = meter.create_histogram(
name="asgi.queue_time",
description="Time requests spend in the ASGI queue",
unit="ms",
)
class QueueTimeMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
request.state.queue_start_time = time.perf_counter() # Request received
response = await call_next(request)
queue_time = time.perf_counter() - request.state.queue_start_time
queue_time_histogram.record(queue_time * 1000) # Convert to milliseconds
return response
Однако этот сниппет вызывает у меня некоторые подозрения, и я не уверен, что это именно то, что нам нужно. Есть ли у кого-нибудь совет на этот счет?