扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

1. GraphQL 在 FastAPI 中的实现

1.1 基础集成方案

使用 Strawberry 库实现 GraphQL 服务:

# 安装依赖:strawberry-graphql==0.215.3 fastapi==0.103.1
from fastapi import FastAPI
import strawberry
from strawberry.asgi import GraphQL @strawberry.type
class User:
id: int
name: str @strawberry.type
class Query:
@strawberry.field
async def user(self, id: int) -> User:
# 模拟数据库查询
return User(id=id, name=f"User{id}") schema = strawberry.Schema(query=Query)
app = FastAPI()
app.add_route("/graphql", GraphQL(schema))

1.2 性能优化要点

Thinking...

graph LR
A[请求解析] --> B[查询验证]
B --> C[字段解析]
C --> D[数据加载]
D --> E[响应生成]

优化策略:

  • 使用 DataLoader 批处理机制
  • 启用查询缓存
  • 限制查询深度复杂度

2. 性能监控实现

2.1 Prometheus 集成

# 安装依赖:prometheus-client==0.17.1
from prometheus_client import Counter, Histogram
from fastapi import Request GRAPHQL_QUERY_COUNTER = Counter(
"graphql_queries_total",
"Total number of GraphQL queries",
["operation"]
) GRAPHQL_DURATION = Histogram(
"graphql_request_duration_seconds",
"Time spent processing GraphQL requests",
["operation"]
) @app.middleware("http")
async def monitor_requests(request: Request, call_next):
start_time = time.time()
operation_name = request.state.graphql_operation.get("name", "unknown") with GRAPHQL_DURATION.labels(operation=operation_name).time():
response = await call_next(request) GRAPHQL_QUERY_COUNTER.labels(operation=operation_name).inc()
return response

2.2 关键监控指标

指标名称 类型 描述
graphql_queries_total Counter 按操作类型统计的查询次数
graphql_errors_total Counter 按错误类型统计的异常次数
graphql_resolve_time Histogram 字段解析耗时分布

3. APM 系统集成

3.1 Elastic APM 配置

# 安装依赖:elastic-apm==6.15.2
from elasticapm.contrib.starlette import make_apm_client apm = make_apm_client({
"SERVICE_NAME": "fastapi-graphql",
"SERVER_URL": "http://apm-server:8200",
"ENVIRONMENT": "production"
}) app.add_middleware(ElasticAPM, client=apm)

3.2 自定义跟踪点

from elasticapm import capture_span

@strawberry.field
async def user(self, info, id: int) -> User:
with capture_span("user_query", "database"):
# 执行数据库查询
return await fetch_user(id)

4. 最佳实践案例

4.1 查询复杂度限制

from strawberry.extensions import QueryDepthLimiter

app.add_route("/graphql", GraphQL(
schema,
extensions=[
QueryDepthLimiter(max_depth=10)
]
))

4.2 异常监控增强

from elasticapm import capture_exception

@app.exception_handler(GraphQLError)
async def handle_graphql_errors(request, exc):
capture_exception()
return PlainTextResponse(str(exc), status_code=500)

课后 Quiz

  1. 如何防止 GraphQL 查询的 N+1 问题?

    A. 使用 DataLoader 批处理机制

    B. 限制查询深度

    C. 增加服务器线程数

    (答案:A。解析:DataLoader 可以将多个请求合并为批量查询)

  2. 哪个 Prometheus 指标类型适合记录响应时间分布?

    A. Counter

    B. Gauge

    C. Histogram

    (答案:C。解析:Histogram 类型支持分位数计算)

常见报错处理

错误 1:422 Unprocessable Entity

  • 原因:输入参数验证失败
  • 解决:检查请求体是否符合 GraphQL 规范
  • 预防:使用中间件捕获畸形请求

错误 2:N+1 Query Problem

  • 现象:单个请求触发大量数据库查询
  • 解决:实现 DataLoader 模式
  • 预防:进行查询复杂度分析
graph LR
A[客户端] --> B[FastAPI服务]
B --> C[数据采集]
C --> D[数据存储]
D --> E[可视化展示]

运行环境配置

pip install fastapi==0.103.1 strawberry-graphql==0.215.3
pip install prometheus-client==0.17.1 elastic-apm==6.15.2

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:如何在 FastAPI 中玩转 GraphQL 性能监控与 APM 集成?

