使用 Grafana+Prometheus 生态统计 django、flask、fastapi 的 rps等指标是如何实现的?

Grafana+Prometheus 是定时主动访问 django、flask、fastapi 的相关接口来获取 rps 指标

但是我们部署 django、flask、fastapi 服务的时候,往往是多个进程,比如 10 个进程(master-slave),请求会被转发到任意一个进程,而 rps 这些指标是记录在进程内,这就会导致 rps 统计的不是整体的 rps,而是某个进程的 rps?

阅读 1.9k
avatarAI BotBETA

在 Grafana 和 Prometheus 的生态系统中,统计 Django、Flask 或 FastAPI 应用的 RPS(每秒请求数)等指标,通常不是通过 Prometheus 定时主动访问这些框架的接口来实现的。相反,Prometheus 作为一个拉取(pull)模型的系统,会定期从被监控的服务中拉取指标数据。

对于 Django、Flask 和 FastAPI 这样的 Web 框架,你可以通过以下几种方式来收集 RPS 等指标:

  1. 使用内置或第三方的中间件/装饰器

这些库通常会在请求开始和结束时记录相关的指标,然后 Prometheus 可以通过 HTTP 拉取这些指标。

  1. 使用 WSGI/ASGI 服务器插件

    • 如果你的应用部署在 Gunicorn(WSGI)或 Uvicorn(ASGI)这样的服务器上,这些服务器可能提供了与 Prometheus 集成的插件或中间件。例如,Gunicorn 有一个 prometheus_gunicorn_exporter 的插件。
  2. 使用反向代理或负载均衡器

    • 如果你使用了 Nginx 或其他反向代理/负载均衡器,它们通常也提供了与 Prometheus 集成的功能,可以收集 RPS 等指标。
  3. 多进程/多线程统计

    • 对于多进程部署,每个进程都会运行其自己的 Prometheus 导出器,并且 Prometheus 会从每个进程中拉取指标。然后,你可以在 Grafana 中对这些指标进行聚合,以获取整个应用的 RPS。
    • Prometheus 有一个强大的查询语言 PromQL,允许你执行复杂的聚合操作,如 sum()avg() 等。
  4. 使用服务发现

    • 如果你的应用有多个实例(例如在 Kubernetes 或其他容器编排平台上),你可以使用 Prometheus 的服务发现功能来自动发现这些实例并拉取指标。
  5. 确保指标的唯一性

    • 当你在多个进程中收集指标时,确保每个指标都有唯一的标识符(例如,通过标签),以便 Prometheus 可以区分它们。

总之,Grafana 和 Prometheus 提供了一个强大的工具集来监控 Django、Flask 和 FastAPI 这样的 Web 应用。通过集成适当的中间件/装饰器或使用服务器插件,你可以轻松收集 RPS 等指标,并在 Grafana 中进行可视化和警报。

1 个回答

可以把 Web 应用统计到的 Metrics 发送到 Pushgateway,用不同的 Lable 来标记进程,然后 Prometheus 到 PushGateway 拉 Metrics 就行了,计算 RPS 的时候忽略标记进程的 Label 求和。

这样做的另一个好处就是还可以统计到各个进程内的 RPS 情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题