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 压测工具演化为多协议压测平台。以下新用户类型均已在源码中确认存在:
| 用户类型 | 引入版本 | 源码位置 | 适用场景 |
|---|---|---|---|
MarkovTaskSet | 2.38.0 | locust/user/markov_taskset.py | 用马尔可夫链描述用户行为序列,模拟有状态、有转移概率的用户旅程 |
SocketIOUser | 2.39.0 | locust/contrib/socketio.py | 对 Socket.IO 服务进行压测,支持实时双向通信场景 |
MilvusUser | 2.39.0 | locust/contrib/milvus.py | 向量数据库 Milvus 检索/写入压测 |
DNSUser | 2.42.0 | locust/contrib/dns.py | 基于 dnspython 的 DNS 查询压测 |
MqttUser | 2.41.0 | locust/contrib/mqtt.py | MQTT 消息压测(含规避 paho 连接数上限的机制) |
QdrantUser | 2.43.4 | locust/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_id与protocol未正确传递给底层 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_rps与total_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 中补充
hostname、locustfile、profile属性(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_EXPORTER、OTEL_METRICS_EXPORTER、OTEL_LOGS_EXPORTER三个环境变量控制导出器,全部为none时不启用; - Resource 携带
service.name(默认locust)、service.version、host.name、filename(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_percentile把response_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)。
升级建议与要点总结
基于本阶段变更日志与源码,升级时建议重点关注以下五点:
- Python 版本:2.46.x 系列已移除 Python 3.10 支持,若仍在 3.10 环境运行请先升级解释器;Python 3.13/3.14/3.15 均为受支持目标。
--processes组合参数:避免与--csv-full-history同用(会报错或崩溃),且注意子进程不再受--print-stats影响。- 可观测性升级:如需接入监控体系,
--otel是推荐入口,可配合 Dockerfile.otel 镜像与 docs/telemetry.rst 文档快速落地;注意活跃用户指标仅由 master 上报。 - 统计口径:2.46.2 修正了百分位统计分母,升级后 p50/p95/p99 数值可能与旧版本略有差异,属预期行为。
- 新用户类型:压测对象为 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),仅供参考