k6 v0.47.0 版本发布说明解析gRPC 二进制元数据、Browser Cookie API 强化与废弃特性迁移指南【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6k6 v0.47.0 是一个以 gRPC 与浏览器模块能力跃升为核心的版本它让 gRPC 模块正式支持二进制元数据-bin后缀与反射请求元数据为 Browser 模块带来了更完整的 Cookie API 和page.on(console)事件同时引入了浏览器版 Docker 镜像、ARM64 镜像以及 Prometheus remote write 输出的新认证与自定义 Header 能力。读完本文你将掌握该版本全部新增特性的用法与代码示例、已废弃特性的替代方案以及 v0.48.0 即将落地的破坏性变更清单用于提前评估脚本与 CI/CD 的兼容性。一、Deprecations两个需要你关注的废弃项1. 内置 statsd 输出被废弃内置的statsdoutput 选项在 v0.47.0 起被标记为废弃官方建议改用社区维护的 xk6 扩展xk6-output-statsd关联跟踪 issue 为 #2982。这一废弃在源码中留下了明确的用户提示在 internal/cmd/outputs.go 中解析 output 参数时遇到statsd会直接返回类似 the statsd output was deprecated in k6 v0.47.0 … please use the new xk6 statsd output extension instead 的错误信息指向 xk6 扩展仓库。也就是说从 v0.47.0 开始它已被明确告知为过时并在后续版本v0.55.0中被彻底移除——如果你仍在使用k6 run --out statsd...应切换到 xk6 扩展的构建方式。2. 远程模块必须显式携带https://前缀加载远程模块remote modules时v0.47.0 起要求用户必须在 URL 前显式加上https://。在此之前的版本k6 会在缺失前缀时自动尝试补上https://去解析这个自动补全行为已被废弃并在下一个版本v0.48.0中完全移除。从源码结构看远程模块的解析逻辑由 js/modules/resolution.go 与 js/modules/require_impl.go 承担import/require一个不带协议前缀的字符串 URL 的行为变化正是这类解析路径中宽容处理逐步收紧的结果。如果你的测试脚本中有形如import x from raw.githack.com/...的裸主机名写法应在升级前统一改为import x from https://raw.githack.com/...。二、New features本版本的主要新增能力1. gRPC 支持二进制元数据-bin后缀k6/net/grpc与k6/experimental/grpc两个 gRPC 模块自 v0.47.0 起按照 gRPC 规范支持以-bin结尾的二进制元数据键let resp client.invoke(grpc.testing.TestService/EmptyCall, {}, { metadata: { X-Load-Tester-bin: new Uint8Array([2, 200]) } })规则是元数据键名以-bin结尾时其值必须是二进制类型如Uint8Array否则值必须是字符串否则解析报错。这一能力在当前仓库的 gRPC 参数实现中可以直接印证。internal/js/modules/k6/grpc/params.go 中的newMetadata函数负责把 JS 侧传入的metadata对象转换为 grpc-go 的metadata.MD遍历每个键值对时若键名strings.HasSuffix(hk, -bin)成立则要求值可导出为[]byte并直接以val string(binVal)存入这与 grpc-go 官方文档中二进制数据存 metadata的方式一致非-bin键则要求值可导出为string类型不匹配时分别返回%q value must be binary/%q value must be a string错误。对应的行为验证见 internal/js/modules/k6/grpc/client_test.go测试中构造了{ metadata: { X-Load-Tester-bin: new Uint8Array([2, 200]) } }的调用并断言服务端收到的md[x-load-tester-bin][0]恰为string([]byte{2, 200})——这同时说明元数据键在传输中会被规范化为小写与 gRPC 规范一致。该仓库还提供了完整的 gRPC 实战示例可参考examples/grpc_invoke.js、examples/grpc_reflection.js、examples/grpc_healthcheck.js。2. gRPC 反射请求支持reflectMetadata连接参数同一版本的另一项 gRPC 能力通过新增的连接参数reflectMetadata可以向反射reflection请求中附加元数据——这在反射服务需要鉴权头如内网服务要求携带身份 Header时非常实用。源码层面的解析逻辑同样在 internal/js/modules/k6/grpc/params.gonewConnectParams对reflect布尔值启用反射协议与reflectMetadata复用上述newMetadata解析两个键分别处理后者存入connectParams.ReflectionMetadata。internal/js/modules/k6/grpc/client_test.go 中的TestClientConnectionReflectMetadata用例给出了标准用法client.connect(GRPCBIN_ADDR, {reflect: true, reflectMetadata: {x-test: custom-header-for-reflection}})3. Grafana Cloud k6 的 Trend 指标精度提升Grafana Cloud k6 现在能够以最多 3 位小数精度存储和可视化 Trend 指标。这是云端的存储/可视化能力变化对本地 k6 脚本本身无侵入——但意味着你在云端看到的高精度百分位数值与本地终端 summary 的默认展示精度会有差异。4. 支持浏览器的 Docker 镜像k6 官方开始发布内置 Chromium 浏览器*-with-browser的 Docker 镜像使用 Browser APIk6/experimental/browser跑浏览器测试不再需要先安装 Chrome。这是把 Browser 测试纳入容器化 CI 的重要一步拉取带浏览器依赖的镜像、挂载或直连被测服务即可运行。仓库中的 examples/browser/ 目录收录了大量 Browser API 示例如 examples/browser/cookies.js、examples/browser/pageon.js可作为镜像内的现成脚本参考。5. ARM64 架构的 Docker 镜像k6 的发布流程新增了面向 ARM64 的专用 Docker 镜像构建与推送覆盖如 M 系列芯片 Mac、ARM 服务器等场景。6. Prometheus remote write 输出新认证方式与 HTTP Headers 环境变量实验性的 Prometheus remote write 输出xk6-output-prometheus-remote新增两种认证方式Bearer tokenTLS 证书并新增环境变量K6_PROMETHEUS_RW_HTTP_HEADERS以更便捷的方式为每次指标 flush 请求设置自定义 HTTP Header。在当前仓库中该环境变量已被上游吸收进prometheusrw输出的配置解析internal/output/prometheusrw/remotewrite/config.go 中存在对K6_PROMETHEUS_RW_HTTP_HEADERS的读取分支internal/output/prometheusrw/remotewrite/config_test.go 的测试用例验证了K6_PROMETHEUS_RW_HTTP_HEADERSX-Scope-OrgID:my-org-id,another-header:true,empty:这类逗号分隔的多 Header 定义可以覆盖旧方式。格式即Key:Value,Key2:Value2,...空值 Header 也合法。7. Browser 模块 Cookie API 全面升级v0.47.0 对 Browser 模块的 Cookie 处理做了稳定化重构来自 xk6-browser 的多个 PR#1008、#1030、#1005、#1016、#1031、#1040要点包括新增稳定的Cookie类创建与读取 Cookie 时统一使用该类型新增browserContext.cookies([urls])方法返回当前浏览器上下文的全部 Cookie并支持按 URL 过滤修复context.addCookie()添加 Cookie 时expires字段未正确设置的问题修复context.clearCookies()确保清空当前上下文的全部 Cookie。文档给出的完整示例可直接复制使用const context browser.newContext(); context.addCookies([ {name: foo, value: bar, url: https://test.k6.io}, {name: baz, value: qux, url: https://grafana.com}, ]); const cookies context.cookies(https://test.k6.io); console.log(cookies.length); // 1 console.log(cookies[0].name); // foo console.log(cookies[0].value); // bar context.clearCookies(); console.log(context.cookies.length); // 0注意其中 URL 过滤语义传入https://test.k6.io时只返回 1 条另一条属于https://grafana.com的 Cookie 被过滤掉——这为登录态预置pre-seed cookies类测试提供了可靠的上下文隔离手段。仓库中 examples/browser/cookies.js 提供了 Browser Cookie 操作的对照示例。8. 新增page.on(console)事件Browser 模块允许注册 handler在页面 JavaScript 上下文每次调用consoleAPI 时触发handler 参数由ConsoleMessage类定义可断言消息类型、文本与各参数值page.on(console, msg { check(msg, { assertConsoleMessageType: msg msg.type() log, assertConsoleMessageText: msg msg.text() this is a console.log message 42, assertConsoleMessageArgs0: msg msg.args()[0].jsonValue() this is a console.log message, assertConsoleMessageArgs1: msg msg.args()[1].jsonValue() 42, }); }); page.evaluate(() console.log(this is a console.log message, 42));配合 examples/browser/pageon.js、examples/browser/pageon-request.js 等示例这类事件钩子可以把前端页面的日志输出纳入自动化断言。三、UX improvements and enhancements支持 gRPC 反射协议 v1关联 xk6-grpc #48通过 REST API 执行setup和teardown时增加错误日志记录感谢贡献者 kmtym1998k6 version命令输出中增加构建的 commit 标识便于排查线上二进制与源码版本的对应关系*-with-browserDocker 镜像自动设置no-sandbox环境变量简化容器内 Chromium 的启动配置OpenTelemetry 更新后指标名称长度上限从 63 提升到 128注意从下一个版本v0.48.0起超出限制将直接报错向页面注入k6对象window.k6 {};便于在被测页面中识别当前环境为 k6 浏览器测试重构 examples/fillform.js 中的check使其与check的类型定义和文档保持一致。四、Bug fixes修复 gRPC 流在客户端发送完成后过早关闭的问题xk6-grpc #47支持 Google protobuf wrappers 包装类型xk6-grpc #49更新goja版本修复函数参数声明函数内再声明类时的编译器 bug修复添加/读取 Cookie 过程中的goja类型转换问题修复远程浏览器场景下的读写数据竞争边界问题修复page.reload与page.setContent应使用默认导航超时而非常规默认超时的问题修复设置page超时后未被实际使用的问题。五、Maintenance and internal improvements更新 xk6-grpc 至最新版把其累积的修复与改进带入实验性 gRPC 模块更新 golangci-lint 版本并新增interfacebloatlinter修复 CI 在新版本发布时未产出 SBOM 文件的问题更新 CI 构建二进制所用的 Go 版本更新goja包含运行时初始化加速与 source indexes 修复更新 k6 Docker 基础镜像所用的 alpine 版本xk6-browser 侧的测试修复、issue/PR 模板优化以及把int64超时统一重构为time.Duration避免毫秒/秒单位的歧义。六、Roadmap原生 ECMAScript Modules 支持与后续破坏性变更原生 ESM 支持计划 v0.49.0原生 ECMAScript Modules 支持epic issue #3265已被提上日程底层实现已有进展其中最关键的内部变更是移除 Babel——k6 此前依赖 Babel 把 ESM 代码转译为 CommonJS。移除后对用户意味着对象展开object spreadissue #824自动可用JavaScript 兼容性整体变好大型脚本的启动速度有望提升未来新增 JS 语法支持只需在底层 JS 引擎goja中支持即可维护成本降低。风险在于同时混用 CommonJS 与 ESM 语法本就不兼容的脚本行为可能变化。官方计划将其排入 v0.49.0且大部分剩余工作会在 v0.48.0 周期内完成并让用户通过master分支的 Docker 镜像提前测试。从源码结构看当前的模块加载与转译链路涉及 internal/js/modules/k6 下的模块注册与 js/modules/cjsmodule.go、js/modules/gomodule.go 等加载器实现Babel 转译步骤的移除正是针对这条链路的重构。Future breaking changesv0.48.0 起生效需提前自查指标名长度限制 128 字符issue #3065原定 63 字符上限是为对齐 OpenTelemetry后因 OTel 自身上限调整为 255 字符而改为 128k6 converter命令将被移除PR #3365gRPC 模块的headers参数将被移除PR #3350应改用metadata属性——这与 v0.47.0 新增二进制元数据后 metadata 成为统一入口的方向一致远程模块必须带https://协议issue #3287否则直接报错CSV 输出不再接受 snake_case 参数应使用驼峰如fileName而非file_name--logformat标志被移除应使用--log-format。官方建议逐一核对该清单提前更新脚本或 CI/CD 流程以避免升级时的中断。七、小结v0.47.0 是一次能力增强 契约收紧并行的版本gRPC 模块补齐了二进制元数据与反射元数据两项规范级能力解析与验证逻辑可对照 internal/js/modules/k6/grpc/params.go 与 internal/js/modules/k6/grpc/client_test.goBrowser 模块的 Cookie API 与 console 事件使前端可测性显著增强Docker 侧则以带浏览器镜像和 ARM64 镜像降低了环境门槛。与此同时statsd 输出废弃、远程模块 URL 收紧、以及面向 v0.48.0 的破坏性变更清单指标名长度、k6 converter、--logformat等要求使用者在升级窗口期完成脚本与流水线的适配。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
