GoReplay开源工具使用教程

目录

一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

二、GoReplay录制与重播

1、搭建练习接口

2、录制命令

3、重播命令

三、GoReplay单个命令

1、常用命令

2、其他命令

3、命令示例

4、性能测试

5、正则表达式

四、gorepaly组合命令

1、组合命令实例

2、gorepaly注意事项


一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

1,项目下载地址:

https://github.com/buger/goreplay/releases/tag/1.3.3

2,mac、Linux可以直接在终端输入

curl -L -O https://github..com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_mac.tar.gz

3,解压压缩包

tar -zxvf gor_1.3.3_mac.tar.gz

4,配置环境变量,mac、Linux修改/ect/profile文件,在末尾添加

配置goreplay环境变量

GOR_HOME="yourPath/goreplay"

export PATH="GOR_HOME:PATH"

5,验证环境,显示版本号就安装完成

gor version

二、GoReplay录制与重播

1、搭建练习接口

你可以通过调用快速启动服务器gor file-server :8000,这将在端口上启动当前目录的简单文件服务器8000

gor file-server :8000

2、录制命令

1,录制所有http请求,以下命令是录制5000端口全部的http请求,接受之前的录制文件./log/logrequests_0.gor,并且把新的录制文件输出到./log/logrequests.gor文件,请注意,默认情况下 GoReplay 不跟踪响应,您可以使用--output-http-track-response选项启用它们,在文件名中使用日期变量:%Y-%m-%d-%H

sudo gor --input-raw 127.0.0.1:5000 --output-stdout --output-file='./log/logrequests.gor' -output-file-append --output-file-max-size-limit "4294967296"

3、重播命令

1,下列这行命令展示了使用录制的文件重播请求,所有记录的请求都到达第二个服务器,并且它们将以与记录时相同的顺 序和完全相同的时间重播。--input-file参数接受录制的文件,--output-http参数接受需要重播的服务器,出现FileInput: end of file 提示,说明重播完成

gor --input-file='./log/logrequests_0.gor' --output-http='http://127.0.0.1:5000'

三、GoReplay单个命令

1、常用命令

当您需要仅捕获流量的特定部分(例如 API 请求)时,匹配非常有用。可以按 URL、HTTP 标头或 HTTP 方法进行匹配,匹配方式使用正则表达式。

-http-allow-header value 根据请求头匹配,其他内容将被排除

-http-allow-method value 根据请求方式匹配,其他内容将被排除

-http-allow-url value 根据请求url匹配,其他内容将被排除

-http-disallow-header value 根据请求头匹配,其他内容将被记录

-http-disallow-url value 根据请求url匹配,其他内容将被记录

-http-header-limiter value 根据请求头,接受一部分请求

-http-param-limiter value 根据url,接受一部分请求

-http-original-host 保留原始请求头,默认gor会用--output http提供的主机替换Host http头

-http-rewrite-header value 根据匹配的内容重写请求头

-http-rewrite-url value 根据匹配的内容重写请求url

-http-set-header value 向请求中添加额外的请求头

-http-set-param value 设置请求中的param参数,如果已经存在,将会被覆盖

-input-file value 从文件读取请求

-input-file-loop 循环读取文件,一般用于性能测试

-input-raw value 从给定端口捕获流量,需要root权限

-input-tcp-secure 启用TLS证书,需要指定证书跟密钥

-input-tcp-certificate string TLS开启时,指定的证书路

-input-tcp-certificate-key string TLS开启时,指定的密钥路径

-output-file value 将请求写入文件

-output-file-queue-limit int 区块队列的长度。默认值:256

-output-file-size-limit value 每个区块的大小。默认值:32mb

-output-http value 将传入请求转发到给定的http地址

--output-http-track-response 默认情况下 GoReplay 不跟踪响应,加上这个参数跟踪响应

--input-raw-track-response 默认情况下input-raw不拦截响应,仅拦截请求。您可以加这个参数开启响应跟踪。启用后,您将能够访问中间件和output-file

