6.3 KiB
安装概要
-
启动worker
- 启动worker,开启接收data
- 自动上报地址到配置中心
- 内部使用Disruptor并行处理存储
- 批量插入,建议给worker分配充足内存,不使用连接池。ck的连接数很宝贵
-
参照example项目,启动引入了client.jar的client。
- udp发送的数据都是经过zstd压缩的
- 如果未配置workers,则向本地发送数据(用于测试)
- 目前支持file,zk,apolo,etcd,nacos配置器, 支持自定义配置器,满足spi
- file配置器需重写putConfig用以维护worker
-
启动DashBoard
Worker运行脚本示例
export JAVA_OPTS = -Xms25096m -Xmx25096m -Xmn16096m -XX:MetaspaceSize=256m -Xss256K -XX:+UseG1GC -XX:ParallelGCThreads=8 -Duser.timezone=Asia/Shanghai
export MYSQL_HOST = test
export MYSQL_USER user
export MYSQL_PASS pass
export INSERT_INTERVAL 1
export serverAddr http://127.0.0.1:2379,http://127.0.0.1:xxxx
export BATCH_SIZE 7000
export MYSQL_PORT 8123
export NODE_NUMBER 15
export queueSize 8192
export POOL_SIZE 5
export threadCount 6
export DB_NAME myDbName
export workerPath AppName
export preDbSize 100000
# Set log directory for log4j
LOG_DIR=/export/Logs
# Set Java environment
JAVA_ENV="-Dlog-dir=$LOG_DIR"
if [ -z $etcdServer ];then
etcdServer=http://127.0.0.1:2379
fi
# Run
java -jar $JAVA_OPTS $JAVA_ENV xxx.jar --etcd.server=${etcdServer}
其中配置的日志路径 可通过${log-dir}
引入,也可以写在web.xml
,或者直接在log4j.xml
文件里写死。
记录数据说明
一条日志的数据可分为两种:出入参、链路日志。其中出入参的基本信息较为固定,而中途日志为请求中日志,用户可自行添加。
出入参日志有且不仅有:
-
链路id
-
应用名称
-
创建时间
-
请求耗时
-
请求接口
-
请求返回值
-
日志创建时间
-
请求入参相关自定义信息
-
客户端种类
-
客户端版本
-
用户ip
-
服务器ip
......
-
JLog
总结了常用的日志参数,在Client端用规范的格式记录参数 (具体记录逻辑可见HttpFIlter
类) 。在Worker端,针对定义的日志格式又有一些特殊处理(具体见TracerConsumer
类)再入库。那如何自定义日志记录格式和处理入库格式呢?
- 仿照
HttpFIlter
自定义日志记录格式, 修改放入传输对象tracerBean
的元素逻辑 - 仿照
TracerConsumer
自定义日志入库格式, 修改中途日志(dealTracerLog
) / 出入参日志(dealFilterModel
)的 入库对象构造方法 - 可能涉及更改
DashBoard
项目的展示逻辑
待之后优化支持拓展点修改日志格式和展示逻辑。
Client example运行
-
配置配置器
构建TracerClientStarter, 设置配置器,应用名
@Configuration public class Starter { @PostConstruct public void begin() { TracerClientStarter tracerClientStarter = new TracerClientStarter.Builder(); // mdc tagConfig tracerClientStarter.startPipeline(); } }
-
配置HttpFilter拦截器
@Bean public FilterRegistrationBean urlFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); HttpFilter userFilter = new HttpFilter(); registration.setFilter(userFilter); registration.addUrlPatterns("/*"); registration.setName("HttpTraceFilter"); registration.setOrder(1); return registration; }
-
自定义出参/入参增强(可选)
public class CustomRespMap implements RespMap { @Override public Map<String, Object> appendRespMap(String cnt) { return FastJsonUtils.toMap(cnt); } }
-
自定义配置器(可选,如果没有配置中心才需要)
@Component public class CustomConfigurator extends FileConfigurator { private CustomConfigurator() throws IOException { super(); cover(this); } @Override public List<String> getList(String key) { Set<Object> set = redisUtil.getMembers(key); return set.stream().map(v->(String)v).collect(Collectors.toList()); } @Override public String getType() { return "custom-redis"; } }
-
配置日志框架 (log4j / log4j2 / logback)
以log4j2举例,在配置的
log4j2.xml
文件中,引入JLog自有的Appender并设置<Appemders> <tracer name="tracerAppender"></tracer> </Appenders> <Loggers> <Logger name="RequestLog" level="INFO" additivity="false"> <AppenderRef ref="requestLog"/> <AppenderRef ref="tracerAppender" /> </Logger> <Root level="INFO" includeLocation="false"></Root> </Loggers>
自定义配置器参照CustomConfigurator类(基于redis实现的配置器例子)
-
测试记录出入参
配置
UserFilter
后符合拦截器拦截设置的,都会被记录出入参 -
测试记录中途日志
详见
TestController
类@RestController public class TestController { /** * do nothing * just as an adapter for this project common log helper * */ private static Logger RequestLog = LoggerFactory.getLogger("RequestLog"); @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE) public Object test(@RequestParam Integer uid, @RequestParam Integer newKey,@RequestBody TestReq req) { RequestLog.info("|errno=val3||node=val4||这是随便的log|"); if(newKey == 1){ return 1; } return new Resoponse("滴滴员工tangbohu的终身代号是什么???是9527"); } }
这里RequestLog为刚配置了引入JLog自带
Appender
的日志。所以这一条请求记录中,除了出入参外还有一条中途日志“test”
。 -
测试模拟数据发送至worker
模拟
UserFilter发
送构造好的出入参数据,udp发送给worker。可外嵌层for循环用于压测,详见TracerPacketTest
类。 -
clickhouse sql: worker服务下jlog.sql