文章目录
1 简介
简单来说就是goreplay抓取线上真实的流量,并将捕捉到的流量转发到测试服务器上。《github源码》 : https://github.com/buger/goreplay
2 原理
3 使用场景
什么时候可以试用goreplay?
简单写几点场景,具体还是根据实际需求来。
Case 1
上线前在预发布环境,使用线上真实的请求,检查是否准备发布的版本,是否具备发布标准
Case 2
压力测试完成后,用线上真实的请求,加速后回放至测试环境,检查是否有报错等问题
Case 3
abtest
用线上的流量转发到预发,检查相同流量下一些指标的反馈情况,检查核心数据是否有改善、优化
等等
具体case还需要根据自己的需求,灵活改变。
case 4
系统重构时,复制真实线上环境流量到被测试环境进行回归,相当于在不影响业务的情况下提前上线检测系统潜在的问题。
case 5
可以将录制的流量作为用例管理起来进行日常自动化归回。
case6
录制线下开发和测试的第一次执行的用例,以后可以用第一次录制的用例反复回放测试,避免重复造用例,节省测试与开发时间。
优势
低成本:无需编写测试用例,通过流量录制形成丰富的测试用例。
高覆盖:一方面线上大量真实流量确保覆盖率,另一方面支持中间过程的验证,例如发送消息的内容、中间计算过程等等的全对象的对比验证,传统手工编写验证点很难实现。
代码侵入:是通过抓取http包获取的流量,不需要再代码中加入埋点。
4 安装
4.1 使用root用户安装(开发和测试环境)
# mkdir -p /Data/apps/gor
# cd /Data/apps/gor
# wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
# tar xvf gor_1.0.0_x64.tar.gz
开启普通用户也可以取网络权限,默认只有root有权限抓取套接字。(CAP_NET_RAW:允许使用原始套接字,CAP_NET_ADMIN:允许执行网络管理任务)
# setcap "cap_net_raw,cap_net_admin+eip" /Data/apps/gor/gor
建立gor日志目录
# mkdir -p /Data/logs/gor
授权所有用户都可以写
# chmod 777 /Data/logs/gor
4.2 使用root用户安装(生产环境)
生产环境,限制只有root和特定用户组有/Data/apps/gor/gor命令的执行权限。这里只允许root和gor组用户对/Data/apps/gor/gor有执行权限
# mkdir -p /Data/apps/gor
# cd /Data/apps/gor
# wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
# tar xvf gor_1.0.0_x64.tar.gz
新建gor用户
# useradd gor
设置gor用户密码
# passwd gor
修改/Data/apps/gor/gor用户为root,组为gor
# chown root:gor /Data/apps/gor/gor
只允许root和gor组用户对/Data/apps/gor/gor有执行权限,其他用户没有权限执行/Data/apps/gor/gor命令
# chmod 0750 /Data/apps/gor/gor
开启普通用户也可以抓取网络权限,默认只有root有权限抓取套接字。(CAP_NET_RAW:允许使用原始套接字,CAP_NET_ADMIN:允许执行网络管理任务)
# setcap "cap_net_raw,cap_net_admin+eip" /Data/apps/gor/gor
建立gor日志目录
# mkdir -p /Data/logs/gor
只能gor用户可以写这个目录
# chown gor:gor /Data/logs/gor
4.3 安装其他说明
《使用非root用户运行gor》: https://github.com/buger/goreplay/wiki/Running-as-non-root-user
《cap_net_raw,cap_net_admin说明》: https://blog.csdn.net/mark20170902/article/details/53422384/
《setcap用法》: https://blog.csdn.net/u011294519/article/details/88244391
5 使用
5.1 抓取流量,实时终端显示
–input-raw :8000 表示监听http协议8000端口
–output-stdout 表示输出到终端
–input-raw-track-response 输出相应的http头部和包体信息
[dev@ws1.clevercode.stage.bj1 gor]$ /Data/apps/gor/gor --input-raw :8000 --output-stdout
Version: 1.0.0
1 e5abb903ce128b446bcb2967e3b7dc35c587a607 1557477540775912597
GET /health.json HTTP/1.1
Accept: application/json, application/*+json
User-Agent: Java/1.8.0_51
Host: localhost:8000
Connection: keep-alive
输出相应的http头部和包体信息
[dev@ws1.clevercode.stage.bj1 gor]$ /Data/apps/gor/gor --input-raw :8000 --output-stdout --input-raw-track-response
5.2 抓取流量到日志文件
5.2.1 录制
timeout 60 表示只录制60秒后程序自动停止 ,这个一定要加上时间限制负责。如果没有时间限制,日志量过大容易把磁盘打满。
–input-raw :8000 表示监听http协议8000端口
–output-file /Data/logs/gor/basepost.gor 表示输出到的录制日志文件位置。
详细说明:https://github.com/buger/goreplay/wiki/Saving-and-Replaying-from-file
1 timeout 60 表示只录制60秒后自动停止 (只记录请求头部)
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost.gor > /dev/null 2>&1 &
2 安装小时切割日志文件,并且开启日志追加模式,不会进行日志默认小分片
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost-%Y-%m-%d-%H.log --output-file-append > /dev/null 2>&1 &
3 安装小时切割日志文件,并且开启日志追加模式,不会进行日志默认小分片,.gz压缩文件格式
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost-%Y-%m-%d-%H.gz --output-file-append > /dev/null 2>&1 &
4 timeout 60 表示只录制60秒后自动停止 (请求头部+响应头部+包体)
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost.gor --input-raw-track-response > /dev/null 2>&1 &
查看日志文件,可以看到1分钟的录制,它切割成为了很多个小文件,每个文件大小约200K
5.3.2 回放
方式1:只回放单个文件
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_0.gor --output-http "http://localhost:8000"
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_1.gor --output-http "http://localhost:8000"
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_2.gor --output-http "http://localhost:8000"
方式2:回放多个文件
合并文件
# cat /Data/logs/gor/basepost_*.gor > /Data/logs/gor/basepost.gor
一起回放
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost.gor --output-http "http://localhost:8000"
方式3:指定测试环境的ip,加上指定的Host。(101.1.21.141:clevercode-test.bj1.info.net ,这加上–output-http-header “Host: intf.clevercode.info.net”,是因为录制的线下流量的日志里面的host是:localhost。但是测试机器上面nginx监听的8000端口需要指定 server_name intf.clevercode.info.net)【测试环境】
合并文件
# cat /Data/logs/gor/basepost_*.gor > /Data/logs/gor/basepost.gor
一起回放
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost.gor --output-http "http://101.1.21.141:8000" --output-http-header "Host: intf.clevercode.info.net"
5.3 抓流量直接同步到其他机器
timeout 120 录制120s
/Data/apps/gor/gor --input-raw :8000 录制本机器的8000端口
–output-http “http://clevercode-test.bj1.info.net:8000” 输出到目标机器的端口
–output-http-header “Host: intf.clevercode.info.net” header中加入Host信息
实时录制+播放
# sudo timeout 120 /Data/apps/gor/gor --input-raw :8000 --output-http "http://clevercode-test.bj1.info.net:8000" --output-http-header "Host: intf.clevercode.info.net"
6 其他参考资料
《github源码》 : https://github.com/buger/goreplay
《使用goreplay流量回放实践》 : https://www.jianshu.com/p/501218e0beb1
《流量拷贝工具-goreplay介绍》: https://www.wafunny.com/blog/go/goreplay.html
《goreplay 使用经验》: https://yq.aliyun.com/articles/609296
《goreplay-使用真实流量测试你的应用》: https://www.jianshu.com/p/858b5099a193
《携程QA-流量回放系统揭秘》:https://mp.weixin.qq.com/s/qJ9WWW04T_1lNnQkH-_5rw
《rdebug》: https://github.com/didi/rdebug/blob/master/README_zh_CN.md
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!