--input-file-dry-run 试运行模式,来预览需要多长时间以及给定文件输入中有多少个请求。它还会告诉您有用的信息,例如请求之间的最短和最长时间,以及第一次请求的时间。

--input-raw-max-wait 跳过大的延迟,选项(以秒为单位),该选项允许跳过录制文件中的长时间停顿。

--input-raw-allow-incomplete 如果打开,Gor将记录丢失数据包的HTTP消息

2、其他命令

-input-raw-engine libpcap 选择libpcap(默认)或者`raw_socket`拦截流量

-output-http-debug 启用http调试输出。

-input-raw-realip-header string 如果不为空,默认在请求头加上实际ip,X-Real-IP

-input-raw-track-response 如果启用,Gor将跟踪请求之外的响应,并且它们将可用于中间件和文件输出

-input-kafka-host string 向Kafka发送请求和响应统计信息

-input-kafka-json-format 启动表示消息是json格式而不是GoReplay格式

-input-kafka-topic string 向Kafka发送请求和响应统计信息

-output-kafka-host string 从Kafka读取请求和响应统计信息

-output-kafka-json-format 如果启用,它将把消息从GoReplay文本格式序列化为JSON

-output-kafka-topic string 从Kafka读取请求和响应统计信息

-input-dummy value 用于测试输出。每1s发出'get /'请求

-output-file-append 刷新的块是否附加到存在文件,只保留一个流量文件

-output-file-flush-interval duration 强制刷新文件缓冲区的时间间隔,默认为1s,一般不需要改动

-output-http-elasticsearch string 向ElasticSearch发送请求和响应统计信息

-output-http-redirects int 启用重定向的频率

-output-http-response-buffer int HTTP响应缓冲区大小,此大小之后的所有数据都将被丢弃

-output-http-stats 每5秒向控制台报告一次http输出队列统计信息

-output-http-timeout duration 指定HTTP请求/响应超时。默认情况下为5s

-output-http-track-response 如果启用,HTTP输出响应将设置为所有输出,如stdout、file等

-output-http-workers int 以多少个协程同时产生http请求,默认是动态,官方文档显示无限制,实际代码中设置了10,这块有争议

-output-null 用于测试输入。删除所有请求

-output-stdout 用于测试输入。只是将来自输入的数据打印到控制台。

-output-tcp value 用于Gor实例之间的内部通信sh

-output-tcp-secure 使用TLS安全连接--另一端的输入文件也应该打开TLS

-output-tcp-stats 每5秒向控制台报告一次TCP输出队列统计信息

-verbose 启用更详细的输出

3、命令示例

命令区分大小写,参数后面的精准匹配的时候不区分大小写,用正则表达式区分大小写

1,提示-bash: !': event not found,输入echo $-显示himBH,原因是确认是由于 H - histexpand 模式打开了导致。命令行下,双引号里面用了 ! 的话,Shell 会以为要执行历史展开,从而导致报错,解决方法:关闭 histexpand,输入set +H,再输入echo $-显示himB就可以了。

2,把双引号替换成单引号

从perf文件读取请求,添加param参数goreplay=1,添加header信息'perf':'yes',保留原始请求头,匹配url为^/user/authgetUserInfo$,输出到perf.log文件

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url ^/user/authgetUserInfo?.+

试运行模式,您无需执行实际重播即可获取有关文件内容的信息。仅支持goreplay1.3版本以上

例如,它可以告诉您文件中有多少个请求,以及重播这些请求需要多长时间。

报告示例:

gor --input-file=流量文件 --output-stdout --input-file-dry-run

找到的记录:192

格式错误的记录:<nil>

已处理的文件:1

处理的字节数:88512

最大等待时间:71.369ms

最短等待时间:15.884ms

首次等待:55.401ms

以目前的速度重放需要7.82033秒。

找到0条时间戳不正常的记录

添加请求头,goreplay:1

goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-header 'goreplay:1'

添加param参数,perf=1

goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-param 'goreplay=1'

