用 Wrapture 揪出慢代码的真相
Finding Slow Code with Wrapture
在 Flask 应用中定位慢代码往往陷入困境:传统的计时器无法区分是自身慢还是子调用慢,而性能分析器又难以隔离特定请求。Graham Dumpleton 展示了 Wrapture 如何通过事件树结构,清晰分离 Self time(自身耗时)与总耗时。通过配置聚合收集器,不仅能分析单次请求的瓶颈,还能在多次运行中统计各路径的耗时分布。结合 annotate 功能,甚至可以按租户维度筛选慢请求,精准定位问题根源。
自身耗时是一个操作的持续时间减去其子操作所占用的时间,Wrapture 会在事件关闭时根据父链接计算这一数值。
- themgt
2025 年,每一位“精通多种编程语言和技术的资深软件开发者”:
目前我正处在休假期(微退休),正在考虑彻底退休。近年来 IT 行业经历了剧烈动荡……人工智能技术的飞速发展给寻求有意义工作机会的资深开发者带来了新挑战。
2026 年:
更便宜的表亲。上面提到的所有功能都保留了持续时间。有时答案只是一个数字,Counter 收集器在操作开始时计数,除此之外什么都不存,这让它足够便宜,可以留在一整套测试中运行。绑定数据库层的 execute 方法,注册一个计数器,并在 fixture 中给每个测试分配查询预算,这样经典的 N+1 回归问题就会带着一个具体的数字失败,而不是仅仅变慢却悄悄溜过测试。
- simonw
我对这个库非常兴奋。
Wrapture 是 Graham 的新项目,他之前开发了 wrapt(一个拥有 20 多年历史的 Python 猴子补丁库),并构建了 New Relic Python agent 的第一个版本——正是这个库让你的应用被插桩,从而让 New Relic 能展示它正在做什么。
Wrapture 提供了在同一套工具中同时模拟和插桩代码的能力。你可以在测试中使用它来检查“这个方法是否被调用过”或“当这个方法被调用时返回这些假数据”,也可以用它来插桩你的代码,测量哪些方法被调用以及耗时多久。
它可以在不修改现有 Python 代码的情况下对其进行插桩——你只需定义一个 TOML 文件,说明你想插桩哪些方法,Wrapture 就会为你动态打补丁。这意味着你可以插桩任何需要运行的 Python 代码而无需改动它,并将结果导出到 OpenTelemetry。
链接的文章是 Graham 关于此主题的一系列帖子之一。我建议从这里开始:https://grahamdumpleton.me/posts/2026/08/introducing-wraptur...
然后查看他刚发布的索引帖,其中链接了他的其他文章:https://grahamdumpleton.me/posts/2026/09/trying-out-wrapture...