流量录制回放工具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来尝试了下,如果真的运用到实际项目当中,还得继续探索

我们下期再会

posted @ 2022-05-07 08:53  温一壶清酒  阅读(5998)  评论(2编辑  收藏  举报