Пользовательские метрики рабочего 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

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

Вернуться на верх