目录

1、安装部署skywalking

1.1 环境准备

1.2 部署步骤

2、微服务整合skywalking实现链路监控

2.1 下载skywalking官方版本

2.2 将微服务引入skywalking监控

2.3 以上配置完成后启动服务即可实现链路监控

3、通过logback+ELFK实现全链路日志追踪

3.1 安装ELFK

3.2 添加依赖

3.3 logback文件配置

3.4 重启项目,调用测试接口

3.5 filebeat采集日志文件通过logstash输出到es

3.6 按上述配置启动filebeat,重新调用测试接口

4、tranceId在异步线程和feign调用过程中的传递

4.1 异步链路监控

4.2 feign调用的链路监控


1、安装部署skywalking

本节介绍通过docker-compose安装skywalking+es

1.1 环境准备

  • 安装docker和compose

1.2 部署步骤

  • 创建目录

mkdir -p /usr/local/skywalking/
cd /usr/local/skywalking/

  • 编写compose文件

vim docker-compose.yml


  1. version: '3.8'
  2. services:
  3.   elasticsearch:
  4.     image: elasticsearch:7.14.1
  5.     container_name: elasticsearch
  6.     restart: always
  7.     ports:
  8.       - 9200:9200
  9.     healthcheck:
  10.       test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
  11.       interval: 30s
  12.       timeout: 10s
  13.       retries: 3
  14.       start_period: 40s
  15.     environment:
  16.       - discovery.type=single-node
  17.       - bootstrap.memory_lock=true
  18.       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  19.       - TZ=Asia/Shanghai
  20.     ulimits:
  21.       memlock:
  22.         soft: -1
  23.         hard: -1
  24.   oap:
  25.     image: apache/skywalking-oap-server:8.1.0-es7
  26.     container_name: oap
  27.     depends_on:
  28.       - elasticsearch
  29.     links:
  30.       - elasticsearch
  31.     restart: always
  32.     ports:
  33.       - 11800:11800
  34.       - 12800:12800
  35.     healthcheck:
  36.       test: ["CMD-SHELL", "/skywalking/bin/swctl"]
  37.       interval: 30s
  38.       timeout: 10s
  39.       retries: 3
  40.       start_period: 40s
  41.     environment:
  42.       TZ: Asia/Shanghai
  43.       SW_STORAGE: elasticsearch7
  44.       SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
  45.   ui:
  46.     image: apache/skywalking-ui:8.1.0
  47.     container_name: ui
  48.     depends_on:
  49.       - oap
  50.     links:
  51.       - oap
  52.     restart: always
  53.     ports:
  54.       - 8080:8080
  55.     environment:
  56.       TZ: Asia/Shanghai
  57.       SW_OAP_ADDRESS: oap:12800
  • 启动

docker-compose up -d

  • 访问首页(localhost:8080)

2、微服务整合skywalking实现链路监控

2.1 下载skywalking

https://archive.apache.org/dist/skywalking/8.1.0/apache-skywalking-apm-es7-8.1.0.tar.gz

2.2 微服务引入skywalking监控

  • 将下载的安装包解压到/usr/local/skywalking目录,找到skywalking-agent.jar

apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar

  • 将上述agent路径配置到微服务启动参数中,并配置环境变量如下:

-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=art-mall-1 -Dskywalking.collector.backend_service=localhost:11800

参数解释:

/usr/local/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar 本地agent的jar包位置
-Dskywalking.agent.service_name=art-mall-1 注册到skywalking上的服务名称
-Dskywalking.collector.backend_service=localhost:11800 skywalking接收agent发送采集数据的服务及端口

2.3 以上配置完成后启动服务即可实现链路监控

  • 仪表盘

  • 拓扑图

  • 追踪

3、通过logback+ELFK实现全链路日志追踪

3.1 安装ELFK

es在第一节中已安装,其他请自行百度安装!

3.2 添加依赖

版本号与前面的skywalking对应


  1. <!-- 该引用用于logback获取tranceId,也就是tid -->
  2. <dependency>
  3. <groupId>org.apache.skywalking</groupId>
  4. <artifactId>apm-toolkit-logback-1.x</artifactId>
  5. <version>8.1.0</version>
  6. </dependency>
  7. <!-- 该引用用于代码获取tranceId -->
  8. <dependency>
  9. <groupId>org.apache.skywalking</groupId>
  10. <artifactId>apm-toolkit-trace</artifactId>
  11. <version>8.1.0</version>
  12. </dependency>

