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

    我们下期再会


    __EOF__

  • 本文作者: 温一壶清酒
  • 本文链接: https://www.cnblogs.com/hong-fithing/p/16222644.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    VBA基础知识点总结
    力扣:322. 零钱兑换
    【Java 进阶篇】深入了解 Bootstrap 按钮和图标
    java家庭理财收支管理系统
    Photoshop套索工具使用指南:解锁自由选区的艺术
    Apifox接口调试工具
    教你如何在map上添加自定义控件
    拥抱AI-ChatGPT:人类新纪元
    jxTMS设计思想之能力扩展
    超越传统插值:利用深度学习提升视频帧率与清晰度
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/16222644.html