匹配header的Host字段包含baidu.com

goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-allow-header '^Host: .*.baidu.com.*'

匹配url为/user开头的所有接口,后面路径包含空用*,不包含空用+,[^\/]表示除了匹配/所有的字符

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user.+'

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user/[^\/]'

匹配以getUserInfo结尾的所有接口

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^.*getUserInfo?.+'

匹配url为/user开头,排除结尾是/getUserInfo的所有接口,输出到perf.log文件

以下是用--http-allow-url搭配--http-disallow-url参数组合匹配的结果,同时满足a跟b两个条件,可以正常匹配

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user.*' --http-disallow-url '.\*getUserInfo'

更新头部信息跟param参数,如果参数存在,则更新,如果不存在,则添加,不能删除

goreplay --input-file='perf_0.log' --http-set-param 'goreplay=0' --http-set-header 'perf':'no' --http-original-host --output-file='perf.log'

重写请求url,匹配/user开头的url重写为/api/user开头,当重写跟匹配url一起时,先匹配url再重写url,需要匹配的url是重写之前的url

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '/user/([^\/]+):/api/user/1' --http-allow-url '\^\\/user.\*'

重写版本号,user重写为userv2

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '^/user/([^/]):/userv2/$1' --http-allow-url '^/user/[^/]'

匹配/user/orders/detail开头,结尾是大写字母+数字,8到18位的字符串

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^/user/orders/detail/[A-Z0-9]{8,15}'

可以同时匹配到,/user/orders/detail/LBL67047,/user/orders/detail/GSHN7W61400M120,用^/user/orders/detail/[a-z0-9]{8,15},不能匹配大写字母

4、性能测试

  • 以50%的速度回放
  • goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000:50%'
  • 以秒50的速度回放
  • goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000|50'
  • 文件回放完继续循环
  • goreplay --input-file='perf' --http-original-host --output-tcp '127.0.0.1:5000' --input-file-loop
  • 从文件读取输出到http
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout
  • 从文件读取,输出到http,同时指定python中间件处理
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

5、正则表达式

  • 注意:goreplay无论哪个版本都不支持正反向正向预查和负向预查
  • 匹配以/user开头,^/user
  • 匹配以/user结尾,/user$
  • 匹配1个或1个以上,+
  • 匹配0,1或1个以上的,*
  • 匹配0或者1个,最多一个多,?
  • 匹配否定字符,[^]表示匹配任何字符集包括\n,[^abc]表示匹配非a或者b或者c的字符集,匹配u/s/e/r中的任一字符,[user]
  • 匹配a-z区间所有的大小写字母,[a-z][A-Z]
  • 匹配所有的字母下划线,/\w\g
  • 精准匹配以/abt开头/userinfo结尾,^/abt/userinfo$,可以匹配到/abt/userinfo,不能匹配到/abt/userinfo/a, /a/abt/userinfo,/abt/a/userinfo
  • 匹配以/abt开头/userinfo结尾,中间至少一个路径,^/abt/\w+/userinfo,匹配/abt/aaa/userinfo,不能匹配/abt/userinfo,匹配以/abt开头/userinfo结尾,中间0-1一个路径,\^/abt/\\w\*/userinfo,匹配abt/aaa/userinfo,abt/userinfo
  • 匹配/user/orders/detail接口结尾是大写字母跟数字16位组合,^/user/orders/detail/[A-Z0-9]+$,/user/orders/detail/GSHN7Q02C002006
  • 匹配以'/user'开头并且不以'/auth/getUserInfo'结尾的任意字符串,^\/user(?!\/auth\/getUserInfo).*$ (不能在gor使用)
  • 匹配,/user/orders/track/GSHN7B38R00NGA4,/user/auth/mc/getKey,/user/auth,排除,/user/auth/getUserInfo

四、gorepaly组合命令

