
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.02025-04到 2.46.32026-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.14PR #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.102.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.pyimport 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.0worker 进程不再支持--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 #34552.43.4 同步修复 HTML 报告与导航栏使用current_rps而非total_rps的问题PR #3384。Failures 表新增首次/末次出现时间戳2.44.0PR #3403。图表缩放滑块修复2.37.14、失败表排序不再被重置2.38.0、详情页在测试启动后立即切换2.37.5。Host 字段校验增强2.37.7/2.37.9/2.37.11/2.38.0Web UI 对缺失或非法 Host 持续给出警告2.45.0 同时修复了is_url把无主机名的http://误判为合法 URL 的问题PR #3439。分布式模式下无 worker 连接时阻止提交 Swarm 表单2.37.2。重置按钮在停止运行后失效的问题2.42.0 修复。自定义参数与表单列表型自定义参数2.38.0PR #3181与Web UI 多选下拉2.42.4PR #3261——对应 issue #3260 Multiple select in web UI for custom arguments。--profile冲突修复2.38.0修复 argparse 中--profile选项与 locust-cloud 依赖冲突导致的ArgumentError。编辑测试时保留自定义参数值2.46.1PR #3469。2.36.0 的 Web UI: Add profile field 与 Web UI: Optionally Extend Advanced Options 引入了 profile 输入与高级选项展开能力。命令行与配置解析拼写错误提示2.41.0输错命令行参数时给出 Did you mean ... 建议。配置解析重构2.43.0parse_options被重构PR #33102.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 #34202.44.2 新增locust.client.duration响应时间直方图PR #34242.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、filenamelocustfile、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_PROTOCOLhttp/protobuf 切换 locust -f locustfile.py --headless -u 100 -r 10 --otel \ --host https://example.com文档方面2.42.6 新增了 docs/telemetry.rstOTel 文档2.42.1 把 VS Code 扩展与 Kubernetes Operator 纳入文档体系docs/vscode-extension.rst、docs/kubernetes-operator.rst。统计引擎的正确性修复响应时间百分位与 URL 性能百分位被 None 拉低的问题2.46.22.46.2 修复了一个隐蔽的统计缺陷get_response_time_percentile把response_timeNone异步/失败请求计入了分母导致所有报告的百分位被系统性拉低issue #3472 中有对应回归测试test_percentile_with_none_response_timesdef 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 #31342.37.2 优化了/stats/requests端点的实现PR #3136对 URL 数量庞大的场景提升显著。其他统计相关修复2.44.0 提取了可覆写的响应时间分桶函数PR #3373便于用户自定义统计粒度2.46.0 修复proper_round对整数输入在digits 0时结果错误的问题PR #34312.46.0 修复_aggregate_dispatched_users中的变量遮蔽问题PR #3484。客户端与协议层的健壮性修复FastHttpUser 系列FastHttpUser是这一阶段修复最密集的组件源码见 locust/contrib/fasthttp.pyPython 3.13 崩溃修复2.44.0GC 回收__dict__引用环导致on_request()缺少 4 个位置参数issue #3388同时捕获响应体读取阶段的FAILURE_EXCEPTIONSgzip 截断流处理2.44.0高负载下截断的 gzip 流会抛zlib.error现已捕获处理PR #3405308 重定向支持2.44.0redirect_resonse_codes加入 308PR #3406iter_lines流式响应2.43.0PR #3311解决 issue #3018为FastHttpUser补齐逐行读取流式响应的能力zstd 编码2.38.1不再在Accept-Encoding中发送 zstd规避兼容性问题响应对象不再被多余包裹2.40.5快速响应场景跳过不必要的上下文管理器包裹减少开销。HttpUser / ResponseContextManager2.40.2 重构了ResponseContextManager并修复 Python 3.13 下request_meta缺失name键的KeyErrorPR #32102.40.3 让raise_for_status()正确考虑failure()/success()的显式调用PR #32172.40.0 避免 requests 丢失请求追踪时的异常PR #32012.37.2 修复FastResponse.failure()参数数量错误issue #3084。依赖与 Python 版本策略2.43.0 支持requests2.32.5重新实现 SSL 证书只加载一次的修复兼容 LangChain/AI 生态PR #33162.42.0 避免使用最新版 python-requests 以防止性能回退PR #32442.46.1/2.38.0 放宽 gevent 版本约束同时规避损坏版本2.41.6 正式支持 Python 3.142.46.0 起测试覆盖 Python 3.152.46.1 移除 Python 3.10。pytest 集成与 locustfile 生态pytest 风格 locustfile2.40.0PR #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 #3459worker 忽略--run-time2.41.3见前述多进程模式小节AI 优化文档llms.txt2.44.0新增面向 LLM/AI 工具检索优化的文档产物实现位于 docs/_ext/llms_txt.pyAzure 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.pyOTel 埋点与 locust/test/ 下的对应测试。【免费下载链接】locustWrite scalable load tests in plain Python 项目地址: https://gitcode.com/gh_mirrors/lo/locust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考