首页 > 编程问答 >如何使用aioprometheus和FastAPI向外部服务添加指标?

如何使用aioprometheus和FastAPI向外部服务添加指标?

时间:2024-07-27 13:30:49浏览次数:13  
标签:python prometheus fastapi starlette

我正在尝试在使用 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"} 

在这个改进后的代码中:

  1. 创建了一个新的 Histogram : self.external_service_latency 用于专门跟踪外部服务的延迟。
  2. external_service 函数中 :
    • 我们在调用外部服务之前记录开始时间。
    • 在调用完成后计算总持续时间。
    • 使用 app.external_service_latency.observe() 记录延迟,并提供一个标签 "service": "external_service" 来标识度量所属的服务。
  3. 注册 Histogram : 在 _metrics 函数中,我们使用 self.registry.register() 注册新的 self.external_service_latency ,使其可用于收集和显示。

现在,每当调用 external_service 时,都会收集其延迟并与 "external_service" 标签一起存储在 external_service_latency 指标中,从而可以单独监控和分析其性能。

标签:python,prometheus,fastapi,starlette
From: 71179110

相关文章

  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • Starlette SessionMiddleware 将会话数据存储在服务器上还是客户端上?
    我正在开发一个无状态FastAPI应用程序。身份验证通过GoogleOAuth(openid电子邮件配置文件范围)进行处理。我正在使用Authlib,它使用SessionMiddleware(request.session)来存储临时代码和状态。现在,我想使用令牌限制对某些端点的访问。为此......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • 1-python的数据类型与变量
    一、交互模式与脚本模式交互模式:就相当于一种问答模式,关闭即消失无法保存重用比如python自带的编译器脚本模式:可以将代码长期保存以及重复使用如何创建脚本模式:idle——file——newfile[快捷方式:idle——ctrl+n]保存:ctrl+s运行:F5二、变量(Variable)变量:会变化......
  • 2-Python数据类型——序列
    Python数据类型——序列一、序列序列是一个可以存放多个值的容器。有序序列:在序列中每个值都有对应的下标下标:就相当于酒店的房间号,方便客人的查找与酒店的管理在编程中下标的起始值与日常生活中的计数有所不同:下标的计数从0开始计数,从左往右计数:下标从0开始往右递......
  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......
  • Pythonanywhere - ping:套接字:不允许操作
    请帮忙。我有一个Telegram机器人,当我从Bash控制台启动他时,它每60秒ping一次静态IP-它工作正常,但每天停止工作一次。我尝试使用“始终开启任务”,但在日志文件中收到“ping:套接字:不允许操作”。我有5美元帐户,我能做什么?从Bash控制台运行时我看到的内容:---17......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......