1、组合命令实例

  1. 这里用到了改变速率命令,以500%的速度输出用|500%,以每秒500个请求输出用:500
    如果输出的文件名称跟时间相关,输出的文件名优先级高,比如14跟15点都是同一个快内,但是文件名会拆分成两个
    用--output-file-queue-limit 0设置队列为0
    gor --input-file 'perf|500%' --output-file '%Y-%m-%d-%H.log' --http-disallow-url '^/user/orders/detail/[A-Z0-9]{8,15}' --http-disallow-url '\^/\\w.\*.html' --output-file-queue-limit 0
  2. 用命令匹配url同时允许多个url,允许a-url,同时允许b-url,匹配的结果会包括aurl或者b-url的所有url,url=a+b
    gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-allow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0
  3. 用命令匹配url同时不允许多个url,不允许a-url,不同时允许b-url,匹配的结果会包括除了满足a-url或者b-url的所有url,url=url-(a+b)
  4. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-disallow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-disallow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0
  5. 用命令匹配url一个允许一个不允许,允许a-url,不同时允许b-url,匹配的结果会包括满足a-url减去b-url的所有url,url=a-b
  6. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-disallow-url '\^/\[a-zA-Z\]+/auth/\[a-zA-Z\]+?.+' --output-file-queue-limit 0
  7. 用命令匹配允许url并且重写url跟header,允许a-url,允许b条件,重写a-url为/api/a-url,重写header为User-Agent: gor,允许处理原始数据,然后处理重写url跟header,输出后的内容,url=/api/a+b,header=重写后的a+重写后的b
  8. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+' --http-allow-url '\^/pdsearch/\[0-9a-zA-Z\]+/.+' --http-rewrite-url '(^/user/[a-zA-Z]+/[a-zA-Z]+?.+$):/api$1' --http-set-header 'User-Agent':'gor' --output-file-queue-limit 0
  9. 从url录制所有的请求,需要root权限
  10. sudo gor -input-raw '127.0.0.1:5000' --output-file 'test.gor' --output-stdout --output-file-queue-limit 0
  11. gor命令搭配中间件处理
  12. gor --input-file 'test.gor|800%' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

2、gorepaly注意事项

1,gor录制的时候,流量会存在不完整的情况,如果直接使用中间件处理,容易报错或者出现异常,如果出现异常后,没有日志返回结束或者nohup.txt没有返回,但是gor进程已经结束了,这种情况需要手动关闭node中间件进程

2,出现异常流量的时候,建议更换流量文件或者先用gor回放到文件,然后在使用回放后的文件用中间件处理

3,回放时直接使用中间件&gor命令回放到服务器时,会消耗部分性能,比直接从流量文件回放效率低,建议流量文件先使用中间件或者命令回放一次到文件,然后直接使用文件回放到服务器,这样效率较高

4,录制的流量包体过大,需要加参数,--input-raw-override-snaplen

5、 回放流量的时候,有时候会流量波动大,偶尔流量比较小,需要加上参数--input-file-max-wait=200ms,允许跳过录制文件中的超过200ms的延迟

相关推荐
卖个几把萌9 小时前
【06】Selenium+Python 定位动态ID
python·selenium·测试工具
测试杂货铺11 小时前
如何进行Appium实现移动端UI自动化测试呢?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
JEECG低代码平台13 小时前
【免费开源】JeecgBoot单点登录源码全部开源了
低代码·开源
棱镜七彩13 小时前
护航开源大赛,赋能数字未来
开源
1997950143215 小时前
2D/3D 数码视频显微镜
大数据·测试工具·3d·自动化·视觉检测·制造
互联网杂货铺15 小时前
Newman+Jenkins实现接口自动化测试(超详细总结)
自动化测试·软件测试·python·测试工具·职场和发展·jenkins·测试用例
代码小鑫15 小时前
A058-基于Spring Boot的餐饮管理系统的设计与实现
java·数据库·spring boot·开源·毕业设计
杨荧16 小时前
【开源免费】基于Vue和SpringBoot的水果购物网站(附论文)
前端·javascript·jvm·vue.js·spring boot·spring cloud·开源