资讯详情

k6 v2.2.0 发布详解:CDP 远程浏览器连接、日志上云与流式 API 全面升级

📅 2026/9/10 12:13:44 | 华诺云谱 👁 阅读
k6 v2.2.0 发布详解:CDP 远程浏览器连接、日志上云与流式 API 全面升级
k6 v2.2.0 发布详解CDP 远程浏览器连接、日志上云与流式 API 全面升级【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6本篇技术指南以 k6 官方发布说明 release notes/v2.2.0.md 为核心系统解读 v2.2.0 版本的全部新特性、行为变化与底层实现包括k6 cloud run --local-execution的日志上云、chromium.connectOverCDP()远程浏览器接入、TextEncoder/TextDecoder全局对象与实验性WritableStream、k6 cloud load-zone list命令、可配置的handleSummary()超时以及两个新的实验性 feature flags。读完本文你将掌握这些新能力的用法、配置参数、适用场景及其在仓库源码中的实现位置可直接用于升级后的脚本与测试工作流。版本概览无破坏性变更v2.2.0 是一个纯增量特性版本官方明确声明没有任何 Breaking Changes升级现有脚本与 CI 流程无需改动。本版本的工作重点集中在三条主线云测体验本地执行的测试日志可流入 Grafana Cloud新增k6 cloud load-zone list命令浏览器模块支持通过 CDP 协议连接已运行的 Chromium 实例JavaScript 运行时补齐TextEncoder/TextDecoder全局对象实验性 streams 模块新增WritableStream。此外还包含可配置的 summary 超时、新的实验性 feature flags、一批 UX 改进与十余项 bug 修复。k6 cloud run --local-execution日志流式上云在 v2.2.0 之前k6 cloud run --local-execution本地执行、结果上报云端的模式的日志只停留在运行 k6 的机器上永远不会进入云端测试运行的日志视图。本版本改变了这一行为本地执行的 k6 日志现在会实时流式传输到 Grafana Cloud 测试运行中使得本地执行与云端执行在日志视图上的体验完全一致对应 PR #6171。# 本地执行并将日志流式传输到 Grafana Cloud k6 cloud run --local-execution script.js # 关闭日志上云仅保留本地日志 k6 cloud run --local-execution --no-cloud-logs script.js两个命令的差异只在于--no-cloud-logs标志它显式退出日志流式传输适用于不想把日志推送到云端的场景。该标志的实现位于 internal/cmd/cloud_run.go源码层面做了严格约束——--no-cloud-logs只能与--local-execution组合使用否则直接报错对应第 146 行的错误信息the --no-cloud-logs flag can only be used in conjunction with the --local-execution flag。值得注意的安全细节是日志上云意味着日志内容可能暴露敏感信息官方建议结合 Grafana 的 secrets 管理能力安全地处理密钥一旦密钥意外泄漏到日志中要及时脱敏redact。相关维护性改动API 迁移PR #6169、#6230k6 cloud run --local-execution从遗留的 v1 云 API 迁移到 v6 与 provisioning API并静默了其状态轮询日志。用户可见行为不变k6 run --out cloud仍停留在 legacy API。推送凭据可注入PR #6170允许编排服务通过K6_CLOUD_METRICS_PUSH_URL与K6_CLOUD_TEST_RUN_TOKEN环境变量为--local-execution提供作用域化的推送凭据。错误提示优化PR #6096当通过K6_CLOUD_PUSH_REF_ID复用测试运行且使用--local-execution时云 secrets 相关错误现在会指向K6_CLOUD_SECRETS_TOKEN与K6_CLOUD_SECRETS_ENDPOINT而不是再建议用户使用他们已经在用的--local-execution标志。通过chromium.connectOverCDP()连接运行中的浏览器浏览器模块新增了chromium.connectOverCDP()方法PR #6165可以附加attach到一个已经运行的 Chromium 系浏览器实例上通过 Chrome DevTools ProtocolCDP进行控制这与 Playwright 的browserType.connectOverCDP()行为一致。它的典型场景是浏览器会话由外部工具如浏览器云服务提供商管理k6 只负责驱动。import { chromium } from k6/browser; export default async function () { const browser await chromium.connectOverCDP(ws://localhost:9222/devtools/browser/id); const page await browser.newPage(); try { await page.goto(https://quickpizza.grafana.com/); } finally { await page.close(); await browser.close(); } }核心用法要点传入 WebSocket 端点即ws://或wss://格式的 CDP browser 端点地址Chrome 以--remote-debugging-port9222启动后可通过http://localhost:9222/json/version获取生命周期由 k6 接管k6 管理返回的 browser 连接在迭代结束时自动关闭但你可以提前调用browser.close()按需释放连接端点是运行时值与K6_BROWSER_WS_URL环境变量在启动时静态配置不同connectOverCDP()的端点是在迭代中动态计算的。因此你可以在setup()中从浏览器提供商的 API 请求一个全新的会话 URL再把它传给各迭代使用——这正是云上按需分配浏览器会话的标准做法。仓库提供了完整的可运行示例 examples/browser/remote.js其中展示了两种典型用法其一是在setup()中通过 HTTP 请求动态获取connectUrl再传入迭代其二是本地快速验证时用环境变量模拟运行时 URL# 本地先用 --remote-debugging-port9222 启动 Chrome然后 CDP_WS_URLws://localhost:9222/devtools/browser/id k6 run examples/browser/remote.js示例中还特意加了try/finally结构确保page.close()与browser.close()一定执行避免因异常导致连接泄漏PR #6196 也为其他 browser 示例统一补上了catch块让失败的迭代报告原始错误而不是后续page.close()的失败。源码实现与端点校验ConnectOverCDP的实现位于 internal/js/modules/k6/browser/chromium/browser_type.go。从源码结构看它与其他入口Launch、Connect共用同一套初始化管线init→ 连接建立但走的是NewRemoteBrowserOptions()远程浏览器选项并且不需要 browser scenario——这意味着你可以在非 browser 场景的测试脚本里直接用它连接外部浏览器。代码中的注释也表明ConnectOverCDP传入了固定的{type: chromium}以绕开Parse对类型的强制要求。值得注意的一个实现细节是端点前置校验函数validateWSEndpoint同文件第 153-174 行它会在真正建立连接前快速失败明确拒绝三类常见错误——空端点、非ws/wss协议、缺少主机名。因此传错端点时你会得到清晰的中文可读错误如invalid WebSocket endpoint xxx: scheme must be ws or wss而不是底层连接失败的晦涩报错。此外BrowserType.Clone()同文件第 65-73 行允许同一迭代内并发执行多个ConnectOverCDP调用而不必回到只能用于 init 阶段的NewBrowserType——这为多页面并行驱动的场景提供了支持。TextEncoder/TextDecoder全局对象TextEncoder和TextDecoder现在作为标准全局对象在 k6 的 init 上下文与 VU 上下文中都可用PR #6182无需 import与浏览器及其他 JavaScript 运行时的暴露方式保持一致。const encoded new TextEncoder().encode(Hello, world!); const decoded new TextDecoder().decode(encoded);这解决了长期以来编写脚本时手动实现 UTF-8 编解码的痛点也让在setup()/teardown()/默认函数中处理二进制数据、签名计算如 JWT、响应体编码转换等场景的代码更接近浏览器原生写法。从仓库看其底层基于 vendored 的github.com/grafana/sobek-webapi-encoding包见 vendor/github.com/grafana/sobek-webapi-encoding/encoding/text_encoder.go作为运行时能力接入 Sobek 引擎。WritableStream加入k6/experimental/streams实验性 streams 模块实现了 WHATWG Streams 规范中的WritableStream与WritableStreamDefaultWriterPR #6132补齐了此前已有的ReadableStream并为未来实现TransformStream铺路。import { WritableStream } from k6/experimental/streams; export default async function () { const stream new WritableStream({ write(chunk) { console.log(wrote ${chunk}); }, }); const writer stream.getWriter(); await writer.write(hello); await writer.close(); }用法要点new WritableStream({ write(chunk) { ... } })传入一个 underlying sink核心是write回调stream.getWriter()获得 writerawait writer.write(chunk)异步写入await writer.close()关闭流整个过程都是异步的符合流式处理的背压backpressure语义。该模块的完整实现位于 internal/js/modules/k6/experimental/streams/ 目录核心文件包括writable_streams.go流主体、writable_stream_default_writer.gowriter、writable_stream_default_controller.go控制器与underlying_sink.gosink 接口定义并配套了writable_streams_test.go与针对规范兼容性的回归测试。仓库还提供了可直接运行的示例 examples/experimental/writable-streams.js。同时v2.2.0 升级了 Sobek 引擎与 regexp2PR #6183、#6218使得WeakMap/WeakSet条目可被垃圾回收并限制正则回溯的内存占用为流式与文本处理类负载的稳定性提供了底层保障。新增命令k6 cloud load-zone listv2.2.0 新增k6 cloud load-zone list子命令PR #6142用于列出配置的 Grafana Cloud k6 stack 中可用的负载区域load zones——包括公共与私有区域与既有的k6 cloud project list命令风格一致。输出默认是人类可读的表格传入--json则输出 JSON 数组。$ k6 cloud load-zone list Load zones for https://example.grafana.net: ID NAME TYPE AVAILABLE amazon:us:ashburn Ashburn, US (Amazon) public yes amazon:sa:cape town Cape Town, SA (Amazon) public yes# 以 JSON 数组形式输出 k6 cloud load-zone list --json该命令的实现位于 internal/cmd/cloud_load_zone_list.go从源码看有几个细节值得注意表格由 Go 标准库text/tabwriter渲染四列分别为ID、NAME、TYPE、AVAILABLE其中TYPEpublic/private由LoadZone.Public字段推导AVAILABLEyes/no对应LoadZone.Available字段第 84-100 行JSON 输出使用带缩进的编码器且关闭了 HTML 转义第 71-82 行命令的认证配置复用 v6 云 API 客户端newCloudV6ClientFromConfig未配置认证时会提示 Listing cloud load zones requires auth settings。该命令的测试覆盖位于 internal/cmd/tests/cmd_cloud_load_zone_list_test.go。可配置的handleSummary()超时handleSummary()回调此前有一个硬编码的 120 秒时间预算长耗时测试如果携带了繁重的 summary 处理逻辑容易触发handleSummary() execution timed out而失败。v2.2.0 将其变为可配置PR #5854通过handleSummaryTimeout选项或K6_HANDLE_SUMMARY_TIMEOUT环境变量控制export const options { handleSummaryTimeout: 5m, };该选项在 lib/options.go 中定义类型为types.NullDurationJSON 键为handleSummaryTimeout环境变量为K6_HANDLE_SUMMARY_TIMEOUT取值遵循 k6 标准的时长格式如5m、120s、1h30m并可接受 Go duration 解析。相关测试覆盖位于 internal/js/summary_test.go 与 internal/cmd/tests/cmd_run_test.go。新的实验性 Feature Flagsmerge-run-tags与freeze-envv2.1.0 引入了实验性 feature-flag 系统v2.2.0 新增两个实验性标志PR #5714、#6032通过--features启用k6 run --features merge-run-tags,freeze-env script.jsmerge-run-tags按 key 合并运行标签此前options.tags与--tag/K6_TAGS同时使用时脚本中的 tags 会被整体静默丢弃。启用merge-run-tags后运行标签改为按 key 跨配置层合并在冲突的 key 上优先级更高的层胜出而不是用高层配置整个替换脚本中的 tag 映射。例如脚本中定义了options.tags { team: a, env: test }命令行又传了--tag teamb启用该标志后最终生效的是{ team: b, env: test }——env得以保留team被更高优先级覆盖。该行为的测试位于 internal/cmd/tests/cmd_run_merge_run_tags_test.go 与 internal/cmd/config_consolidation_test.go。freeze-env冻结__ENV对象启用freeze-env后__ENV对象被冻结脚本代码对它的修改会抛出TypeError严格模式下而不再静默地在各迭代与场景之间持续生效——此前这种跨迭代的“隐性环境变量污染”很难排查。该标志的实现位于 internal/js/runner.go。UX 改进与增强浏览器模块 header 访问器重做PR #5631response.allHeaders()、headerValue()、headerValues()、headersArray()现在返回原始线上 headerwire headers包含Set-Cookie与安全相关 header并正确地与重定向链的每一跳配对而不是 Chrome 的 provisional headers。同时headerValues()改为大小写不敏感地匹配 header 名重复值按换行而不是逗号切分browser_data_sent/browser_data_received指标现在包含原始 header 字节数不再因 CDP 事件顺序不同而在运行间波动。k6 cloud拒绝运行标志PR #6208k6 cloud --vus 10 script.js这类用法此前会接受标志、打印帮助文本并以退出码 0 结束现在会以unknown flag错误和非零退出码拒绝。这符合 v2.0.0 起k6 cloud run取代直接k6 cloud运行的弃用路线。Bug 修复一览领域修复内容对应 PRHTTP/2按消息分类 HTTP/2 错误使 k6 基于 Go 1.27 构建x/net/http2委托标准库时error_code指标标签仍正确并在 VU 传输层显式启用 HTTP/2 协商#6234日志Loki hook 在关闭时排空排队日志--out loki与云日志流不再丢失最后一批云日志缓冲区溢出时发出k6 dropped N log messages警告而非静默丢弃#6232文件系统缓存文件系统串行化首个并发fs.open()避免并行打开同一文件读到零字节或截断数据#6125浏览器修复并发增删 browser routes 时的数据竞争与请求拦截状态不一致问题#6147文件日志文件日志输出改为每秒 flush 一次k6 在关闭前被杀时最近日志不再丢失#6070云日志尾部读取 Grafana Cloud 日志时不再发送无效的Sec-WebSocket-Protocolheader修复websocket: bad handshake#6205指标 sink观察时长为零时计数器rate保持未设置不再算出Inf并误触发 rate 阈值#6200gauge 的 max 从第一个样本初始化全负值序列不再报告max0#6195OpenTelemetry配置了 basic auth 但未设置K6_OTEL_HEADERS时启动不再 panic#6145SharedArray停止深冻结 JS 基本类型避免大字符串被无谓包装成String对象——报告中的复现场景内存占用从约 1 GB 降至 100 MB#6140维护与内部改进匿名扩展使用上报PR #6126、#6224、#6229使用报告新增匿名扩展使用情况——上报 registry 目录中实际使用的扩展的 Go 模块路径、版本与类型导入的k6/x/模块、--out选择的输出扩展、k6 x子命令。私有与未列出的扩展永不上报既有的--no-usage-report仍可整体关闭。引擎与依赖升级PR #6183、#6218Sobek 与 regexp2 升级WeakMap/WeakSet条目可回收字符串与类型化数组的正确性与性能提升正则回溯内存受限。CI 与构建链Go toolchain 指令更新至 1.25.12#6134Docker 基础镜像升级Go 1.26.5、Alpine 3.24.1、Debian trixie-20260623见 PR #6155/#6080/#6098/#6114CI Go 版本集中到 .github/go-versions.env#6112docs-only 与 release-notes-only PR 跳过代码 CI#6104xk6 CI 适配go.k6.io/k6/v2模块迁移#6203。云 API 客户端清理PR #6149、#6159移除死代码 v6 配置文件v1 与 v6 客户端共享 401/403 错误分类并消费上游k6-cloud-openapi-client-go的 retry body-reset 修复与 int64 资源 ID 加宽PR #6151/#6152/#6173。执行器PR #6144executors 保留并调用常规时长的 context cancel 函数不再丢弃。依赖与安全更新google.golang.org/grpc升至 v1.83.0PR #6191/#6192/#6240、golang.org/x/netv0.56.0 与golang.org/x/textv0.39.0PR #6185/#6186等均为安全更新GitHub Actions 依赖升级至actions/checkoutv7、golangci/golangci-lint-actionv9.3.0 等。外部贡献者致谢本版本共收到 12 位外部贡献者的代码贡献LBaroncelisummary 超时、yordismerge-run-tags、lohitkollurifreeze-env、locker95browser 示例 catch 块、rohan-patnaik文件日志 flush、somak2kaibrowser routes 并发修复、samarth70counter rate 修复、Solaris-stargauge max 修复、lukdzOpenTelemetry panic 修复、the-onewho-knocksexecutor context cancel、hyurakubrowser mouse 选项单元测试、Martonveghcode文档错别字修复。小结k6 v2.2.0 以“零破坏、纯增量”的方式交付了一批高价值能力本地执行 云端日志让混合工作流更接近云端原生体验chromium.connectOverCDP()将浏览器测试的边界扩展到外部托管的浏览器会话TextEncoder/TextDecoder与WritableStream让脚本运行时更贴近标准 JavaScriptload-zone list与可配置 summary 超时则分别改善了云资源可见性与长任务稳定性。对于正在使用k6 cloud run --local-execution或浏览器模块的团队建议优先升级并配合 secrets 管理实践对于关注指标精确性的用户v2.2.0 中关于 header 字节、rate/max计算的修复也值得留意。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。