我正在尝试在使用
aioprometheus
构建的应用程序中使用
FastAPI
向外部服务添加指标。这是我想要实现的目标的简化示例。
假设我有一个这样的包装器 App 类:
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)
基本上,我有
Registry
、
Counter
和
Histogram
启动。在
_metrics
中,我有
Counter
和
Histogram
特定逻辑,稍后添加到
Registry
中。当调用
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
添加指标,即此特定外部服务的延迟?
可以使用 aioprometheus 来跟踪外部服务的指标,就像你对内部路由所做的那样。以下是如何修改代码以包含对外部服务延迟的度量:
from aioprometheus import Registry, Counter, Histogram
from fastapi import FastAPI
import time
import asyncio
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]
)
# 创建一个新的 Histogram 来跟踪外部服务的延迟
self.external_service_latency = Histogram(
name="external_service_latency",
doc="External service latency",
buckets=[0.1, 0.5, 1, 1.5, 2],
)
self.app = FastAPI()
self._metrics()
def _metrics(self):
# ... (现有的 counter_metrics 和 latency_metrics 函数)
@self.app.on_event("startup")
async def startup():
self.app.include_router(some_router(...))
self.registry.register(self.counter)
self.registry.register(self.latency)
# 注册新的外部服务延迟 Histogram
self.registry.register(self.external_service_latency)
# ... (现有的 some_router 函数)
async def external_service():
start = time.time()
# 模拟外部服务调用
await asyncio.sleep(0.2)
total_duration = time.time() - start
# 在这里,我们观察外部服务的延迟
app.external_service_latency.observe({"service": "external_service"}, total_duration)
return {"message": "response from external service"}
在这个改进后的代码中:
-
创建了一个新的 Histogram
:
self.external_service_latency
用于专门跟踪外部服务的延迟。 -
在
external_service
函数中 :- 我们在调用外部服务之前记录开始时间。
- 在调用完成后计算总持续时间。
-
使用
app.external_service_latency.observe()
记录延迟,并提供一个标签"service": "external_service"
来标识度量所属的服务。
-
注册 Histogram
: 在
_metrics
函数中,我们使用self.registry.register()
注册新的self.external_service_latency
,使其可用于收集和显示。
现在,每当调用
external_service
时,都会收集其延迟并与 "external_service" 标签一起存储在
external_service_latency
指标中,从而可以单独监控和分析其性能。