You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
7.1 KiB

8 months ago
  1. ### 安装概要
  2. 有疑问可以进微信群咨询。
  3. * 安装clickhouse(docker安装参考:https://www.runoob.com/docker/docker-tutorial.html)
  4. * 拉取镜像:docker pull yandex/clickhouse-server
  5. * 启动ck docker run -d --name ch-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 yandex/clickhouse-server
  6. * 使用Dbeaver测试连接:clickhouse默认用户名是default 没有密码
  7. * 建表:[sql语句](https://gitee.com/jd-platform-opensource/jlog/blob/master/worker/src/main/resources/jlog.sql)
  8. * 启动worker
  9. * 配置ck地址,从config模块引入配置器,参考example项目application.properties。默认file配置器, (生产环境)建议继承FileConfigurator复写以维护worker配置,参考CustomConfigurator.class
  10. * 启动worker,开启接收data
  11. * 启动web服务(client端)参照example项目
  12. * 根据自己的log框架 引入对应的client.jar。选择对应的log xml配置以及覆写appender。参照3个clientlog*模块,或example-TracerLogbackAppender.class
  13. * 在配置文件或其他配置中心 配置好压缩提取等配置 参考example项目application.properties
  14. * 如果未配置workers,则向本地发送数据(用于测试)
  15. * 启动项目,用PostMan等工具调用TestController/test 接口,
  16. * Dbeaver 查看数据
  17. * 启动DashBoard
  18. ### Worker运行脚本示例
  19. ```shell
  20. export JAVA_OPTS = -Xms25096m -Xmx25096m -Xmn16096m -XX:MetaspaceSize=256m -Xss256K -XX:+UseG1GC -XX:ParallelGCThreads=8 -Duser.timezone=Asia/Shanghai
  21. export MYSQL_HOST = test
  22. export MYSQL_USER user
  23. export MYSQL_PASS pass
  24. export INSERT_INTERVAL 1
  25. export serverAddr http://127.0.0.1:2379,http://127.0.0.1:xxxx
  26. export BATCH_SIZE 7000
  27. export MYSQL_PORT 8123
  28. export NODE_NUMBER 15
  29. export queueSize 8192
  30. export POOL_SIZE 5
  31. export threadCount 6
  32. export DB_NAME myDbName
  33. export workerPath AppName
  34. export preDbSize 100000
  35. # Set log directory for log4j
  36. LOG_DIR=/export/Logs
  37. # Set Java environment
  38. JAVA_ENV="-Dlog-dir=$LOG_DIR"
  39. if [ -z $etcdServer ];then
  40. etcdServer=http://127.0.0.1:2379
  41. fi
  42. # Run
  43. java -jar $JAVA_OPTS $JAVA_ENV xxx.jar --etcd.server=${etcdServer}
  44. ```
  45. 其中配置的日志路径 可通过`${log-dir}`引入,也可以写在`web.xml`,或者直接在`log4j.xml`文件里写死。
  46. ### 记录数据说明
  47. 一条日志的数据可分为两种:出入参、链路日志。其中出入参的基本信息较为固定,而中途日志为请求中日志,用户可自行添加。
  48. 出入参日志有且不仅有:
  49. - 链路id
  50. - 应用名称
  51. - 创建时间
  52. - 请求耗时
  53. - 请求接口
  54. - 请求返回值
  55. - 日志创建时间
  56. - 请求入参相关自定义信息
  57. - 客户端种类
  58. - 客户端版本
  59. - 用户ip
  60. - 服务器ip
  61. ......
  62. `JLog`总结了常用的日志参数,在Client端用**规范**的格式记录参数 (具体记录逻辑可见`HttpFIlter`类) 。在Worker端,针对定义的日志格式又有一些特殊处理(具体见`TracerConsumer`类)再入库。**那如何自定义日志记录格式和处理入库格式呢?**
  63. - 仿照`HttpFIlter`自定义日志**记录格式**, 修改放入传输对象`tracerBean`的元素逻辑
  64. - 仿照`TracerConsumer`自定义日志**入库格式**, 修改中途日志(`dealTracerLog`) / 出入参日志(`dealFilterModel`)的 入库对象构造方法
  65. - 可能涉及更改`DashBoard`项目的**展示逻辑**
  66. **待之后**优化支持**拓展点**修改日志格式和展示逻辑。
  67. ### Client example运行
  68. - 配置配置器
  69. 构建TracerClientStarter, 设置配置器,应用名
  70. ```java
  71. @Configuration
  72. public class Starter {
  73. @PostConstruct
  74. public void begin() {
  75. TracerClientStarter tracerClientStarter = new TracerClientStarter.Builder();
  76. // mdc tagConfig
  77. tracerClientStarter.startPipeline();
  78. }
  79. }
  80. ```
  81. - 配置HttpFilter拦截器
  82. ```java
  83. @Bean
  84. public FilterRegistrationBean urlFilter() {
  85. FilterRegistrationBean registration = new FilterRegistrationBean();
  86. HttpFilter userFilter = new HttpFilter();
  87. registration.setFilter(userFilter);
  88. registration.addUrlPatterns("/*");
  89. registration.setName("HttpTraceFilter");
  90. registration.setOrder(1);
  91. return registration;
  92. }
  93. ```
  94. - 自定义出参/入参增强(可选)
  95. ```java
  96. public class CustomRespMap implements RespMap {
  97. @Override
  98. public Map<String, Object> appendRespMap(String cnt) {
  99. return FastJsonUtils.toMap(cnt);
  100. }
  101. }
  102. ```
  103. - 自定义配置器(可选,如果没有配置中心才需要)
  104. ```java
  105. @Component
  106. public class CustomConfigurator extends FileConfigurator {
  107. private CustomConfigurator() throws IOException {
  108. super();
  109. cover(this);
  110. }
  111. @Override
  112. public List<String> getList(String key) {
  113. Set<Object> set = redisUtil.getMembers(key);
  114. return set.stream().map(v->(String)v).collect(Collectors.toList());
  115. }
  116. @Override
  117. public String getType() {
  118. return "custom-redis";
  119. }
  120. }
  121. ```
  122. - 配置日志框架 (log4j / log4j2 / logback)
  123. 以log4j2举例,在配置的`log4j2.xml`文件中,引入JLog自有的Appender并设置
  124. ```xml
  125. <Appemders>
  126. <tracer name="tracerAppender"></tracer>
  127. </Appenders>
  128. <Loggers>
  129. <Logger name="RequestLog" level="INFO" additivity="false">
  130. <AppenderRef ref="requestLog"/>
  131. <AppenderRef ref="tracerAppender" />
  132. </Logger>
  133. <Root level="INFO" includeLocation="false"></Root>
  134. </Loggers>
  135. ```
  136. 自定义配置器参照CustomConfigurator类(基于redis实现的配置器例子)
  137. - 测试记录出入参
  138. 配置`UserFilter`后符合拦截器拦截设置的,都会被记录出入参
  139. - 测试记录中途日志
  140. 详见`TestController`类
  141. ```java
  142. @RestController
  143. public class TestController {
  144. /**
  145. * do nothing
  146. * just as an adapter for this project common log helper
  147. *
  148. */
  149. private static Logger RequestLog = LoggerFactory.getLogger("RequestLog");
  150. @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE)
  151. public Object test(@RequestParam Integer uid, @RequestParam Integer newKey,@RequestBody TestReq req) {
  152. RequestLog.info("|errno=val3||node=val4||这是随便的log|");
  153. if(newKey == 1){
  154. return 1;
  155. }
  156. return new Resoponse("滴滴员工tangbohu的终身代号是什么???是9527");
  157. }
  158. }
  159. ```
  160. 这里RequestLog为刚配置了引入JLog自带`Appender`的日志。所以这一条请求记录中,除了出入参外还有一条中途日志`“test”`。
  161. - 测试模拟数据发送至worker
  162. 模拟`UserFilter发`送构造好的出入参数据,udp发送给worker。可外嵌层for循环用于压测,详见`TracerPacketTest`类。
  163. - clickhouse sql: worker服务下jlog.sql
  164. - clickhouse存储样例:
  165. ![输入图片说明](images/tracer_log.png)