往期文章归档:

免费好用的热门在线工具

如何在 FastAPI 中玩转 GraphQL 性能监控与 APM 集成?的更多相关文章

  1. Solutions:应用程序性能监控/管理(APM)实践---python/flask

    本文部分内容转载自:https://blog.csdn.net/UbuntuTouch/article/details/102844900 官方文档:https://www.elastic.co/gu ...

  2. Elastic:应用程序性能监控/管理(APM)实践

    在今天的文章里,我们将介绍Elastic的一个重要的应用:应用程序性能管理(Application Performance Monitoring/Management),简称APM.那么到底什么是AP ...

  3. Android 性能监控系列一(原理篇)

    欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电 ...

  4. 如何在 Kubernetes 集群中玩转 Fluid + JuiceFS

    作者简介: 吕冬冬,云知声超算平台架构师, 负责大规模分布式机器学习平台架构设计与功能研发,负责深度学习算法应用的优化与 AI 模型加速.研究领域包括高性能计算.分布式文件存储.分布式缓存等. 朱唯唯 ...

  5. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  6. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  7. 如何在Linux中查看所有正在运行的进程

    如何在Linux中查看所有正在运行的进程 FROM:http://os.51cto.com/art/201101/244090.htm 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系 ...

  8. 如何在SQLServer中处理每天四亿三千万记录

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  9. 如何在MySQL中获得更好的全文搜索结果

    如何在MySQL中获得更好的全文搜索结果 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语 ...

  10. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

随机推荐

  1. Java并发基础之多线程

    文章也发布在我的个人博客上:https://blog.ysboke.cn/archives/129.html 概述 每个Thread类的示例都代表一个线程,而进程是操作系统级别的多任务,JVM就是运行 ...

  2. FastAPI与MongoDB Change Stream的实时数据交响曲

    title: FastAPI与MongoDB Change Stream的实时数据交响曲 date: 2025/05/25 13:04:40 updated: 2025/05/25 13:04:40 ...

  3. Linux常用命令介绍-文档编辑

    cat命令 - 在终端设备上显示文件内容 cat命令来自英文词组concatenate files and print的缩写,其功能是在终端设备上显示文件内容.在Linux系统中有很多用于查看文件内容 ...

  4. C#判断当前时间是否在规定时间段范围内(二维数组超简版)

    直接上C#代码 TimeSpan nowTime = DateTime.Now.TimeOfDay; string[,] arr = { { "7:50", "8:10& ...

  5. Manifest V3 getBackgroundPage() 返回 undefined 或报错 You do not have a background page. 的巨坑

    省流:无解了,老老实实  sendMessage罢 这件事挺奇怪的,因为我看官方文档就是这么写的,也没什么特别说明,版本也是最新的,就挺奇怪的-- 在翻了一大圈,之后看到了这篇帖子: 意思就是说,ap ...

  6. 【2020.11.19提高组模拟】二次剩余two 题解

    [2020.11.19提高组模拟]二次剩余two 题解 题目描述 有\(n\)个二次函数,每个二次函数可以用两个值\(m,k\)描述: \[f(x)=(x-m)^2+k \] 现在有\(q\)次操作: ...

  7. dev-cpp简单使用教程

    最近在准备蓝桥的比赛,而蓝桥要用dev-cpp,但自己第一次接触,不太会用.防止大家出现和我一样的问题,所以简单分享一下如何使用 1.打开软件界面,弹窗只是一些使用技巧,直接关闭就好 2.文件-新建文 ...

  8. k8s service访问偶发超时问题

    问题现象 在某个集群节点上的服务访问service服务:端口,会出现偶发timeout的问题,集群有的节点不会出现访问timeout的问题 问题处理 查看bridge-nf-call-iptables ...

  9. 关于ChatmoneyAI的讨论

    本文由 ChatMoney团队出品 最近ChatmoneyAI团队"打鸡血"似的全力开发,更新频繁到备受同行关注,那今天我们来浅谈一下ChatmoneyAI.它之所以能被认可,并不 ...

  10. 从排查ip不合法,到发现自己拖延,自欺的问题

    现象: 我调用推送接口,接口提示 ip地址不合法,服务器调用的接口ip需要在第三方平台上设置,调用提示 ip 错误 我将自己的出口ip地址配置到了第三方平台上,出口ip地址可以通过在服务器上面执行 c ...