news 2026/9/19 12:13:56

Locust 2.36 至 2.46 版本演进全解析:从新增用户类型到 OpenTelemetry 可观测性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Locust 2.36 至 2.46 版本演进全解析:从新增用户类型到 OpenTelemetry 可观测性

Locust 2.36 至 2.46 版本演进全解析:从新增用户类型到 OpenTelemetry 可观测性

【免费下载链接】locustWrite scalable load tests in plain Python 🚗💨项目地址: https://gitcode.com/gh_mirrors/lo/locust

本指南以仓库根目录 CHANGELOG.md 为骨架,系统梳理 Locust 自 2.36.0(2025-04)到 2.46.3(2026-08)的核心演进脉络,并结合 locust/ 目录下的源码实现进行佐证。读完本文,你将掌握:新增的协议类用户(DNS/MQTT/Socket.IO/Milvus/Qdrant)如何接入使用、--processes多进程模式与 CSV 统计的配合约束、--otel参数背后的 OpenTelemetry 埋点原理,以及若干关键性能与正确性修复的来龙去脉。

版本总览与发布节奏

从变更日志可以看到,Locust 在约 16 个月内发布了从 2.36.0 到 2.46.3 的十余个版本,节奏大约为每月一个或两个版本,其中包含若干次要版本(patch)与功能版本(minor)。这一阶段同时完成了 Python 版本支持范围的调整:

  • 2.41.6 正式支持并测试 Python 3.14(PR #3235 所述内容);
  • 2.44.0 修复了FastHttpUser在 Python 3.13+ 上的崩溃问题;
  • 2.46.0 支持 Python 3.15 测试并移除 Python 3.10 支持(见 2.46.1 的 "Remove support for Python 3.10");
  • 2.40.0 起 Dockerfile 基础镜像升级为 Python 3.13。

如果你需要判断升级影响面,建议结合官方发布说明(CHANGELOG 首行指向的 releases 页面)与本文下述各功能模块逐一核对。

新增用户类型:从 HTTP 走向全协议

2.36 至 2.46 期间,Locust 的contrib目录持续扩充,从纯 HTTP 压测工具演化为多协议压测平台。以下新用户类型均已在源码中确认存在:

用户类型引入版本源码位置适用场景
MarkovTaskSet2.38.0locust/user/markov_taskset.py用马尔可夫链描述用户行为序列,模拟有状态、有转移概率的用户旅程
SocketIOUser2.39.0locust/contrib/socketio.py对 Socket.IO 服务进行压测,支持实时双向通信场景
MilvusUser2.39.0locust/contrib/milvus.py向量数据库 Milvus 检索/写入压测
DNSUser2.42.0locust/contrib/dns.py基于 dnspython 的 DNS 查询压测
MqttUser2.41.0locust/contrib/mqtt.pyMQTT 消息压测(含规避 paho 连接数上限的机制)
QdrantUser2.43.4locust/contrib/qdrant.py向量数据库 Qdrant 压测
FastHttpUser已有(持续增强)locust/contrib/fasthttp.py基于 geventhttpclient 的高性能 HTTP 压测

DNSUser为例,其设计思路是把 dnspython 的dns.query方法封装为可统计的客户端:

class DNSUser(User): abstract = True def __init__(self, environment): super().__init__(environment) self.client = DNSClient(environment.events.request)

使用方式非常直观——在任务方法内构造 DNS 消息后调用self.client.udp(...)self.client.https(...)等方法(参考 examples/dns_ex.py):

import dns.message import dns.rdatatype from locust import User, task class MyDNSUser(DNSUser): @task def resolve(self): message = dns.message.make_query("example.com", dns.rdatatype.A) self.client.udp(message, "1.1.1.1")

MqttUser在 2.42.2 中还修复了client_idprotocol未正确传递给底层 Client 的问题(PR #3252 下的mqtt/milvus/qdrant/socketio/目录中找到完整可运行的 locustfile。

多进程模式(--processes)与 CSV 统计的约束演进

--processes允许在单机启动多个 worker 进程模拟分布式压测,其用法在 locust/argument_parser.py 中有所说明:

locust --headless -u 100 -t 20m --processes 4 MyHttpUser AnotherUser

这一阶段围绕该模式做了多处修复,理解这些约束对实操至关重要:

  • --csv-full-history--processes互斥(2.45.0):worker 进程不再支持--csv-full-history,并在 2.46.0 中把该校验前移到进程 fork 之前,避免 fork 后才发现参数非法(PR #3461)。
  • --print-stats不再导致所有 worker 重复打印统计(2.43.4):使用--processes创建的子进程会被取消print_stats设置,避免每个 worker 各自输出一份统计(PR #3353)。
  • 2.46.3 修复了--processes下 worker 使用--csv-full-history直接崩溃的问题(issue #3428),并在 2.46.0 中显式关闭 CSV 文件句柄后再退出。

此外,--run-time在 2.41.3 中改为由 worker 正确忽略(PR #3230),即运行时长只由 master 控制,避免 worker 各自提前结束。2.37.12 还修复了大规模 worker(如 1279 实例)导致 master CPU 100% 的问题,并尝试在 master 侧提升打开文件数上限(RLIMIT_NOFILE)。

Web UI 与命令行体验改进

统计展示与交互修复

  • RPS 显示一致性(2.45.0):修复current_rpstotal_rps不一致导致的 RPS 显示异常(PR #3455);2.43.4 同步修复 HTML 报告与导航栏使用current_rps而非total_rps的问题(PR #3384)。
  • Failures 表新增首次/末次出现时间戳(2.44.0,PR #3403)。
  • 图表缩放滑块修复(2.37.14)、失败表排序不再被重置(2.38.0)、详情页在测试启动后立即切换(2.37.5)。
  • Host 字段校验增强(2.37.7/2.37.9/2.37.11/2.38.0):Web UI 对缺失或非法 Host 持续给出警告;2.45.0 同时修复了is_url把无主机名的http://误判为合法 URL 的问题(PR #3439)。
  • 分布式模式下无 worker 连接时阻止提交 Swarm 表单(2.37.2)。
  • 重置按钮在停止运行后失效的问题(2.42.0 修复)。

自定义参数与表单

  • 列表型自定义参数(2.38.0,PR #3181)与Web UI 多选下拉(2.42.4,PR #3261)——对应 issue #3260 "Multiple select in web UI for custom arguments"。
  • --profile冲突修复(2.38.0):修复 argparse 中--profile选项与 locust-cloud 依赖冲突导致的ArgumentError
  • 编辑测试时保留自定义参数值(2.46.1,PR #3469)。
  • 2.36.0 的 "Web UI: Add profile field" 与 "Web UI: Optionally Extend Advanced Options" 引入了 profile 输入与高级选项展开能力。

命令行与配置解析

  • 拼写错误提示(2.41.0):输错命令行参数时给出 "Did you mean ..." 建议。
  • 配置解析重构(2.43.0):parse_options被重构(PR #3310);2.42.2/2.42.3/2.42.6 连续修复.conf文件被误判为 TOML 的问题(单行 conf、TOML 解析器误调用等),并在 2.46.0 修复了parse_options()通过print()而非warnings.warn(DeprecationWarning)发出弃用警告的问题。
  • --headless配置项失效修复(2.42.6):修复 conf 文件中headless = true不生效的回归。

OpenTelemetry 可观测性:从埋点到独立镜像

OpenTelemetry 支持是这一阶段最重要的基础设施能力,演进脉络清晰:

  • 2.42.4 添加--otel标志(PR #3278),并新增 otlp HTTP exporter 依赖;
  • 2.42.5/2.42.6 完善启用日志与初始化逻辑;
  • 2.44.1 增加 OTEL 日志导出(PR #3421),并在 Resource 中补充hostnamelocustfileprofile属性(PR #3420);
  • 2.44.2 新增locust.client.duration响应时间直方图(PR #3424);
  • 2.43.4 提供包含 OpenTelemetry 依赖的locust-otelDocker 镜像(PR #3379。

从 locust/opentelemetry.py 源码可见其设计要点:

  • 通过setup_opentelemetry(locustfile, profile)初始化,若未安装 SDK 会提示pip install locust[otel]
  • 通过OTEL_TRACES_EXPORTEROTEL_METRICS_EXPORTEROTEL_LOGS_EXPORTER三个环境变量控制导出器,全部为none时不启用;
  • Resource 携带service.name(默认locust)、service.versionhost.namefilename(locustfile)、profile等属性;
  • 指标侧注册了两个核心可观测项:locust.client.duration(响应时间直方图,单位秒,由events.request监听器驱动)与locust.users.count(当前活跃用户数可观测仪表,仅由 master 上报,避免各 worker 重复计数);
  • 追踪侧支持 OTLP gRPC 与 HTTP/protobuf 两种协议,并支持 console exporter 调试。

运行方式示例:

# 安装带 otel 扩展的版本 pip install locust[otel] # 使用 OTLP 导出(默认 grpc,可用 OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf 切换) locust -f locustfile.py --headless -u 100 -r 10 --otel \ --host https://example.com

文档方面,2.42.6 新增了 docs/telemetry.rst(OTel 文档),2.42.1 把 VS Code 扩展与 Kubernetes Operator 纳入文档体系(docs/vscode-extension.rst、docs/kubernetes-operator.rst)。

统计引擎的正确性修复:响应时间百分位与 URL 性能

百分位被 None 拉低的问题(2.46.2)

2.46.2 修复了一个隐蔽的统计缺陷:get_response_time_percentileresponse_time=None(异步/失败请求)计入了分母,导致所有报告的百分位被系统性拉低(issue #3472 中有对应回归测试test_percentile_with_none_response_times

def test_percentile_with_none_response_times(self): s = StatsEntry(self.stats, "percentile_test", "GET") # 记录若干 None 响应时间后,百分位结果不受影响 ... self.assertEqual(s.get_response_time_percentile(0.5), 50)

/stats/requests 端点性能(2.37.2)

针对 "p95 响应时间随唯一 URL 数量增加而劣化" 的问题(issue #3134),2.37.2 优化了/stats/requests端点的实现(PR #3136),对 URL 数量庞大的场景提升显著。

其他统计相关修复

  • 2.44.0 提取了可覆写的响应时间分桶函数(PR #3373),便于用户自定义统计粒度;
  • 2.46.0 修复proper_round对整数输入在digits > 0时结果错误的问题(PR #3431);
  • 2.46.0 修复_aggregate_dispatched_users中的变量遮蔽问题(PR #3484)。

客户端与协议层的健壮性修复

FastHttpUser 系列

FastHttpUser是这一阶段修复最密集的组件(源码见 locust/contrib/fasthttp.py):

  • Python 3.13+ 崩溃修复(2.44.0):GC 回收__dict__引用环导致on_request()缺少 4 个位置参数(issue #3388);同时捕获响应体读取阶段的FAILURE_EXCEPTIONS
  • gzip 截断流处理(2.44.0):高负载下截断的 gzip 流会抛zlib.error,现已捕获处理(PR #3405);
  • 308 重定向支持(2.44.0):redirect_resonse_codes加入 308(PR #3406);
  • iter_lines流式响应(2.43.0,PR #3311):解决 issue #3018,为FastHttpUser补齐逐行读取流式响应的能力;
  • zstd 编码(2.38.1):不再在Accept-Encoding中发送 zstd,规避兼容性问题;
  • 响应对象不再被多余包裹(2.40.5):快速响应场景跳过不必要的上下文管理器包裹,减少开销。

HttpUser / ResponseContextManager

  • 2.40.2 重构了ResponseContextManager并修复 Python 3.13 下request_meta缺失'name'键的KeyError(PR #3210);
  • 2.40.3 让raise_for_status()正确考虑failure()/success()的显式调用(PR #3217);
  • 2.40.0 避免 requests 丢失请求追踪时的异常(PR #3201);
  • 2.37.2 修复FastResponse.failure()参数数量错误(issue #3084)。

依赖与 Python 版本策略

  • 2.43.0 支持requests>=2.32.5,重新实现 SSL 证书只加载一次的修复,兼容 LangChain/AI 生态(PR #3316);
  • 2.42.0 避免使用最新版 python-requests 以防止性能回退(PR #3244);
  • 2.46.1/2.38.0 放宽 gevent 版本约束,同时规避损坏版本;
  • 2.41.6 正式支持 Python 3.14;2.46.0 起测试覆盖 Python 3.15,2.46.1 移除 Python 3.10。

pytest 集成与 locustfile 生态

  • pytest 风格 locustfile(2.40.0,PR #3200):支持直接把 pytest 用例当作 locustfile 运行;
  • pytest 插件独立目录(2.40.1):插件迁移至独立的 pytest_locust/plugin.py,延迟导入避免 gevent monkey patch 在未使用 fixture 时生效,并规避 pytest 风格 locustfile 捕获键盘输入的问题(2.40.4);
  • --host选项冲突(2.41.2):插件工作区避免与用户自定义--host参数冲突(issue #3227);
  • --json-file导出(2.37.0/2.37.1/2.37.10):新增把 JSON 结果写入文件的命令行选项(PR #3124),并修复其总是生成空文件的问题(PR #3131)。

其他值得关注的变更

  • 停止测试的新方式(2.43.0):允许通过抛出StopTest停止测试运行,并在 locustfile 缺少 host 且未传--host时使用该机制(PR #3313);
  • --class-picker行为澄清(2.46.0):修正 class-picker 下json()方法的文档示例与行为说明(PR #3459);
  • worker 忽略--run-time(2.41.3):见前述多进程模式小节;
  • AI 优化文档(llms.txt)(2.44.0):新增面向 LLM/AI 工具检索优化的文档产物,实现位于 docs/_ext/llms_txt.py;
  • Azure Load Testing 支持文档(2.44.1):在 docs/hosted-load-testing.rst 增加托管负载测试说明,2.44.2 补充了 Azure Load Testing 调用横幅;
  • timespan解析严格化(2.44.4):拒绝部分匹配的时间跨度字符串(PR #3425)。

升级建议与要点总结

基于本阶段变更日志与源码,升级时建议重点关注以下五点:

  1. Python 版本:2.46.x 系列已移除 Python 3.10 支持,若仍在 3.10 环境运行请先升级解释器;Python 3.13/3.14/3.15 均为受支持目标。
  2. --processes组合参数:避免与--csv-full-history同用(会报错或崩溃),且注意子进程不再受--print-stats影响。
  3. 可观测性升级:如需接入监控体系,--otel是推荐入口,可配合 Dockerfile.otel 镜像与 docs/telemetry.rst 文档快速落地;注意活跃用户指标仅由 master 上报。
  4. 统计口径:2.46.2 修正了百分位统计分母,升级后 p50/p95/p99 数值可能与旧版本略有差异,属预期行为。
  5. 新用户类型:压测对象为 DNS、MQTT、Socket.IO、Milvus、Qdrant 时,可直接使用对应 contrib 用户类,无需自行封装客户端;对应示例见 examples/ 目录。

以上全部功能点均可在当前仓库的源码、测试与文档中得到印证,如需深入某个模块,可继续阅读 locust/argument_parser.py(全部 CLI 参数)、locust/stats.py(统计引擎)、locust/opentelemetry.py(OTel 埋点)与 locust/test/ 下的对应测试。

【免费下载链接】locustWrite scalable load tests in plain Python 🚗💨项目地址: https://gitcode.com/gh_mirrors/lo/locust

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 12:11:32

Python解析PDF:人教版小学古诗词结构化入库实战

简介:这份PDF汇总了最新人教版小学语文1至6年级全部古诗词与日积月累内容,面向小学语文教师、家长及需要系统梳理小学阶段古诗文的学习者,可解决逐册翻找、版本不一、复习无纲的问题。资源包共1个PDF文件,约72KB,按年级…

作者头像 李华
网站建设 2026/9/19 12:09:56

PY32F005:小封装低功耗Cortex-M0+ MCU选型与开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 12:09:12

拯救者Y9000P 2022装Ubuntu22.04双系统避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 12:07:50

Claude Code Agent 实战:TaoToken 跑通一个 Python 仓库的单元测试修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 12:06:54

Manus 用 COKE 框架搭智能体,Base URL 填 TaoToken 的 API

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华