首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >你的 FastAPI 服务还缺一个监控仪表盘?Prometheus 一站式搞定

你的 FastAPI 服务还缺一个监控仪表盘?Prometheus 一站式搞定

作者头像
Michael阿明
发布2026-03-25 13:56:51
发布2026-03-25 13:56:51
600
举报

文章目录

  1. Prometheus 简介
  2. 实践演示
  3. 总结

1. Prometheus 简介

Prometheus 是一款开源的系统监控和警报工具包。它具有以下特性:

  • 多维数据模型:通过指标名称和键值对标签来标识时间序列数据
  • 强大的查询语言 PromQL:允许用户实时选择和聚合时间序列数据
  • 基于 HTTP 的拉取模式:通过 HTTP 协议定期从配置的目标拉取指标
  • 支持推送时间序列:通过中间网关支持推送模式
  • 多种图形和仪表板支持模式

2. 实践演示

以下通过一个 FastAPI 服务来举例说明

安装pip包

代码语言:javascript
复制
pip install fastapi uvicorn prometheus-client

编写一个简易的服务代码

代码语言:javascript
复制
from fastapi import FastAPI, Response  # 导入 FastAPI 应用类和 Response 用于自定义 HTTP 响应
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST  # 生成 Prometheus 文本格式及内容类型常量
import time  # 用于记录和计算请求耗时
import random  # 用于模拟随机成功/失败的响应

app = FastAPI()  # 创建 FastAPI 应用实例

# 导入 Prometheus 指标类型:Counter(计数器),Histogram(直方图/分桶)
from prometheus_client import Counter, Histogram
REQUEST_COUNT = Counter('api_requests_total', 'Total API requests', ['status'])  # 总请求计数,带 status 标签区分成功/失败
REQUEST_DURATION = Histogram('api_request_duration_seconds', 'API request duration in seconds')  # 请求耗时直方图(秒)


@app.middleware("http")
async def add_prometheus_metrics(request, call_next):
    start = time.time()  # 记录请求开始时间(秒)
    response = await call_next(request)  # 调用下一个处理器,获取响应
    duration = time.time() - start  # 计算请求耗时
    REQUEST_DURATION.observe(duration)  # 将耗时记录到直方图中
    return response  # 返回响应


@app.get("/api/data")
async def get_data():
    success = random.choice([True, False])  # 随机决定成功或失败,模拟业务逻辑
    if success:
        REQUEST_COUNT.labels(status="success").inc()  # 成功计数加 1
        return {"code": 0, "msg": "success"}  # 返回成功的 JSON
    else:
        REQUEST_COUNT.labels(status="failure").inc()  # 失败计数加 1
        return {"code": 1, "msg": "failure"}  # 返回失败的 JSON

# ✅ 关键:正确暴露 /metrics 给 Prometheus 抓取
@app.get("/metrics")
async def metrics():
    return Response(
        content=generate_latest(),  # 生成当前所有指标的 prometheus 文本格式内容
        media_type=CONTENT_TYPE_LATEST  # 设置正确的 Content-Type,通常为 "text/plain; version=0.0.4"
    )

启动算法服务

代码语言:javascript
复制
 uvicorn fastapi_app:app --host 0.0.0.0 --port 8000

使用podman拉取镜像,跟docker类似

代码语言:javascript
复制
podman pull quay.io/prometheus/prometheus

编写监控配置

代码语言:javascript
复制
[user@MichaelMing ~]$ cat prometheus.yml

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: 'fastapi_app'
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets: ['localhost:8000']  # ← 关键:用 localhost
rule_files:
  - 'alert.rules.yml'

报警配置:最近5分钟错误率超过30%,就会告警

代码语言:javascript
复制
[user@MichaelMing ~]$ cat alert.rules.yml

groups:
- name: api_alerts
  rules:
  - alert: HighErrorRate
    expr: rate(api_requests_total{status="failure"}[5m]) / rate(api_requests_total[5m]) > 0.3
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on FastAPI API"
      description: "Error rate exceeded 30% in the last 5 minutes."

启动监控服务

代码语言:javascript
复制
podman run -d \
  --name prometheus \
  --network host \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v $(pwd)/alert.rules.yml:/etc/prometheus/alert.rules.yml \
quay.io/prometheus/prometheus

可以看到监控服务已经看到算法启动了 UP了

在这里插入图片描述
在这里插入图片描述

多次调用算法服务

代码语言:javascript
复制
curl localhost:8000/api/data

然后在监控服务web页面查询 api_requests_total,可以查看任务成功和失败次数

在这里插入图片描述
在这里插入图片描述

查看请求耗时分布 api_request_duration_seconds_bucket

在这里插入图片描述
在这里插入图片描述

查看报警,FIRING 起火了

在这里插入图片描述
在这里插入图片描述

3. 总结

本文通过一个完整的示例演示了如何为 FastAPI 应用集成 Prometheus 监控:

  1. 基础监控集成:使用 prometheus-client 库在 FastAPI 应用中暴露关键指标
  2. 核心指标类型
    • Counter:用于记录请求总数,按状态标签区分
    • Histogram:用于统计请求耗时分布
  3. 完整的监控链路:从应用埋点 → Prometheus 采集 → 指标查询 → 告警配置
  4. 容器化部署:使用 Podman 运行 Prometheus,与 Docker 兼容

这种监控方案具有以下优势:

  • 实时性:10 秒采集间隔确保及时发现问题
  • 多维分析:通过标签可对指标进行多维度聚合分析
  • 预警能力:基于 PromQL 的告警规则能在问题影响用户前发出预警
  • 标准化:遵循 Prometheus 标准,可与 Grafana 等可视化工具无缝集成

通过这套监控体系,开发者和运维团队能够全面掌握应用的运行状态,快速定位性能瓶颈,及时响应异常情况,为服务的稳定性和可靠性提供有力保障。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Michael阿明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Prometheus 简介
  • 2. 实践演示
  • 3. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档