作者:休祯
背景
为什么需要流量回放
无论是面向即将上线的新版本做最后的性能测试,还是在遇到棘手的故障时帮助开发人员快速定位问题原因,流量回放技术都发挥着不可或缺的作用。使用真实世界的流量数据进行回放能使性能测试过程更加接近实际运行状态,确保新版本的性能真正满足用户的预期。同时准确的流量回放能够快速复原问题发生的现场,有效缩短故障响应和解决时间。
如何实现流量回放
传统上可以用一些开源工具实现流量回放功能,经典的有如 GoReplay,Tcpreplay, JMeter Access Log Sampler 等工具。它们或多或少有些使用痛点。
GoReplay
使用 GoReplay 可以准确地捕捉实时流量并回放。然而,作为先进工具的 GoReplay,仍有一些使用痛点:
- 需要具备较高权限以实时录制服务器特定端口的请求和响应,并可能会对服务器性能产生一定影响。
- 随着登录态信息的失效,原样回放的请求会失败。
- 需要搭建 Go 运行环境并手动开启录制,对于初次使用的工程师来说,具有一定的前置成本。
- GoReplay 天然不支持分布式流量采集和流量回放。
Tcpdump & Tcpreplay
Tcpdump 用于捕获网络流量,Tcpreplay 用于回放捕获的流量。Tcpdump 可以在指定的网络接口上捕获流量,保存为文件,而 Tcpreplay 可以将这些文件回放到网络上。它主要限于较低层面的网络通信回放,对使用者知识要求较高,需要较好地理解网络协议和 TCP/IP 模型,以确保正确地捕获和回放所需的流量。同时由于是在四层网络上做的流量捕捉与回放,不感知业务层,对请求的可视化与参数替换也有不小障碍。
JMeter Access Log Sampler
和前面的流量主动录制和回放不同,JMeter Access Log Sampler 以 JMeter 为基础直接从 Access Log 发起请求,它的便利性在于可以直接从 Access Log 中读取日志,并生成 HTTP 请求进行流量回放。但对新手而言 JMeter 有其学习难度,此外直接原样回放依然可能面临着登录信息过期的挑战,同时由于其只会原样回放日志,还需要投入额外的工作量在日志预处理上。
总而言之,一般的开源流量回放工具有以下几个使用痛点:
- 不支持分布式流量采集和流量回放。
- 流量录制动作需要较高权限,并对服务端有侵入。
- 有前置学习成本或环境配置成本。
- 未处理登录态失效的问题。
- 没有参数化或者参数化困难,请求参数重写困难。
针对这几个痛点,PTS 推出基于 Access Log 回放流量的新功能。
PTS 新特性:Access Log 驱动的流量回放功能
解决痛点
针对以上流量回放开源工具的使用痛点,PTS 新功能分别以以下方式做了解决。
分布式流量采集和流量回放
PTS 流量回放新功能支持分布式流量录制能力。即便您的服务端有多台应用,只需要简单将您的网关 Access Log 投递到统一的 SLS 日志库,就能实现分布式的流量录制。同时 PTS 具备强大的分布式施压机调度能力,能调度多 region 的分布式部署的施压机发送请求,达到高倍量、真实来源的流量回放效果。
基于 Access Log 回放,服务端零侵入
新功能从旁路出发,仅依赖网关请求的 Access Log,无需在服务端挂载流量录制程序,无需额外权限,对服务端零侵入。
使用简单,所见即所得
新功能能够直接读取并解析您的 Access Log,将记录的每一次用户请求作为蓝本,同时结合阿里云 SLS 的强大日志分析处理能力,只需要您的日志存在 SLS 中,就可以轻松筛选需要的 Access Log 进行回放,实现真正意义上的“所见即所得”。
登录态难题,巧妙解决
流量回放实践中,维持用户的登录状态一直是测试中的一个痛点。新功能通过引入简易的登录接口配置机制,优雅地解决了这一难题。如您的接口需要登录后才能成功请求,您可在日志分析的结果页面简单配置登录接口和登录参数(如果您的 Access Log 中记录了登录请求,也可以直接选择登录接口,省去配置过程)。PTS 将在压测时请求该接口,并自动将 Cookie 导出供所选的接口使用,确保后续请求在正确的会话上下文中执行。
自动请求参数化,白屏化参数配置和参数替换
新功能解析您的 Access Log, 解析请求路径、请求 body 参数和 URL 参数,自动组装参数为参数文件,并在用到参数的地方做了参数替换,构造 PTS 压测场景。依托 PTS 的白屏化压测场景编辑能力,您能直接看到请求参数,并可以方便地利用用新的参数文件替换请求参数,重写请求。
其他亮点
自动化场景组装:化繁为简,大大提高压测场景配置效率
以往构建一个 PTS 压测场景可能涉及几十个接口的梳理和一个个配置,工作量巨大。新功能巧妙地从 Access Log 中自动提取请求 URL、请求参数等关键信息,您只需要在日志分析的结果页面简单选择您要压测的接口,点击确定后,即可一键组装成 PTS 压测场景。这一自动化过程将大大降低您的场景配置负担,使得原本需要数天的工作量缩短至几分钟甚至更短,极大地提升了工作效率。您可以将更多精力聚焦于测试策略优化与结果分析,而非琐碎的场景搭建上。
强大的接口 RPS 级别的压力控制能力,精确放大和缩小压测流量
面对业务的快速增长,模拟更高并发量的需求日益凸显。新功能不仅支持基于 Access Log 的精确回放,还提供了灵活的流量倍量回放能力。PTS 从您的 Access Log 中分析每个接口的每秒最大请求数,基于这个数值,您可以根据需要轻松方法和缩小压力,灵活应对各种量级的流量回放场景。
操作步骤
- 开通 SLS 日志服务 [ 1] ,将 Access Log 投递到 SLS 中。如您使用阿里云 MSE 网关,阿里云 ALB 网关或阿里云 CLB 网关,可直接开启日志投递。如果您使用自建网关,请注意 Access Log 需要符合一般规范。详见使用须知 [ 2] 。
- 登录 PTS3.0 控制台 [ 3] -创建场景-Access Log 压测。
- 确保已开通 SLS 日志服务,选择 Access Log 所在 SLS 日志 region,SLS 日志 project,SLS 日志库。设置查询参数,时间段,查询需要回放的 Access Log。
a. 确保能查出 Access Log 并且 Log 符合一般规范 [ 4] 。
- 点击左下角选择目标接口,等待日志分析完成。视查出的日志总数多少,耗时在 10 秒到两分钟不等。
5. 查看日志分析结果,并选择待压接口。
a. 如果日志中包含请求域名,且字段名在 ["host", "http_host", "authority"] 中,PTS 将会自动补全 host。同时你也可以自行修改。当前仅支持单 host,所有接口共享这个 host。
b. PTS 统计该时段内接口的请求总数,最大 QPS,分别在左右两侧列出排序图,可点击接口旁的灰色圆圈选择待压接口。已选的接口会展示在【已选目标接口】区域,点击可取消选择。
6. 登录态配置:如果请求选择的接口需要登录态信息,则需要配置登录接口。
a. 如果展示出的接口有做登录的接口,如 POST /login,可以选择【从接口选择】选项。 PTS会自动将该接口作为登录接口,使用日志中的参数,导出Cookie登录态使用,无需您手动配置。
b. 您也可以手动配置登录接口
- 输入登录接口地址,如 http://example.com/login
- 配置请求接口的 body 参数,如登录的 username,password。可以用 ${} 引用参数,用到的参数需要点击配置参数文件去做配置,上传或选择 csv 格式的参数文件,然后配置参数名。
7. 如果请求选择的接口不需要登录,则勾选【目标接口无需登录】。
- 点击确定后,跳转到 PTS 场景编辑页面,可在此页面进一步编辑生成的场景,也可以直接进行调试和压测。
a. 点击【数据导出】可编辑使用的 Cookie 数。如需要使用其他登录态比如 token,点击登录接口后,设置出参,并在数据导出节点配置导出。
b. 点击任意接口,可为接口添加 Header。
c. 下滑到压力模式配置,可以配置施压模型和施压量级。如果需要内网环境才能请求,也可以在此配置 VPC 信息。
- 开始压测。
可以在压测中页面看到请求 QPS 时序变化图,请求成功率,接口维度的 metrics 信息。还能进行场景调速,实现 API 维度的速率调整。
从请求采样日志中可以看到,请求已经带上登录接口返回的 cookie 和从日志中抓出来的参数,回放了 Access Log 中记录的请求。
- 查看压测报告。可在压测报告中看到全场景维度,api 维度的 metrics 信息和时序图,请求采样日志等等。
点击此处立即开通性能测试 PTS,领取 5000 VUM 额度免费试用!加入钉钉群(群号:44850859)获得在线技术支持。
相关链接:
[1] SLS 日志服务
https://sls.console.aliyun.com/
[2] 使用须知
https://help.aliyun.com/zh/pts/how-to-initiate-pressure-testing-from-access-log#c34e461632ctg
[3] PTS3.0 控制台
https://ptsnext.console.aliyun.com/#/create/scene
[4] 一般规范
https://help.aliyun.com/zh/pts/how-to-initiate-pressure-testing-from-access-log#c34e461632ctg
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。