新闻详情

新闻详情

首页 / 资讯中心 / 详情

k6 v1.4.0 版本解析:OpenTelemetry 输出稳定化、Browser 模块网络控制与自动扩展解析重构

发布时间:2026/9/11 9:01:39来源:尧图网络
k6 v1.4.0 版本解析:OpenTelemetry 输出稳定化、Browser 模块网络控制与自动扩展解析重构
k6 v1.4.0 版本解析OpenTelemetry 输出稳定化、Browser 模块网络控制与自动扩展解析重构【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6k6v1.4.0是负载测试工具 k6 的一个重要里程碑版本OpenTelemetry 输出从 experimental 状态正式毕业为稳定输出浏览器模块新增page.waitForRequest、page.unroute/page.unrouteAll、locator.evaluate/locator.evaluateHandle等网络控制与页面上下文执行能力同时自动扩展解析机制被彻底重写。本文基于当前仓库的发布说明与源码实现逐项梳理这些变更的用法、迁移路径与底层原理帮助你快速评估升级影响并迁移现有测试脚本。Breaking changes升级前必须了解的三类破坏性变更依据 k6 的稳定性保证stability guarantees跨 minor 版本的破坏性变更只允许出现在 experimental 功能上。v1.4.0 的破坏性变更分为两类。OpenTelemetry 输出的两处破坏性变更**1. Rate 指标导出方式变更#5164源码中根据值是否为零分别设置valueType zero或valueType nonzeroregistry.go 的注释也解释了设计意图——k6 的 rate 指标记录的是非零值出现的频率因此用单一 counter 加条件标签来表达语义更准确、指标更精简。如果你的下游告警或仪表盘依赖旧的独立 rate 指标名需要在升级后同步调整查询。**2. 导出器类型配置弃用#5333 中新配置项定义为// ExporterProtocol sets the protocol of OpenTelemetry Exporter to use ExporterProtocol null.String json:exporterProtocol envconfig:K6_OTEL_EXPORTER_PROTOCOL该配置只接受两个合法值config.go 与校验逻辑 validateExporterProtocol协议值说明grpc使用 gRPC 导出器默认端点localhost:4317默认值http/protobuf使用 HTTP/Protobuf 导出器默认端点localhost:4318默认路径/v1/metrics校验逻辑还会根据协议检查对应端点gRPC 要求K6_OTEL_GRPC_EXPORTER_ENDPOINT非空HTTP 要求K6_OTEL_HTTP_EXPORTER_ENDPOINT非空且不能带http:///https://scheme只能填 host:port。若传入非法值会返回unsupported exporter protocol %q, only grpc and http/protobuf are supported的错误config_test.go 中有对应测试用例。配置解析走envconfig的K6_OTEL_前缀合并顺序为 JSON 配置 → 环境变量 → 校验见 GetConsolidatedConfig。自动扩展解析行为的破坏性变更#5320、#5239、#5342自动扩展解析automatic extension resolution现在只检查 ES module 的import语句不再支持 CommonJSrequire()调用。原因在于require()是动态的——k6 无法确定它是否会被调用、也无法确定是否用静态字符串调用而这正是此前唯一能加载的方式。这属于旧实现的一个怪癖quirk带来了大量问题因此 v1.4.0 直接移除。与此同时use k6指令现在只在文件开头被识别允许前置可选的 shebang、空白与注释。这本来是原始设计意图但因实现 bug 未能如实生效。仓库中 internal/cmd/launcher.go 的findDirectives解析逻辑与 launcher_test.go 中的多组测试涵盖带约束版本、重复指令、//等版本约束语法可验证该行为internal/cmd/test_load.go 也注释说明了解析顺序要求。迁移提示如果脚本中通过require(k6/x/...)依赖扩展自动解析请改为import语句如果use k6 with ...指令写在文件中部请将其移到文件开头可保留前置注释与空行。New features新特性逐个解读OpenTelemetry 输出正式毕业#5334OpenTelemetry 输出从 experimental 毕业成为名为opentelemetry的稳定输出也是 k6 官方推荐的厂商无关vendor-agnostic遥测导出方案。使用方式如下# 旧的 experimental 用法仍兼容但已弃用未来可能移除 k6 run --out experimental-opentelemetry script.js # 新的稳定用法 k6 run --out opentelemetry script.js在仓库的 internal/cmd/builtin_output_gen.go 中experimental-opentelemetry与opentelemetry两个名字同时注册在输出列表中正是向后兼容的实现证据。建议新脚本直接使用opentelemetry名称。结合源码该输出还支持一套完整的配置项见 internal/output/opentelemetry/config.go 与默认值 newDefaultConfig常用的环境变量如下环境变量默认值说明K6_OTEL_SERVICE_NAME/OTEL_SERVICE_NAMEk6导出指标的 service 名K6_OTEL_SERVICE_VERSIONk6 库版本service 版本K6_OTEL_METRIC_PREFIX空指标名前缀如k6_K6_OTEL_EXPORTER_PROTOCOLgrpc导出协议grpc或http/protobufK6_OTEL_GRPC_EXPORTER_ENDPOINTlocalhost:4317gRPC 导出端点K6_OTEL_GRPC_EXPORTER_INSECUREfalse是否禁用 gRPC TLSK6_OTEL_HTTP_EXPORTER_ENDPOINTlocalhost:4318HTTP 导出端点无 schemeK6_OTEL_HTTP_EXPORTER_URL_PATH/v1/metricsHTTP 导出路径K6_OTEL_HTTP_EXPORTER_INSECUREfalse是否禁用 HTTP TLSK6_OTEL_EXPORT_INTERVAL10s指标导出间隔K6_OTEL_FLUSH_INTERVAL1s指标冲刷间隔K6_OTEL_HEADERS空W3C Correlation-Context 格式的自定义头k1v1,k2v2K6_OTEL_TLS_INSECURE_SKIP_VERIFYfalse跳过服务端证书链校验K6_OTEL_TLS_CERTIFICATE空根 CA 证书文件路径K6_OTEL_TLS_CLIENT_CERTIFICATE/K6_OTEL_TLS_CLIENT_KEY空客户端证书PEM与私钥路径K6_OTEL_HTTP_EXPORTER_USERNAME/K6_OTEL_HTTP_EXPORTER_PASSWORD空HTTP Basic Auth仓库还提供了一个完整的端到端示例 examples/docker-compose/opentelemetry其中 README.md 展示了将 k6 指标经 OTEL Collector 转发到 Prometheus、再用 Grafana 可视化的完整链路docker-compose up -d # 启动 OTEL Collector Prometheus Grafana K6_OTEL_GRPC_EXPORTER_ENDPOINTlocalhost:4317 \ K6_OTEL_GRPC_EXPORTER_INSECUREtrue \ K6_OTEL_METRIC_PREFIXk6_ \ k6 run --tag testid1 -o experimental-opentelemetry script.js示例仓库中该 README 仍使用旧名称实际运行可直接换成-o opentelemetry。随后可访问http://localhost:3000/d/demo-uid/k6-opentelemetry-prometheus查看 k6 压测仪表盘。浏览器模块page.waitForRequest#5330Browser 模块新增page.waitForRequest()用于等待匹配指定 URL 模式的 HTTP 请求发出特别适合必须确认某个网络请求已发起后才能继续测试动作的场景。它支持多种匹配策略// 精确 URL 匹配 const requestPromise page.waitForRequest(https://api.example.com/data); await page.click(button[data-testidload-data]); const request await requestPromise; // 正则模式匹配 await page.waitForRequest(/\/api\/.*\.json$/); // 与 Promise.all 配合实现先等待请求、再触发动作的协调操作 await Promise.all([ page.waitForRequest(https://api.example.com/user-data), page.click(button[data-testidload-user-data]) ]);底层实现上JS 映射层 page_mapping.go 会把 URL 参数按类型处理——字符串加引号、正则/数字/布尔保持原样——并支持timeout选项毫秒parsePageWaitForRequestOptions默认取页面超时核心逻辑 Page.WaitForRequest 则在带超时的 context 下监听PageEventRequest事件用正则匹配器比对请求 URL。这与已有的page.waitForResponse()形成互补一个聚焦请求、一个聚焦响应让网络相关场景的控制粒度更细。浏览器模块page.unroute(url)与page.unrouteAll()#5223用于移除之前通过page.route注册的路由。注意unroute(url)的 URL 参数必须与route调用时完全一致。await page.route(/.*\/api\/pizza/, function (route) { console.log(Modifying request to /api/pizza); route.continue({ postData: JSON.stringify({ customName: My Pizza }), }); }); // ...测试逻辑... await page.unroute(/.*\/api\/pizza/); // URL 必须与 route 注册时完全一致unrouteAll()则一次性清空所有路由await page.route(/.*\/api\/pizza/, function (route) { /* ... */ }); // ...测试逻辑... await page.unrouteAll();映射层实现位于 page_mapping.go对应核心方法为 Page.Unroute 与 Page.UnrouteAll。典型用途在测试中途切换拦截策略——先路由拦截、断言后解除或在不同阶段复用同一页面加载不同的 mock 数据。浏览器模块locator.evaluate与locator.evaluateHandle#5306这两个方法允许你在页面上下文中执行 JavaScript 代码且能访问到与 locator 匹配的元素。二者唯一区别是evaluateHandle返回 JSHandle可继续链式操作。// 在页面上下文中读取元素文本 await check(page, { calling evaluate: async p { const n await p.locator(#pizza-name).evaluate(pizzaName pizzaName.textContent); return n Our recommendation:; } }); // 带额外参数调用 await check(page, { calling evaluate with arguments: async p { const n await p.locator(#pizza-name).evaluate( (pizzaName, extra) pizzaName.textContent extra, Super pizza! ); return n Our recommendation: Super pizza!; } });evaluateHandle的链式用法示例const jsHandle await page.locator(#pizza-name).evaluateHandle((pizzaName) pizzaName); const obj await jsHandle.evaluateHandle((handle) { return { innerText: handle.innerText }; }); console.log(await obj.jsonValue()); // {innerText:Our recommendation:}从源码看locator 的映射层在 locator_mapping.go底层通过 Frame.evaluateHandleWithSelector 先解析选择器拿到元素句柄再在页面上下文执行函数locator.go的 evaluate 实现 复用了同一路径。帧frame与 JSHandle 也各自暴露了evaluateHandle见 frame_mapping.go、js_handle_mapping.go可灵活组合。新增官方支持的 k6 DNS 扩展xk6-dnsxk6-dns扩展成为 k6 OSS 与 k6 Cloud 官方支持的扩展。得益于自动扩展解析automatic extension resolution无需自定义构建直接在脚本中import即可import dns from k6/x/dns; export default function () { const answer dns.resolve(grafana.com, { recordType: A }); console.log(answer.records.map(({ address }) address).join(, )); }典型应用场景包括通过自定义或系统 DNS 解析域名、测量解析延迟与错误、在 HTTP 步骤前校验 DNS 记录、对比不同解析器、甚至对 DNS 服务器做端到端压测。目前扩展支持 A 与 AAAA 两种记录类型。自动扩展解析全面重写#5320、#5239、#5342、#5332、#5240自动扩展解析被完全重写从外部k6deps/esbuild 管线迁移到 k6 内部模块加载器显著提升了可靠性与可维护性。重写过程中还发现并修复了若干历史问题不再追踪require调用由于require的动态特性是否被调用、是否用静态字符串调用都不确定解析极不稳定且对字符串变量场景完全无效。CommonJS 支持主要出于向后兼容经内部讨论后决定在自动扩展解析中完全不支持如果社区反馈强烈可能在 v2 之前恢复但长期来看不会作为 k6 的一部分。use k6指令只在文件开头解析此前会从整个文件中解析指令导致诸多问题。现在只解析文件开头主文件与所有被解析文件均如此允许前置空行与注释。指令写法的两个示例分别配合 ESM 与 CommonJS// main.js use k6 with k6/x/faker import { faker } from k6/x/faker; import { helper } from ./utils.js; export default function() { console.log(faker.name()); helper(); }// utils.js use k6 with k6/x/redis const redis require(k6/x/redis); exports.helper function() { // Use redis extension }上例中k6 会从两个文件的use k6指令中同时检测出k6/x/faker与k6/x/redis并按需构建包含这两个扩展的二进制。仓库中的解析与测试证据见 launcher.go含findDirectives与约束解析与 launcher_test.go覆盖、、、等版本约束写法。重写还顺带修复了三类问题Windows 路径问题#5176修复跨盘符等路径相关 bug其他操作系统上可能也存在未上报的问题语法错误未被正确报告#5127、#5104此前底层 esbuild 解析失败但未被妥善处理子进程退出码传递现在可以正确传播运行新 k6 的子进程退出码让脚本能依据退出码判断结果。UX 改进与其他增强QueryAll方法按 DOM 顺序返回元素#5307感谢 shota3506此前返回顺序不保证现在与页面文档顺序一致断言更可预期。简化旧配置文件警告信息#5159。显式标注选项默认值#5343k6 run --help等帮助输出中直接标明默认值。Bug fixes 一览#5242 修复 Windows 上浏览器测试的清理错误#5246 修复从 stdin 读取 TypeScript 源码的支持#5322 修复browser.newPageInContext在不存在的浏览器上下文中创建页面的 bug。维护与内部改进要点浏览器模块是本次维护重点事件监听内部机制被重构#5315、#5311k6ext.Promise与 Sobek 被迁移到映射层#5347、#5349、#5302、#5244模式匹配器pattern matcher#5314与选择器解析#5207得到重构locator.go也去掉了间接层#5247。其他值得注意的变更Prometheus Remote-Write 输出配置解析迁移到envconfig#5184最低 Go 版本提升到 1.24#5304require调用改为在模块初始加载阶段统一报告而非每个 VU 每次调用时报告#5331项目新增 WinGet 支持#5203、#5201UUID 库从 gouuid 切换到 google/uuid#5220依赖整体更新#5355 及一批相关 PR。升级建议小结OpenTelemetry 用户将-o experimental-opentelemetry迁移为-o opentelemetry把K6_OTEL_EXPORTER_TYPE换成K6_OTEL_EXPORTER_PROTOCOLgrpc或http/protobuf检查依赖旧 rate 独立指标的告警/仪表盘改查带zero/nonzero条件标签的单一计数器。浏览器测试脚本若依赖QueryAll的返回顺序注意其现在遵循 DOM 顺序新脚本可立即使用waitForRequest、unroute/unrouteAll、locator.evaluate/evaluateHandle。使用扩展的脚本将require(k6/x/...)改为import把use k6 with ...指令移到文件开头允许前置 shebang、空白与注释Windows 上跨盘符路径问题已修复可升级验证。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

