欢迎光临
我们一直在努力

我用 Python 把几十个 JMeter 压测结果文件,一键生成了客户级性能分析报告

一、需求:

一次数据库网关压测报告自动化实践:从 80+ 个 JTL 文件到客户级性能分析报告

报告效果图:

在一次数据库安全网关性能验证中,我遇到了一个非常典型但又很容易耗费时间的问题:

> JMeter 压测已经完成,但产生了大量 `.jtl` 结果文件。  
> 如果逐个打开、逐个统计、逐个对比,不仅效率低,而且很容易出错。

这次测试目标是对比:

– 源库直连
– 数据库网关纯转发
– 数据库网关开启字段脱敏
– 不同并发梯度下的响应耗时、P95、P99、吞吐率和稳定性

最终,我将整个分析过程自动化,实现了从 JTL 文件批量解析,到指标统计、图表生成、客户版 HTML报告输出的一整套流程。

二、背景:为什么需要自动化分析 JMeter JTL?

在数据库网关类产品压测中,通常不会只测一个场景。

本次验证覆盖了多个维度:

| 测试维度 | 说明 |
|—|—|
| 源库直连 | 应用直接访问数据库,作为基线 |
| 数据库网关纯转发 | 请求经过数据库网关,但不启用脱敏策略 |
| 数据库网关脱敏 1 个字段 | 启用单字段脱敏策略 |
| 数据库网关脱敏 2 个字段 | 启用双字段脱敏策略 |
| 数据库网关脱敏 3 个字段 | 启用多字段脱敏策略 |
| 并发梯度 | 从低并发逐步提升到高并发 |
| SQL 类型 | 简单查询、大数据量查询、复杂 SQL 查询 |

JMeter 每个压测任务都会生成一个 `.jtl` 文件。  

当场景和并发组合增多后,JTL 文件数量很快就会变成几十个甚至上百个。

如果手工处理,会遇到几个问题:

1. 每个文件都要单独打开统计。

2. 平均耗时、P95、P99 需要重复计算。

3. 同并发下源库和网关结果需要人工匹配。

4. 报告里的表格、图表、结论容易出现口径不一致。

5. 客户版报告还需要隐藏敏感数据,不能直接暴露原始压测细节。

所以,这类工作非常适合脚本化。

三、测试场景设计

本次压测主要分为三类 SQL 场景。

1. 简单 SQL 查询

用于验证普通查询经过数据库网关后的基础链路开销。

sql

select person_id, customer_name, id_no, part_no

from xxx.profile_info

limit 100;

2. 大数据量查询

用于验证大结果集返回时,数据库网关在纯转发和脱敏场景下的处理能力。

SELECT
person_id,
card_number,
mobile,
customer_name,
birth_date,
age,
gender,
points,
salary,
email_address,
address,
last_purchase_channel,
create_time
FROM xxx.customer_info
LIMIT 10000;

3. 复杂 SQL 查询

用于验证多表关联、聚合计算、条件过滤场景下的网关性能表现。

SELECT a.person_id AS id,
b.id_no,
a.gender,
min(a.points) AS points,
max(a.salary) AS salary,
sum(CASE WHEN a.gender = '0' THEN 1 ELSE 0 END) AS male_num,
sum(CASE WHEN a.gender = '1' THEN 1 ELSE 0 END) AS female_num
FROM xxx.customer_info a
JOIN xxx.profile_info b ON a.person_id = b.person_id
WHERE extract(year FROM date(a.birth_date)) >= extract(year FROM date(now())) – 66
AND extract(year FROM date(a.birth_date)) <= extract(year FROM date(now())) – 27
AND a.card_number LIKE '15%'
GROUP BY 1,2,3
LIMIT 100;

四、核心指标说明
为了让报告既能给技术人员看,也能给非技术客户看,我在报告中加入了术语解释。

指标含义
数据网关 数据库网关代理,位于应用和数据库之间,用于访问转发、数据脱敏、审计和安全管控
源库 不经过数据库网关,直接访问数据库得到的基线结果
纯转发 请求经过数据库网关,但不启用脱敏策略
脱敏 对敏感字段进行保护处理,例如身份证、手机号、姓名等
平均耗时 所有请求响应时间的平均值
P95 95% 请求的响应时间不超过该值
P99 99% 请求的响应时间不超过该值
吞吐率 单位时间内系统完成的请求数量,通常单位为次/秒
并发 同一时间发起请求的线程数量

