如何合并非Grafana云环境下10个独立k6实例的测试汇总?
合并多个独立k6测试实例的汇总结果方法
当然可以合并,核心思路是利用k6输出的结构化数据做聚合处理,以下是两种实用方案:
1. 基于JSON输出的手动脚本聚合
这是最直接的方案,适合你已经拿到10份结果的场景:
第一步:确保结果是结构化格式
如果之前的测试没输出JSON,重新运行每个实例时加上参数:k6 run script.js --out json=result-{index}.json(把{index}换成1到10的编号),生成包含完整指标的JSON文件。第二步:编写聚合脚本
用Python、Node.js等语言写简单脚本,对所有JSON结果做指标聚合:- 计数类指标(请求数、错误数、HTTP状态码次数):直接累加
- 数值类指标(响应时间、延迟):累加总和、更新最大/最小值,按请求数加权计算百分位数和平均值
- 状态类指标(最大并发数
vus_max):取所有实例中的最大值
以下是Python的极简示例脚本:
import json import glob # 加载所有结果文件 result_files = glob.glob("result-*.json") all_results = [json.load(open(f)) for f in result_files] aggregated = {} for res in all_results: # 遍历每个指标 for metric_name, data in res["metrics"].items(): if metric_name not in aggregated: # 初始化指标结构 aggregated[metric_name] = { "count": 0, "sum": 0, "min": float("inf"), "max": float("-inf"), "percentiles": {} } # 累加计数和总和 aggregated[metric_name]["count"] += data["count"] aggregated[metric_name]["sum"] += data["sum"] # 更新极值 aggregated[metric_name]["min"] = min(aggregated[metric_name]["min"], data["min"]) aggregated[metric_name]["max"] = max(aggregated[metric_name]["max"], data["max"]) # 加权处理百分位数 for pct, val in data["percentiles"].items(): if pct not in aggregated[metric_name]["percentiles"]: aggregated[metric_name]["percentiles"][pct] = 0 aggregated[metric_name]["percentiles"][pct] += val * data["count"] # 计算最终的平均值和加权百分位数 for metric in aggregated.values(): if metric["count"] > 0: metric["avg"] = metric["sum"] / metric["count"] for pct in metric["percentiles"]: metric["percentiles"][pct] /= metric["count"] # 输出合并后的JSON结果 print(json.dumps(aggregated, indent=2))
2. 提前规划:用k6分布式测试(如果后续还要跑)
如果之后还要做类似的多实例测试,不用事后合并,直接用k6的分布式运行模式:
- 启动一个主节点,然后将10个实例作为工作节点连接到主节点
- 主节点会自动收集所有工作节点的指标,直接输出一份合并后的汇总结果,无需手动处理
注意:百分位数不能直接取各实例百分位数的平均值,必须按请求数加权计算,否则结果会失真。
内容的提问来源于stack exchange,提问作者noamtm
相关产品推荐
相关产品推荐