100G UDP协议栈FPGA移植实战:从CMAC配置到上板打流 2026/9/11 9:55:49

100G UDP协议栈FPGA移植实战:从CMAC配置到上板打流

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

阅读更多 →
社区物资配送系统毕业设计:从需求到答辩的全流程指南 2026/9/11 9:55:49

社区物资配送系统毕业设计:从需求到答辩的全流程指南

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

阅读更多 →
用W55MH32打造桌面AI语音助手:从选型到调优全记录 2026/9/11 9:55:49

用W55MH32打造桌面AI语音助手:从选型到调优全记录

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

阅读更多 →
电商高并发场景下的Java技术栈实战与优化 2026/9/11 9:55:49

电商高并发场景下的Java技术栈实战与优化

1. 电商场景下的Java技术栈实战解析最近帮一位准备大厂面试的朋友复盘电商项目的技术方案,发现很多候选人对"电商全技术栈"的理解停留在表面。实际上,大厂面试官更关注技术选型背后的业务适配性。以商品秒杀场景为例,单纯说"用…

阅读更多 →
AutoGen 自定义代理与协作网络:企业级多 Agent 落地实战指南 2026/9/11 9:55:49

AutoGen 自定义代理与协作网络:企业级多 Agent 落地实战指南

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

阅读更多 →
双目视觉+激光测距原理与野外高精度应用解析 2026/9/11 9:52:48

双目视觉+激光测距原理与野外高精度应用解析

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