五、自动化分析思路

整个脚本的处理流程如下:

自动化脚本主要解决了四件事:

  • 批量解析 JMeter .jtl 文件。
  • 自动按场景、并发、模式进行归类。
  • 自动计算核心性能指标。
  • 自动生成客户可读的报告和图表。

  • 六、报告展示效果

    最终报告包括:

    • 总结结论
    • 专业术语说明
    • 核心指标概括
    • 成功率图表
    • 各场景平均响应时间趋势图
    • 分场景详细数据表
    • 系统资源观察
    • 压测 SQL 脚本

    七、关键实现点

    1. JTL 文件解析

    JMeter 的 JTL 文件本质上是 CSV,常见字段包括:

    timeStamp, elapsed, label, responseCode, success, Latency, Connect

    脚本会重点读取:

    • elapsed
    • success
    • timeStamp
    • Latency
    • Connect

    并据此计算:

    • 样本数
    • 成功率
    • 平均响应时间
    • P90 / P95 / P99
    • 吞吐率

    2. 同并发基线对比

    对比时必须保证口径一致:

    同一个 SQL 场景、同一个并发数下,源库结果作为基线。

    差异率计算公式:

    差异率 = (数据库网关场景耗时 – 源库耗时) / 源库耗时 × 100%

    例如:

    源库平均耗时 = 10 秒
    数据库网关脱敏平均耗时 = 10.3 秒

    差值 = 0.3 秒
    差异率 = 0.3 / 10 × 100% = 3%

    八、遇到的问题

    问题 1:HTML 发给客户后图表不显示

    最开始 HTML 报告里的图表是这样引用的:

    <img src="jmeter_success_rate_pie.svg">

    本地打开没有问题,但如果只把 HTML 文件发给客户,SVG 文件没有一起发送,客户打开后图表就会丢失。
    最终改成:

    <div class="chart-wrap">
    <svg>…</svg>
    </div>

    也就是将 SVG 图表直接内嵌到 HTML 里。

    这样客户只需要一个 HTML 文件,就能完整看到表格和图表。

    问题 2:客户不理解 P95 / P99 / 吞吐率
    技术报告如果只写指标,很容易让非技术客户看不懂。
    所以我在报告前面加入“专业术语说明”,让客户先理解术语,再看数据。

    九、最终效果

    通过这次自动化处理,整个报告生成流程从“人工逐个文件处理”变成了“一键生成”。
    最终输出包括:

    输出文件说明
    HTML 报告 给客户查看,图表内嵌,单文件可发送
    Markdown 报告 便于内部维护和二次编辑
    CSV 汇总 便于技术人员复核原始统计指标
    Python 脚本 可重复执行,可扩展新场景

    十、总结

    这次实践最大的价值,不只是生成了一份报告,而是把一次性分析过程沉淀成了可复用工具。
    后续如果再有类似压测,只需要:

    1.把 JTL 文件放到指定目录。
    2.配置场景名称和文件命名规则。
    3.执行脚本。
    4.自动生成客户版报告。

    这类自动化脚本非常适合数据库网关、数据安全、SQL 审计、脱敏代理、数据库中间件等产品的性能验证场景。综上分析,本次性能测试满足:未来可以通过集群节点的横向扩展,快速支持业务发展、行业监管带来的更高的数据安全管控要求。

    十一、总结

    完整 Python 脚本我已经整理成可复用版本,包含:

    • JTL 批量解析
    • 性能指标计算
    • 源库基线对比
    • HTML 报告生成
    • SVG 图表内嵌

    如果你也在做 JMeter 压测分析、数据库网关性能验证、脱敏代理性能测试,可以关注我。
    关注后可获取完整源码和使用说明。

    赞(0)
    未经允许不得转载:171主机测评 » 我用 Python 把几十个 JMeter 压测结果文件,一键生成了客户级性能分析报告
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址