jvm-sandbox-repeater是基于阿里sandbox做的引流回放工具,开源的页面功能比较简单,但是基于核心功能完全可定制自己的引流回放平台(需二次开发)。
优点:针对查询接口通过录制沉淀用例,减少用例沉淀成本,提高自动化效率
缺点:针对写接口之类的可能不太友好,根据经验需要定制化配置字段mock或链路方法、中间件mock等
可使用场景(自己YY的,大家集思广益):
●录制沉淀用例
●抓包
●录制后修改作为mock使用
●定时回放作为环境稳定性的监测工具
部署方法
下载并安装jvm-sandbox
# 下载最新版本的JVM-SANDBOX
wget http://ompc.oss-cn-hangzhou.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
# 解压
unzip sandbox-stable-bin.zip
启动开发应用
本人测试使用开发代码本地启动,非本地的可使用命令获取进程信息
获取应用进程号,可参考下图获取
挂载目标应用
# 进入沙箱执行脚本
cd sandbox/bin
# 目标JVM进程10533(对应需要监控的应用程序进程号)
./sandbox.sh -p 10533 -P 12580
挂载成功后会提示
卸载沙箱(需要卸载时执行)
./sandbox.sh -p 10533 -S
jvm-sandbox[default] shutdown finished.
下载并安装jvm-sandbox-repeater
git clone GitHub - alibaba/jvm-sandbox-repeater: A Java server-side recording and playback solution based on JVM-Sandbox
装置 repeater
运行项目目录下的 bin/install-repeater.sh 即可,确认执行成功无异常信息
调整 console 工程中对应配置
在 repeater-console/repeater-console-start/src/main/resources/application.properties ,调整 mysql 相干配置,改为和本人本地 mysql 数据库统一
同时请初始化数据库内容,初始化的sql文件在:repeater-console/repeater-console-dal/src/main/resources/database.sql
初始化胜利,应该会创立了 repeater 这个数据库,且包含上面四个表
启动本地mysql
修复官网仓库里 console 一些代码问题。
●修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java 中的 return "/replay/detail"; ,改为 return "replay/detail"; ,去掉双引号外面第一个 /
●修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java 中的 return "/regress/index"; ,改为 return "regress/index";,去掉双引号外面第一个 /
启动 console
# 在 repeater 项目根目录进行
mvn install -DskipTests && java -jar repeater-console/repeater-console-start/target/*.jar
启动胜利,应该呈现相似上面的日志:
... 2020-12-28 07:40:27.259 INFO 32116 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8001 (http) 2020-12-28 07:40:27.265 INFO 32116 --- [ main] c.a.repeater.console.start.Application : Started Application in 7.532 seconds (JVM running for 8.065)
应用界面化的 console 进行录制回放
访问:http://127.0.0.1:8001/regress/index.htm 即可打开平台页面
●前面sandbox挂载成功在“在线模块”可进行查看,进行确认
●“配置管理”修改配置信息,可参考如下配置
其中httpEntrancePatterns对应需要录制接口的前缀
配置的说明如下可参考
配置名 |
配置含义 |
参数说明 |
备注 |
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 |
●推送配置(确认弹窗提示成功)
●使用手工、自动化脚本或postman调用对应的接口(本人是本地起的开发服务,所以直接访问本地服务)
●平台确认流量采集
●点击回放可进行回归使用
下面的回放失败是开源工具的bug感觉,自己二次开发可以针对修复掉