K6中向空数组添加元素计算请求平均传输时间失败问题排查
解决K6中全局数组在teardown函数中为空的问题
问题原因
K6的每个虚拟用户(VU)运行在独立的内存沙箱中,你定义的全局transferTimes数组仅存在于单个VU的内存空间内,而teardown函数是在K6的主进程中执行的,无法直接访问各个VU内存中的变量,因此会出现数组长度为0的情况。
解决方案
使用K6提供的**自定义趋势指标(Trend)**来收集请求耗时数据,Trend指标会自动聚合所有VU的统计数据,主进程(包括teardown函数)可以直接访问这些聚合后的结果。
修改后的完整代码
import http from 'k6/http'; import { sleep } from 'k6'; import { check } from 'k6'; import { Trend } from 'k6/metrics'; export let options = { vus: 1, duration: '5s', // 原代码此处缺少引号,属于语法错误,需修正 }; // 定义自定义趋势指标,用于收集传输时间 const transferTimeTrend = new Trend('transfer_time'); export default function () { const res = http.get('<url>'); check(res, { 'Successful response': (resp) => resp.status === 200, }); const transferTime = res.timings.duration; // 将单请求传输时间添加到趋势指标中 transferTimeTrend.add(transferTime); console.log(`Transfer time: ${transferTime} ms`); sleep(1); // 可选,避免请求过于频繁 } export function teardown() { // 从指标中获取聚合后的统计数据 const stats = metrics.transfer_time; console.log(`Average transfer time: ${stats.values.avg.toFixed(6)} ms`); console.log(`Min transfer time: ${stats.values.min.toFixed(6)} ms`); console.log(`Max transfer time: ${stats.values.max.toFixed(6)} ms`); }
额外说明
- 原代码中
options.duration的5s未加引号,属于语法错误,会导致脚本运行失败,已修正为字符串形式'5s'。 - Trend指标会自动计算多维度统计值,包括平均值、极值、百分位数(如p90、p95),可直接从
stats.values中调用。
运行输出示例
INFO[0001] Transfer time: 1.164713 ms source=console INFO[0002] Transfer time: 1.163952 ms source=console ... INFO[0005] Average transfer time: 1.164333 ms source=console INFO[0005] Min transfer time: 1.163952 ms source=console INFO[0005] Max transfer time: 1.164713 ms source=console
内容的提问来源于stack exchange,提问作者Ira
相关产品推荐
相关产品推荐

