
k6 v0.46 版本指南浏览器模块破坏性迁移、Loki 认证、gRPC TLS 与 Cloud Output v2 实战【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6k6v0.46是一次面向浏览器测试xk6-browserv1.0.2的重大版本升级同时为日志输出、gRPC 客户端与云测试管道带来多项能力更新Loki 日志输出新增自定义请求头以支持认证、gRPC 支持按连接配置 TLS、新增 Cloud Tracesk6 与 Tempo 集成以及基于二进制协议的新版 Cloud Output v2。读完本文你将掌握从旧版浏览器测试脚本迁移到新生命周期模型的完整要点并能配置带认证的 Loki 日志、为不同 VU 连接不同 TLS 参数的 gRPC 服务以及理解 Cloud 指标输出的新协议与标签约束。版本概览本版本的核心变化可以归纳为六条主线xk6-browser 扩展升级到v1.0.2包含多项破坏性变更选项、浏览器生命周期、指标Loki 日志输出新增header配置选项可在每个请求上附加自定义请求头如Authorization解决长期缺失的认证能力新增Cloud Traces打通 k6 与 Grafana Tempo 的链路追踪集成k6/net/grpc与k6/experimental/grpc模块支持按 gRPC 连接配置 TLS引入Cloud Output v2以 HTTP 上的二进制负载协议刷新指标降低高指标量测试的负载生成器资源占用以及大量 UX 改进、Bug 修复与内部优化。Breaking Changes浏览器模块升级到 v1.0.2v0.46将 xk6-browser 扩展版本提升至v1.0.2其中包含关于**选项options、浏览器生命周期browser lifecycle和指标metrics**的多项破坏性变更。升级后原有测试脚本需要按新的 API 形态调整才能继续运行。选项变更devtools、env、proxy弃用slowMo移除devtools、env、proxy三个选项被弃用浏览器launch/connect选项不再定义在对应 JS API 方法中。测试执行相关选项如浏览器类型改为在 browser 场景选项scenario options内定义其他更偏向环境的选项如headless、debug、executablePath改为通过环境变量设置slowMo选项不再被支持未来可能通过不同的 API 重新引入。生命周期变更浏览器实例自动初始化和关闭用户不再需要通过 JS API 显式初始化/关闭浏览器实例。只要在场景选项中设置了浏览器类型浏览器实例会在每次迭代iteration开始/结束时自动初始化/关闭。这带来两个直接后果从k6/experimental/browser导入的chromium实体不再有效改为通过browser实体访问浏览器方法例如browser.newPage()browser.on()方法不再适用已从 API 中移除。指标变更browser_前缀与 Web Vitals 重命名Web Vitals 指标改用browser_前缀和短命名例如webvital_first_input_delay→browser_web_vital_fidrating 指标被移除改为作为对应 Web Vitals 指标上的标签label浏览器 HTTP 指标从 HTTP 模块的指标中拆分出来新增browser_前缀的 HTTP 指标专门用于请求时长和失败请求例如新增browser_http_req_failed指标浏览器模块版本号不再作为导出字段。浏览器上下文约束每次迭代仅允许一个 live 上下文新版本对浏览器上下文browser context的使用增加了约束每次迭代只允许一个browserContext处于活动状态。用户可以创建新上下文、关闭它、再创建新上下文但不能同时存在多个存活的上下文。需要分离测试中的独立操作时应改用场景scenarios机制来组织。新的浏览器测试脚本形态综合以上变更一个简单的浏览器测试现在长这样import { browser } from k6/experimental/browser; export const options { scenarios: { ui: { executor: shared-iterations, options: { browser: { type: chromium, // chromium 是唯一受支持的浏览器类型只要设置了该选项 // 就会使用 Chromium / Google Chrome }, }, }, }, }; export default async function () { const page browser.newPage(); try { await page.goto(https://grafana.com) } finally { page.close(); } }注意这里type: chromium是场景选项中唯一的浏览器配置headless、debug、executablePath等环境类选项则需要通过环境变量注入。更多浏览器测试示例可参考 examples/browser 目录。其他弃用项loadimpact/k6Docker 镜像被弃用issue [#3121] 相关应尽快切换到grafana/k6镜像。新特性一Loki 日志输出支持自定义请求头#3227k6 从v0.28.0起就支持将日志推送到 Loki但近三年一直没有认证手段。v0.46起可以通过新增的header配置选项为每个推送请求附加自定义请求头用法与已有的label选项类似k6 --log-outputlokihttp://example.org,header.X-My-Header123,header.Authorizationmytoken ...上面的命令会让 k6 在每次向 Loki 推送日志时携带X-My-Header: 123与Authorization: mytoken两个请求头从而支持通过 Basic Auth、Bearer Token 或自定义网关头来对接受保护的 Loki 实例。源码级实现细节在仓库的 internal/log/loki.go 中可以看到完整的参数解析逻辑。LokiHookOptions结构体定义了Headers [][2]string字段源码注释示例为Authorization: Bearer tokenparseArgs函数负责解析配置行以label.开头的键被解析为静态标签label.Xvalue以header.开头的键被解析为请求头header.Xvalue见strings.CutPrefix(key, header.)分支未知配置键会直接返回unknown loki config key错误避免配置静默失效。推送时lokiHook.push会先设置Content-Type: application/json然后遍历h.headers逐一req.Header.Add(header[0], header[1])附加请求头若 Loki 返回 400状态码会读取响应体并返回包含状态码和响应内容的错误。loki.go同时展示了整套 Loki 推送机制的其他关键参数与默认值可用于完整配置配置项默认值说明lokihttp://127.0.0.1:3100/loki/api/v1/pushLoki 推送地址pushPeriod1s推送周期time.ParseDuration解析limit100每个推送周期内最多缓存的消息条数超出部分计数丢弃并记录 dropped 日志msgMaxSize1MB单条日志消息最大字节数超长消息会被截断并插入省略提示level全部级别需要推送的日志级别allowedLabels无白名单标签未在白名单内的标签会被拼入消息文本并从标签中移除label.X—静态标签例如test_run_idheader.X—自定义请求头v0.46 新增profile关闭开启后输出排序、序列化、发送等各阶段耗时新特性二Cloud Traces —— k6 与 Tempo 集成#3100、#3202本版本支持 k6 与 Tempo 在云端的全新集成。Grafana Cloud k6 与 Grafana Cloud Tempo 用户可以借助既有的k6/experimental/tracing模块发起 trace从而在测试运行分析页面中看到来自追踪数据的指标与聚合丰富测试运行的可观测性。启用方式k6 cloud运行Cloud Traces开箱即用无需额外配置k6 run本地运行需要将环境变量K6_CLOUD_TRACES_ENABLED设为true。在仓库中该环境变量贯穿了命令行到云端输出的链路相关实现散见于 cloudapi/config.go、internal/cmd/run.go 与 internal/cmd/runtime_options.go云端侧由 internal/output/cloud/insights 目录下的实现负责处理。追踪能力的底层依赖 OpenTelemetry见 internal/lib/trace/otel.go。新特性三gRPC 按连接配置 TLS#3159k6/net/grpc与k6/experimental/grpc模块现在支持通过ConnectParams为每个连接配置独立的 TLS 设置。这在以下场景中尤其有用连接同一个 gRPC 服务器但不同 VU 使用不同 TLS 配置从同一个 VU连接多个 gRPC 服务器各自使用不同的证书与密钥。完整示例import grpc from k6/experimental/grpc; import { check } from k6; import { SharedArray } from k6/data; import exec from k6/execution; // 注意示例中的服务并不存在。如果你想运行该示例 // 请替换 URL以及 cacerts、cert、key、password 变量。 const grpcArgs new SharedArray(grpc, () { // 使用 SharedArray这样不是每个 VU 都会复制一份全部证书和密钥 return [ { host: foo1.grpcbin.test.k6.io:9001, plaintext: false, params: { tls: { cacerts: [open(cacerts0.pem)], cert: open(cert0.pem), key: open(key0.pem), }, }, }, { host: foo2.grpcbin.test.k6.io:9002, params: { plaintext: false, tls: { cacerts: open(cacerts1.pem), cert: open(cert1.pem), key: open(key1.pem), password: cert1-passphrase, }, }, }, ]; }); const client new grpc.Client(); export default () { if (__ITER 0) { // 取一份配置用于当前这个 VU let grpcArg grpcArgs[exec.vu.idInTest % grpcArgs.length]; client.connect(grpcArg.host, grpcArg.params); } const response client.invoke(hello.HelloService/SayHello, { greeting: Bert, }); check(response, { status is OK: (r) r r.status grpc.StatusOK, }); console.log(JSON.stringify(response.message)); };示例中两个目标服务器使用了互不相同的 CA 证书cacerts0.pem/cacerts1.pem与客户端证书密钥对第二个服务器还通过password字段保护了私钥。借助SharedArray共享配置切片再以exec.vu.idInTest取模选择配置实现了不同 VU 连接不同 TLS 服务器的典型用法。源码级实现细节在 internal/js/modules/k6/grpc/params.go 中connectParams结构体定义了TLS map[string]any字段newConnectParams在解析connect参数时遇到tls键会调用parseConnectTLSParam进行校验。该函数支持的可选键包括certPEM 格式的客户端证书字符串keyPEM 格式的客户端私钥字符串password私钥的口令passphrase字符串cacertsPEM 格式的 CA 证书既可以是单个字符串也可以是字符串数组对应示例中cacerts0.pem用数组、cacerts1.pem用单字符串的写法。这些值会被送入底层的 internal/lib/netext/grpcext/conn.go 构建带自定义 TLS 配置的 gRPC 连接。connectParams中其余可用的连接参数还包括plaintext、reflect反射协议、reflectMetadata、maxReceiveSize、maxSendSize、authority等timeout默认为1 分钟。新特性四Cloud Output v2#3117经过多年服役k6 刷新了 Cloud 输出引入更高效的端到端方案来摄取测试指标。核心变化是刷新指标所用的协议从旧协议改为基于 HTTP 的二进制负载binary-based payload over HTTP。新输出显著降低了负载生成器在高指标量测试下的资源占用而对用户体验而言几乎无差异。唯一需要特别注意的是新输出对标签tags非常严格保留标签会被直接丢弃例如名为test_run_id的自定义标签会被丢弃因为它保留给 k6 Cloud 内部操作使用任何以两个下划线__开头的标签键会被丢弃这是 Prometheus 约定中的保留前缀。源码级实现细节在 output/cloud/expv2 目录中mapping.go 的isReservedLabelName函数完整实现了上述两条规则func isReservedLabelName(name string) bool { // this is a reserved label prefix for the prometheus if strings.HasPrefix(name, __) { return true } return name test_run_id }mapTimeSeriesLabelsProto在映射时间序列标签到 protobuf 时会跳过保留标签并将它们记入discardedLabelsflush.go 中对应输出Tag %s has been discarded since it is reserved for Cloud operations.的警告日志。配套测试 flush_test.go 中的TestFlushWithReservedLabels用例验证了__name__与test_run_id两类标签均被丢弃并产生告警且 flusher 不会发送带保留名称的标签。指标载荷的 protobuf 定义位于 pbcloud/metric.proto其中同样保留了test_run_id字段供 Cloud 内部使用。需要说明的是Cloud Output v2尚不是本地机器k6 run -o cloud运行的默认输出官方计划在随后的数周内透明地默认启用。Cloud 云平台侧的实际部署由 internal/output/cloud 相关实现承载。UX 改进与增强新增js/promises包#3176扩展开发者可通过其New函数方便地创建会被派发到事件循环eventloop的 Promisemodulestest.Runtime新增RunOnEventLoop方法#3181扩展开发者可在测试中于事件循环上运行代码xk6-grpc#19修复向已关闭的 gRPC 流写入时产生的 EOF 错误若未设置错误处理器错误会被记录到控制台浏览器模块browser#881新增browser_http_req_failed指标浏览器模块browser#901locator支持Shadow DOM 穿透shadow DOM piercing浏览器模块browser#953提升 Web Vitals 上报的准确性与一致性。Bug 修复gRPC 模块#3178、xk6-grpc#23修复嵌套 protobuf 消息的注册问题Loki 日志输出#3194修复推送完成前进程即退出的问题追踪模块#3231修复采样选项未设置时默认不为1.0的问题现在默认采样率为1.0浏览器模块browser#866禁用浏览器进程执行的超时browser#942修复frameNavigated死锁browser#943修复导航与生命周期事件间的竞态条件browser#979修复page.close()时pagehide事件求值的死锁browser#980修复控制台日志序列化器的 Loki 日志输出browser#991修复browser.close()panic 时数据目录未被清理的问题。维护与内部改进为核心 JS 模块新增事件系统#3112升级 gRPC k6 demo 服务依赖修复安全漏洞CVE-2023-32731#3170更新 k6 使用的实验性 gRPC 模块版本#3211与 xk6-output-prometheus-remote 版本#3210更新 k6 Go 依赖#3136、golangci-lint 至最新版本#3177重构 Pull Request 模板加入贡献者检查清单#3131修复 gRPC 示例#3163浏览器模块大量日志修复、内部重构与测试修复并支持从K6_INSTANCE_SCENARIOS环境变量解析场景 JSON、以 CDP 连接作用域保证消息 ID 唯一等browser#849~#984 系列。升级与迁移建议对于正在使用 xk6-browser 旧版 API 的团队本版本的破坏性变更较多建议按以下顺序检查脚本场景选项把launch/connect中与测试执行相关的选项迁移到 scenario 的options.browser如type: chromium环境类选项改为环境变量导入路径与实体把chromium替换为browser实体删除browser.on()调用移除显式的浏览器初始化/关闭代码指标消费将 Web Vitals 指标名更新为browser_前缀短命名注意 rating 已变为标签、HTTP 指标已拆分上下文管理确认每次迭代最多只存在一个 livebrowserContext需要并行独立操作时改用多个场景。与此同时接入 Loki 的团队可以立即用header.选项补齐认证能力gRPC 重度用户可以开始按连接粒度精细化 TLS 配置而 Cloud 用户则应留意新版输出对保留标签的丢弃行为避免依赖test_run_id或以__开头的自定义标签。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考