3.3 logback文件配置


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  3. <!--用于区分不同应用程序的记录-->
  4. <contextName>art-logback</contextName>
  5. <!--日志文件所在目录,如果是tomcat,如下写法日志文件会在则为${TOMCAT_HOME}/bin/logs/目录下-->
  6. <!-- <property name="LOG_HOME_WINDOWS" value="logs"/>-->
  7. <property name="LOG_HOME_WINDOWS" value="D:/temp/logs"/>
  8. <property name="LOG_HOME_LINUX" value="./logs"/>
  9. <!-- 彩色日志 -->
  10. <!-- 彩色日志依赖的渲染类 -->
  11. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  12. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  13. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  14. <!-- 彩色日志格式 [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n -->
  15. <property name="CONSOLE_LOG_MDC_PATTERN" value="${CONSOLE_LOG_MDC_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  16. <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
  17. <!--控制台-->
  18. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  19. <!-- 获取skywalking自动生成的tid -->
  20. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
  21. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
  22. <pattern>${CONSOLE_LOG_MDC_PATTERN}</pattern>
  23. </layout>
  24. </encoder>
  25. </appender>
  26. <!--滚动文件-->
  27. <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  28. <!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 -->
  29. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  30. <level>INFO</level>
  31. </filter>
  32. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  33. <fileNamePattern>${LOG_HOME_LINUX}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
  34. <!-- <maxFileSize>100MB</maxFileSize>&lt;!&ndash;单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后+1&ndash;&gt;-->
  35. <maxHistory>30</maxHistory><!--保存最近30天的日志-->
  36. <totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志-->
  37. </rollingPolicy>
  38. <encoder>
  39. <charset>UTF-8</charset>
  40. <pattern>${FILE_LOG_PATTERN}</pattern>
  41. </encoder>
  42. </appender>
  43. <!--滚动文件-->
  44. <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  45. <!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 -->
  46. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  47. <level>error</level>
  48. </filter>
  49. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  50. <fileNamePattern>${LOG_HOME_LINUX}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
  51. <!-- <maxFileSize>100MB</maxFileSize>&lt;!&ndash;单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后+1&ndash;&gt;-->
  52. <maxHistory>30</maxHistory><!--保存最近30天的日志-->
  53. <totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志-->
  54. </rollingPolicy>
  55. <encoder>
  56. <charset>UTF-8</charset>
  57. <pattern>${FILE_LOG_PATTERN}</pattern>
  58. </encoder>
  59. </appender>
  60. <!--配置多环境日志输出 可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev-->
  61. <!--本地或开发环境:打印控制台-->
  62. <springProfile name="local">
  63. <root level="debug">
  64. <appender-ref ref="stdout" />
  65. <!-- 为在本地测试日志输出到文件然后通过filebeat采集,此处同样输出到文件-->
  66. <appender-ref ref="infoFile" />
  67. <appender-ref ref="errorFile" />
  68. </root>
  69. </springProfile>
  70. <!--生产环境:输出到文件-->
  71. <springProfile name="prod">
  72. <root level="info">
  73. <appender-ref ref="infoFile" />
  74. <appender-ref ref="errorFile" />
  75. </root>
  76. </springProfile>
  77. </configuration>

配置项解释:

  • org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout

logback通过配置该layout可获取skywalking生成的tranceId

  • [%X{tid}]

可在日志的对应位置打印出tranceId,如:

[TID:5f6c5312b8e7445187565b1cb7368cd7.94.16340474835950001]

3.4 重启项目,调用测试接口

  • 测试接口

  1. @PostMapping(value = "/test")
  2. public ArtMallResult testTranceId(@RequestParam String id){
  3. log.info("测试日志打印tranceId");
  4. return ArtMallResultBuild.buildSuccess("success");
  5. }
  • 日志打印如下:
2021-10-12 22:17:18.297 [TID:5ccddc5f4d364a38bcad8e9ebbd3e18e.93.16340482375740001]  INFO 3417 --- [nio-8085-exec-1] c.y.y.a.m.c.c.PCCommodityController      : 测试日志打印tranceId

3.5 filebeat采集日志文件通过logstash输出到es

中间通过logstash中转是因为其有更好的过滤功能,可视情况决定是否使用logstash。

  • filebeat.yml配置文件

  1. filebeat.inputs:
  2. - type: log
  3. enabled: true
  4. paths:
  5. - /var/log/logs/info/*.log
  6. multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
  7. multiline.negate: false
  8. multiline.match: after
  9. output.logstash:
  10. hosts: ["10.20.178.216:8080"]
  • filebeat启动命令中将本地日志文件位置挂载到容器中

  1. docker run --name=filebeat \
  2. --restart=always \
  3. -v /Users/isen/Desktop/develop/filebeat:/usr/share/filebeat \
  4. -v /xxx/xxx/xxx/logs:/var/log/logs \
  5. store/elastic/filebeat:7.15.0

3.6 按上述配置启动filebeat,重新调用测试接口

可在kibana中通过tranceId快速检索整个链路上的所有日志,解决跨服务调用时全链路日志查询的不便。

4、tranceId在异步线程和feign调用过程中的传递

4.1 异步链路监控

通过对Callable、Runnable、Supplier这三种接口的实现进行增强拦截,将trance的上下文信息传递到子线程中,实现了异步链路追踪。

原始类

提供的包装类

拦截方法

使用方式

Callable<V>

CallableWrapper<V>

call

CallableWrapper.of(xxxCallable)

Runable

RunableWrapper

run

RunnableWrapper.of(xxxRunable)

Supplier<V>

SupplierWrapper<V>

get

SupplierWrapper.of(xxxSupplier)

  • 使用方式:

1、引入依赖,参考3.2第二个maven依赖

2、定义线程池


  1. @Configuration
  2. public class ThreadPoolExecutorConfig {
  3. @Bean("testThreadPool")
  4. public ThreadPoolTaskExecutor testThreadPool() {
  5. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  6. int core = Runtime.getRuntime().availableProcessors();
  7. executor.setCorePoolSize(core);
  8. executor.setMaxPoolSize(core * 2 + 1);
  9. executor.setKeepAliveSeconds(3);
  10. executor.setQueueCapacity(15000);
  11. executor.setThreadNamePrefix("testThreadPool");
  12. executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  13. return executor;
  14. }
  15. }

3、修改测试接口,此处以RunnableWrapper和CallableWrapper为例


  1. /**
  2. * 测试tranceId的效果
  3. * 未配置忽略追踪
  4. * @return
  5. */
  6. @PostMapping(value = "/test1")
  7. public ArtMallResult testTranceId(@RequestParam String id){
  8. ActiveSpan.tag("type", "异步任务多线程任务");
  9. testThreadPool.submit(RunnableWrapper.of(() -> {
  10. ActiveSpan.tag("type", "测试异步1");
  11. log.info("1-testThreadPool 测试一下tranceId的异步传递...");
  12. }));
  13. testThreadPool.submit(CallableWrapper.of(() -> {
  14. ActiveSpan.tag("type", "测试异步2");
  15. log.info("2-testThreadPool 测试一下tranceId的异步传递...");
  16. return null;
  17. }));
  18. return ArtMallResultBuild.buildSuccess("success");
  19. }

4、打印日志如下:


  1. 2021-10-13 10:31:53.605 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [nio-8085-exec-1] com.yun.ying.art.mall.filter.CorsFilter : request path : /pc/commodity/test1
  2. 2021-10-13 10:31:54.348 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [testThreadPool1] c.y.y.a.m.c.c.PCCommodityController : 1-testThreadPool 测试一下tranceId的异步传递...
  3. 2021-10-13 10:31:54.365 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [testThreadPool2] c.y.y.a.m.c.c.PCCommodityController : 2-testThreadPool 测试一下tranceId的异步传递...

5、链路追踪展示

4.2 feign调用的链路监控

参考第2节内容,为每个微服务都整合skywalking的链路监控即可

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览113640 人正在系统学习中

[转帖]微服务集成skywalking实现全链路日志追踪方案的更多相关文章

  1. .NET Core集成CorrelationId实现全链路日志输出

    .NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...

  2. 【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」

    日志追踪 日志追踪对于功能问题的排查和数据流转的路径分析时非常重要的,有了全链路日志追踪体系机制可以非常有效且快速的定位问题,但在多线程环境中,若没有相关成熟的框架的支持,想要实现日志追踪,就需要手动 ...

  3. ScalaPB(0): 找寻合适的内部系统微服务集成工具

    前一段时间我们探讨了SDP的一个基于集群的综合数据平台解决方案,由多种数据库组成,包括:JDBC, Cassandra 及MongoDB.其中Cassandra和MongoDB属于分布式数据库,可以在 ...

  4. 从React Native到微服务,落地一个全栈解决方案

    Poplar是一个社交主题的内容社区,但自身并不做社区,旨在提供可快速二次开发的开源基础套件.前端基于React Native与Redux构建,后端由Spring Boot.Dubbo.Zookeep ...

  5. Spring Cloud(一)简单的微服务集成Eureka

    1        Spring Cloud简介 1.1             简介 Spring Cloud项目的官方网址:https://projects.spring.io/spring-clo ...

  6. Spring Cloud微服务集成配置中心

    1. 搭建Spring Cloud Config配置中心(见上一篇博客) 2. 创建微服务项目bounter-simon-app,pom文件如下: <?xml version="1.0 ...

  7. [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST,  ...

  8. .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.什么是Tracing? 微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错 ...

  9. 谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

    一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务 ...

  10. 带你十天轻松搞定 Go 微服务系列(九、链路追踪)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

随机推荐

  1. 华为云河图KooMap:夯实数字孪生底座,点燃燎原星火

    摘要:7月8日,华为开发者大会2023(Cloud)华为云河图KooMap技术分论坛在东莞溪村顺利举办. 7月8日,华为开发者大会2023(Cloud)华为云河图KooMap技术分论坛在东莞溪村顺利举 ...

  2. 实战案例丨使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步

    摘要:实践案例展示如何使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步. [业务场景及诉求] 希望将不同区域"华北-北京四"的rds与"亚太-新加坡&qu ...

  3. 十八般武艺玩转GaussDB(DWS)性能调优(二):坏味道SQL识别

    摘要:那些会导致执行效率低下的SQL语句及其执行方式,我们称之为SQL中的"坏味道". ◆ 什么是SQL中的坏味道 SQL语言是关系型数据库(RDB)的标准语言,其作用是将使用者的 ...

  4. Serverless时代的微服务开发指南:华为云提出七大实践新标准

    摘要:本文结合华为云在Serverless Microservice方面的实践,总结提炼出七大Serverless Microservice开发 "实践标准",为加速全域Serve ...

  5. Axure 表格中根据条件设置不同的字体样式--中继器

    中继器+表格,根据条件设置不同的字体样式 思路:根据情形,设置不同的颜色,因为Axure 不能直接对元件的样式进行交互设置,所以借助[动态面板]进行设置 绘制表格详见:https://www.cnbl ...

  6. PPT 呼吸感

    任何元素都应该保持一定的距离,留出可以"呼吸"的空间 呼吸感 怎么营造 不要让内容超出/接近边框 类似的元素摆放在一起 控制 行间距/字间距 行间距:1.3.字间距:1.0 :行间 ...

  7. .NetCore 接口请求耗时记录

    通过日志,记录每个接口请求的耗时情况 结合  <logger name="*" level="Trace" writeTo="tracefile ...

  8. <vue 组件 3、父子组件相互访问>

    代码结构 一.     01-组件访问-父访问子 1. 效果 点击后在父组件里展示子组件的参数 2.代码 01-组件访问-父访问子.html <!DOCTYPE html> <htm ...

  9. 《3D编程模式》写书-第4次记录

    大家好,这段时间我完成了"再看设计原则"的初稿,包括了设计基础.单一职责原则.依赖倒置原则.接口隔离原则.合成复用原则.最少知识原则.开闭原则 目前我已经完成了所有的初稿,后面会进 ...

  10. 真实感渲染:WebGPU介绍和使用光栅化管线绘制一个三角形

    大家好~本课程为"真实感渲染"的线上课程,从0开始,介绍相关的图形学算法和数学基础,给出详细的数学推导.伪代码和实现代码,最终带领大家开发出基于物理的渲染器 线上课程资料: 本节课 ...