Как добавить метрики во внешние сервисы с помощью aioprometheus и FastAPI?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как добавить метрики во внешние сервисы с помощью aioprometheus и FastAPI?

Сообщение Anonymous »

Я пытаюсь добавить метрики к внешним службам с помощью aioprometheus в приложении FastAPI. Вот упрощенный пример того, чего я пытаюсь достичь.
Скажем, у меня есть класс приложения-оболочки как таковой:

Код: Выделить всё

from aioprometheus import Registry, Counter, Histogram
from fastapi import FastAPI

class App:
def __init__(self, ...):
self.registry = Registry()
self.counter = Counter(
name="counts", doc="request counts"
)
self.latency = Histogram(
name="latency",
doc="request latency",
buckets=[0.1, 0.5, 1, 1.5, 2]
)

self.app = FastAPI()
self._metrics()

def _metrics(self):
# Counter metrics
@self.app.middleware("http")
async def counter_metrics(request, call_next):
response = await call_next(request)
self.counter.inc(
{"path": str(request.url.path), "status": response.status_code}
)
return response

# Latency metrics
@self.app.middleware("http")
async def latency_metrics(request, call_next):
start = time.time()
response = await call_next(request)
total_duration = time.time() - start
self.latency.observe(
{"path": str(request.url.path)}, total_duration
)
return response

@self.app.on_event("startup")
async def startup():
self.app.include_router(some_router(...))

self.registry.register(self.counter)
self.registry.register(self.latency)
По сути, у меня инициированы реестр, счетчик и гистограмма. В _metrics у меня есть логика, специфичная для счетчика и гистограммы, которая позже добавляется в реестр. Это сотворит чудеса и перехватит метрики при вызове конечной точки в some_router (это хорошо! Я хотел бы сохранить это, а также иметь метрики внешнего сервиса).
Однако, скажем, я вызываю внешний сервис из some_router как таковой:

Код: Выделить всё

from fastapi import APIRouter

def some_router():
router = APIRouter()

@router.get("/some_router")
async def some_router():
response = await external_service()

return response

return router
В этом случае, как мне добавить метрики конкретно к external_service, т. е. задержку этой конкретной внешней службы?


Подробнее здесь: https://stackoverflow.com/questions/711 ... nd-fastapi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»