流量录制回放工具jvm-sandbox-repeater入门篇——录制和回放
在上一篇文章中,把repeater服务部署介绍清楚了,详细可见:流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
今天在基于上篇内容基础上,再来分享下流量录制和回放的相关内容。
启动被测服务
克隆源码
git clone https://github.com/chenhengjie123/gs-rest-service.git
这个项目是在看其他帖子看到的,是个开源的demo,我在这也引用下。
mvn install
进入到项目路径:/gs-rest-service/complete,使用mvn install
命令,把项目中打好的包,放到本地仓库
出现如下界面,说明命令执行成功
在 target 目录下,可以看到,生成了一个jar包,如下所示
启动项目
在 target 目录下,使用命令 java -jar gs-rest-service-0.1.0.jar
启动项目,出现如下所示内容,项目启动成功
启动/关闭sandbox
attach启动
先获取项目PID,有2种方式
方式一:在启动项目的时候,会展示PID,如上图所示
方式二:使用命令ps -ef|grep gs-rest-service-0.1.0.jar
可以获得,我这里获取到的PID是:12836,如下所示
获取到项目PID后,到 sandbox 目录 /root/sandbox/bin
下,使用命令./sandbox.sh -p 12836 -P 8002
,运行命令后,出现如下内容,说明成功
也可以通过查看sandbox日志来确定,是否有启动成功,日志如下所示:
参数说明
- p 被录制应用进程号
- P repeater启动端口,这个每个人定义的都可以不同,一定是一个未占用的端口
attach 模式下,录制应用名和录制环境这两个参数都会被默认为 unknown
attach关闭
运行命令./sandbox.sh -p 12836 -S
,出现如下内容,jvm-sandbox关闭成功
配置说明
repeater-logback.xml
该配置文件主要是控制 repeater 的日志打印路径地址以及打印等级。
一般会在需要调整日志等级的时候修改。
实际生效的配置是位于~/.sandbox-module/cfg 中的 repeater-logback.xml。
在项目的 bin 目录下也有一份 repeater-logback.xml,这份是在执行安装脚本的时候会被复制到~/.sandbox-module/cfg 下的。
每次修改这份配置,都需要重启 repeater 才能生效。
可以修改日志级别,默认是info
录制回放配置字段
这个配置,主要依赖com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig类,参考之前的博文,引用下字段配置说明,如下所示:
配置名 | 配置含义 | 参数说明 | 备注 |
---|---|---|---|
pluginIdedentities | 录制所使用的插件列表,配置了相应的插件名称,才能启用对应类别插件类别的录制 | 插件名称有效值有:"http", "java-entrance", "java-subInvoke", "mybatis", "redis","ibatis","dubbo-consumer","dubbo-provider" | 1、插件配置生效还需要~/.sandbox-module/plugins/有对应的插件 jar 包。2、该参数有效值字段对应的取值是源码中实现了InvokePlugin的类的identity方法。 |
repeatIdentities | 回放所使用的插件列表,配置了对应的插件,才能进行对应类别的回放 | 插件名称有效值有:"http", java", "dubbo" | 1、插件配置生效还需要~/.sandbox-module/plugins/有对应的插件 jar 包。2、该参数有效值字段对应的取值是源码中实现了Repeater的类的identity方法。 |
httpEntrancePatterns | 需要录制和回放的 http 接口,需要同时在 pluginIdedentities 和 repeatIdentities 中都配置了http这个配置才生效 | 链接的路径 | 参数支持正则表达式:"^/alertService/.*$" |
javaSubInvokeBehaviors | 需要录制和 mock 的 java 方法的配置,需要 pluginIdedentities 配置了java-subInvoke这个配置才生效 | 类名、方法名、以及是否包含子方法(若为 true,则匹配该类下的所有子类或者实现类,实际是否可用,有待验证),支持正则表达式 | 如下配置的意思就是 com.test.server.utils 包下所有类和所有方法{"classPattern": "com.test.server.utils.","methodPatterns": [ "" ],"includeSubClasses": false} |
javaEntranceBehaviors | 需要录制和回放的 java 方法的入口,需要同时在 pluginIdedentities 配置了java-entrance以及 repeatIdentities 配置了java这个配置才生效 | 类名、方法名、以及是否包含子方法(若为 true,则匹配该类下的所有子类或者实现类,实际是否可用,有待验证),支持正则表达式 | 如下配置的意思就是 com.test.utils 包下所有类和所有方法{"classPattern": "com.test.utils.","methodPatterns": [ "" ],"includeSubClasses": false}如果该入口方法在某个 http 入口的调用链路下,可能不会被录制到,如 com.test.controller.hello() 方法,本身对应着 “/hello 的访问路径,则录制时无法录制到以这个 hello 方法为入口的 java 录制记录” |
pluginsPath | 插件路径 | String,默认填 null 即可 | 默认填 null 即可 |
exceptionThreshold | 异常发生阈值;默认 1000 当ExceptionAware感知到异常次数超过阈值后,会降级模块 | Integer,默认填 1000 即可 | 当前只使用过 1000,未出现过降级情况。当出现降级则不再进行任何录制。涉及的关键方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access |
degrade | 开启之后,不进行录制,只处理回放请求 | boolean,默认填 false 即可 | 当前只使用过 false,按照字面理解就是当这个改为 true 之后,不再进行录制。涉及的关键方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access |
useTtl | 是否开启 ttl 线程上下文切换,开启之后,才能将并发线程中发生的子调用记录下来,否则无法录制到并发子线程的子调用信息,原理是将住线程的 threadLocal 拷贝到子线程,执行任务完成后恢复 | boolean,默认填 true 即可 | 默认使用 true,开启线程跟踪 |
sampleRate | 采样率;最小粒度万分之一 | Integer 默认填 10000 即可 | 当前只使用过 10000,可以结合这个方法理解com.alibaba.jvm.sandbox.repeater.plugin.core.trace.TraceContext#inTimeSample |
repeater-console页面
配置管理
我们通过repeater-console页面,查看对应的配置,url为:http://ip:port/regress/index.htm
服务启动,会有默认的配置,如下所示:
这里需要修改下,因为默认的配置,有些跟我们启动的项目不一样,直接编辑即可,字段说明在刚才已有讲解
在线模块
以attach模式启动sandbox,环境和应用名都是unknown,如下所示:
流量录制
完成上述配置后,我们来录一个请求试下,访问:http://ip:port/greeting?name=yihuqingjiu,页面返回内容,可以在启动的项目下,查看对应日志,如下所示:
验证是否有录制成功,有2种方式
页面查看
直接通过repeater-console的在线流量页面查看,如果有刚操作的请求,说明录制成功,如下所示:
日志查看
查看repeater日志,有相对应的成功日志,如下所示:
相对应的,可以看下数据库是否正常落值,查看record表,是有对应数据的,如下所示:
上述方式验证,说明流量录制成功了
流量回放
流量回放的话,就直接点击已录制的请求,右侧有个回放按钮,直接点击即可。
我们来尝试一下,操作回放后,查看回放详情
看截图,看到回放的结果是失败的,为何失败呢,看下具体信息
因为id值不一致,所以判断回放失败,如下所示:
我自己写了个简单的demo,生成随机数的,代码中做了个mock,所以每次回放都是成功的
启动服务、修改配置、流量录制这些过程就不重复了,直接看下回放结果
回放详情如下所示:
回放差异对比如下所示:
问题
每次分享内容,都会遇到些问题,所以整理下。
录制不成功
录制遇到最大的一个问题,就是录制不成功,后面查日志和对比配置,是正则表达式写错的问题
repeater下的日志,如下所示:
日志中明确提示ignore this request
后面排查repeater-console页面配置管理中的正则表达式,发现正则写错,没有匹配到url的原因导致。
修改配置不生效
这个问题算是上一个问题的续集,为啥这么说呢。我之前把配置修改后,再次请求去录制,发现还是不成功
后来发现,修改repeater配置,需要重启项目,attach到sandbox,只有在attach的时候,才会重新去读取配置
服务启动顺序
这个点,也不算问题吧,但我也遇到过,就是服务启动的顺序。
先启动repeater-console服务
再启动被测服务
最后通过attach模式启动sandbox
如果中途有修改repeater-console配置项,上述步骤重来即可
以上就是今天分享的内容了,录制和回放只是以简单的demo来尝试了下,如果真的运用到实际项目当中,还得继续探索
我们下期再会