开源测试工具 [jvm-sandbox-repeater 学习笔记][入门使用篇] 2 配置说明

ELes for PPmoney · October 16, 2019 · Last by 陈恒捷 replied at October 16, 2019 · 1816 hits
本帖已被设为精华帖!

本文主要介绍jvm-sandbox-repeater项目中各个配置文件,包括其字段说明、配置文件作用以及修改生效的方法。

系列文章导航:
[jvm-sandbox-repeater 学习笔记][入门使用篇] 1 安装与启动
[jvm-sandbox-repeater 学习笔记][入门使用篇] 2 配置说明(本文)
[jvm-sandbox-repeater 学习笔记][入门使用篇] 3 现有接口说明
[jvm-sandbox-repeater 学习笔记][入门使用篇] 4 录制、回放与调试

2.1 录制回放配置

如果需要针对自己的项目进行录制入口和配置的调整,则需要进行录制回访配置的调整。

2.1.1 录制回放配置字段说明

这个配置的解读,主要依赖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

2.1.2 在哪里调整录制回放配置

在非standalone模式下,会从repeater-console的 /facade/api/config/${appName}/${env}接口中拉取配置。

在standalone模式下则读取~/.sandbox-module/cfg/repeater-config.json下的配置。

2.1.2.1 非standalone模式下

按照官方提供的例子,修改为com.alibaba.repeater.console.start.controller.ConfigFacadeApi#getConfig方法,重新组装RepeaterConfig对象。

PS:修改之后,repeater-console获取配置的接口需要重启后才能返回修改后的配置内容。

 package com.alibaba.repeater.console.start.controller;
/**
* {@link ConfigFacadeApi} Demo工程;作为repeater录制回放的配置管理服务
* <p>
*
* @author zhaoyb1990
*/

@RestController
@RequestMapping("/facade/api")
public class ConfigFacadeApi {

@RequestMapping("/config/{appName}/{env}")
public RepeaterResult<RepeaterConfig> getConfig(@PathVariable("appName") String appName,
@PathVariable("env") String env) {
// 自己存配置;目前直接Mock了一份
RepeaterConfig config = new RepeaterConfig();
List<Behavior> behaviors = Lists.newArrayList();
config.setPluginIdentities(Lists.newArrayList("http", "java-entrance", "java-subInvoke", "mybatis", "ibatis"));
// 回放器
config.setRepeatIdentities(Lists.newArrayList("java", "http"));
// 白名单列表
config.setHttpEntrancePatterns(Lists.newArrayList("^/regress/.*$"));
// java入口方法
behaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "getRegress"));
config.setJavaEntranceBehaviors(behaviors);
List<Behavior> subBehaviors = Lists.newArrayList();
// java调用插件
subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "getRegressInner"));
subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "findPartner"));
subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "slogan"));
config.setJavaSubInvokeBehaviors(subBehaviors);
config.setUseTtl(true);
return RepeaterResult.builder().success(true).message("operate success").data(config).build();
}

}

PS: 可以自行调整这个接口,改为读取文件的模式,这样可以做到修改配置不需要重启repeater-console。

2.1.2.2 standalone模式下

直接修改~/.sandbox-module/cfg/repeater-config.json文件中的内容。

PS:修改后,如果本地重新安装了repeater则会恢复到没有修改的情况。如果想知道怎么样重新安装都不会被重置,那就看看bin目录下的install-local.shpackage.sh了解下安装过程都干了啥。

2.1.3 调整配置后,如何生效

repeater会在启动过程中拉取配置。

2.1.3.1 重启repeater(可用)

参考1.4 repeater启动与关闭章节中的启动与关闭相关命令,进行repeater重启。启动过程将会重新从repeater-console拉取配置。standalone模式下也会重新读取配置。

2.1.3.2 使用repeaterModule中的接口更新配置(不可用,repeater有缺陷有待完善)

com.alibaba.jvm.sandbox.repeater.module.RepeaterModule类中,实现了推送配置更新的接口。

可通过访问http://${repeater.ip}:${repeater.port}/sandbox/default/module/http/repeater/pushConfig接口,将配置的内容序列化后传输过去。

PS:但是由于repeater插件中只有JavaSubInvokePlugin插件实现了onConfigChange方法,所以这个接口功能并不完善。

2.2 其他配置

2.2.1 repeater-logback.xml

该配置文件主要是控制repeater的日志打印路径地址以及打印等级。

一般会在需要调整日志等级的时候修改。

实际生效的配置是位于~/.sandbox-module/cfg中的repeater-logback.xml。

在项目的bin目录下也有一份repeater-logback.xml,这份是在执行安装脚本的时候会被复制到~/.sandbox-module/cfg下的。

每次修改这份配置,都需要重启repeater才能生效。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10000">

<appender name="REPEATER-FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件地址-->
<file>${user.home}/logs/sandbox/repeater/repeater.log</file>
<rollingPolicy class="
ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--历史日志文件地址-->
<FileNamePattern>${user.home}/logs/sandbox/repeater/repeater.log.%d{yyyy-MM-dd}</FileNamePattern>
<!--历史日志最大保存天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<!--日志格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>

<!--日志等级-->
<root level="
info">
<appender-ref ref="
REPEATER-FILE-APPENDER"/>
</root>

</configuration>

2.2.2 repeater.properties

该配置文件主要是repeater是否以standalone模式运行,以及以非standalone模式运行时与repeater-console交互的url路径。

一般会在需要调整repeater-console地址的时候进行修改。repeat.standalone.mode一般用false,使用非standalone模式。

实际生效的配置是位于~/.sandbox-module/cfg中的repeater.properties。

在项目的bin目录下也有一份repeater.properties,这份是在执行安装脚本的时候会被复制到~/.sandbox-module/cfg下的。

每次修改这份配置,都需要重启repeater才能生效。

如下的配置,http://127.0.0.1:8001 为repeater-console的地址。

# 录制消息投递地址
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save

# 回放结果投递地址
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save

# 回放消息取数据地址
repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s

# 配置文件拉取地址
repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s

# 是否开启脱机工作模式
repeat.standalone.mode=false

2.2.3 repeater-console的application.properties

位于jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/resources/application.properties。

就是普通springboot应用的application.properties。这里有两点需要注意:

  1. 目前官方版本的mysql存储尚未完善,所以console.use.localCache只能选用false,使用内存存储模式。使用内存存储模式意味着每一次重启repeater-console都会丢失所有记录。
  2. repeat.repeat.url对应的是repeater推送回放任务的地址,所以如果本地的repeater不是以8820端口启动,或者非本地的repeater,需要相应修改这个地址的ip和端口。
spring.application.name=repeater-server
server.port=8001
mybatis.type-aliases-package=com.alibaba.repeater.console.dal.model
# 本地mysql数据源测试
spring.datasource.url=jdbc:mysql://localhost:13306/repeater?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 使用本地数据源进行测试
console.use.localCache=false
# 触发repeater执行回放任务的回放地址
repeat.repeat.url=http://127.0.0.1:8820/sandbox/default/module/http/repeater/repeat
共收到 1 条回复 时间 点赞

不错,终于有一个比较全的配置说明文档了。点赞!

陈恒捷 将本帖设为了精华贴 17 Oct 11:26
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up