微服务集成skywalking实现全链路日志追踪方案
目录
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
version: '3.8'
services:elasticsearch:image: elasticsearch:7.14.1container_name: elasticsearchrestart: alwaysports:- 9200:9200healthcheck:test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]interval: 30stimeout: 10sretries: 3start_period: 40senvironment:- discovery.type=single-node- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaiulimits:memlock:soft: -1hard: -1oap:image: apache/skywalking-oap-server:8.1.0-es7container_name: oapdepends_on:- elasticsearchlinks:- elasticsearchrestart: alwaysports:- 11800:11800- 12800:12800healthcheck:test: ["CMD-SHELL", "/skywalking/bin/swctl"]interval: 30stimeout: 10sretries: 3start_period: 40senvironment:TZ: Asia/ShanghaiSW_STORAGE: elasticsearch7SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200ui:image: apache/skywalking-ui:8.1.0container_name: uidepends_on:- oaplinks:- oaprestart: alwaysports:- 8080:8080environment:TZ: Asia/ShanghaiSW_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对应
<!-- 该引用用于logback获取tranceId,也就是tid -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.1.0</version>
</dependency><!-- 该引用用于代码获取tranceId -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.1.0</version>
</dependency>
3.3 logback文件配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!--用于区分不同应用程序的记录--><contextName>art-logback</contextName><!--日志文件所在目录,如果是tomcat,如下写法日志文件会在则为${TOMCAT_HOME}/bin/logs/目录下--><!-- <property name="LOG_HOME_WINDOWS" value="logs"/>--><property name="LOG_HOME_WINDOWS" value="D:/temp/logs"/><property name="LOG_HOME_LINUX" value="./logs"/><!-- 彩色日志 --><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /><conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /><!-- 彩色日志格式 [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n --><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}}"/><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}"/><!--控制台--><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><!-- 获取skywalking自动生成的tid --><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><pattern>${CONSOLE_LOG_MDC_PATTERN}</pattern></layout></encoder></appender><!--滚动文件--><appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME_LINUX}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- <maxFileSize>100MB</maxFileSize><!–单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后+1–>--><maxHistory>30</maxHistory><!--保存最近30天的日志--><totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志--></rollingPolicy><encoder><charset>UTF-8</charset><pattern>${FILE_LOG_PATTERN}</pattern></encoder></appender><!--滚动文件--><appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>error</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME_LINUX}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- <maxFileSize>100MB</maxFileSize><!–单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后+1–>--><maxHistory>30</maxHistory><!--保存最近30天的日志--><totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志--></rollingPolicy><encoder><charset>UTF-8</charset><pattern>${FILE_LOG_PATTERN}</pattern></encoder></appender><!--配置多环境日志输出 可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev--><!--本地或开发环境:打印控制台--><springProfile name="local"><root level="debug"><appender-ref ref="stdout" /><!-- 为在本地测试日志输出到文件然后通过filebeat采集,此处同样输出到文件--><appender-ref ref="infoFile" /><appender-ref ref="errorFile" /></root></springProfile><!--生产环境:输出到文件--><springProfile name="prod"><root level="info"><appender-ref ref="infoFile" /><appender-ref ref="errorFile" /></root></springProfile></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 重启项目,调用测试接口
- 测试接口
@PostMapping(value = "/test")
public ArtMallResult testTranceId(@RequestParam String id){log.info("测试日志打印tranceId");return ArtMallResultBuild.buildSuccess("success");
}
- 日志打印如下:
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配置文件
filebeat.inputs:
- type: logenabled: truepaths:- /var/log/logs/info/*.logmultiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'multiline.negate: falsemultiline.match: afteroutput.logstash:hosts: ["10.20.178.216:8080"]
- filebeat启动命令中将本地日志文件位置挂载到容器中
docker run --name=filebeat \--restart=always \-v /Users/isen/Desktop/develop/filebeat:/usr/share/filebeat \-v /xxx/xxx/xxx/logs:/var/log/logs \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、定义线程池
@Configuration
public class ThreadPoolExecutorConfig {@Bean("testThreadPool")public ThreadPoolTaskExecutor testThreadPool() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();int core = Runtime.getRuntime().availableProcessors();executor.setCorePoolSize(core);executor.setMaxPoolSize(core * 2 + 1);executor.setKeepAliveSeconds(3);executor.setQueueCapacity(15000);executor.setThreadNamePrefix("testThreadPool");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}
3、修改测试接口,此处以RunnableWrapper和CallableWrapper为例
/*** 测试tranceId的效果* 未配置忽略追踪* @return*/
@PostMapping(value = "/test1")
public ArtMallResult testTranceId(@RequestParam String id){ActiveSpan.tag("type", "异步任务多线程任务");testThreadPool.submit(RunnableWrapper.of(() -> {ActiveSpan.tag("type", "测试异步1");log.info("1-testThreadPool 测试一下tranceId的异步传递...");}));testThreadPool.submit(CallableWrapper.of(() -> {ActiveSpan.tag("type", "测试异步2");log.info("2-testThreadPool 测试一下tranceId的异步传递...");return null;}));return ArtMallResultBuild.buildSuccess("success");
}
4、打印日志如下:
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
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的异步传递...
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的链路监控即可
微服务集成skywalking实现全链路日志追踪方案相关推荐
- 可视化全链路日志追踪
可观测性作为系统高可用的重要保障,已经成为系统建设中不可或缺的一环.然而随着业务逻辑的日益复杂,传统的ELK方案在日志搜集.筛选和分析等方面愈加耗时耗力,而分布式会话跟踪方案虽然基于追踪能力完善了日志 ...
- 微服务下的APM全链路监控
https://opentalk.upyun.com/333.html 2017 年 10 月 29 日,又拍云 Open Talk 联合 Spring Cloud 中国社区成功举办了"进击 ...
- 微服务集成SkyWalking
title: 微服务集成SkyWalking date: 2019-11-24 09:59:21 categories: 微服务 tags: SkyWalking 最近做的一个项目使用了Spring ...
- python轨迹追踪、全链路日志追踪trace_id实现
python轨迹追踪.全链路日志追踪trace_id实现 非链路日志(普通日志) 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 ...
- 微服务项目中引入全链路监控平台:Pinpoint、SkyWalking、Zipkin怎么选?
来源:www.jianshu.com/p/92a12de11f18 0 问题背景 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上, ...
- Springcloud 集成 Skywalking 实现全链路追踪
下载链接 https://skywalking.apache.org/downloads/ 本地搭建springcloud工程,偷懒可参考gitee https://gitee.com/wangLi1 ...
- 【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战
文章目录 一.背景 链路追踪介绍 为什么需要链路追踪? 那该如何解决呢? 二.常见的链路追踪技术有下面这些: 三.Sleuth 3.1.Sleuth(读作/sluːθ/)介绍 3.2.相关术语 3.3 ...
- 基于Spring Boot + Dubbo的全链路日志追踪(一)
一. 概要 当前公司后端整体架构为:Spring Boot + Dubbo.由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志.这也对后面的问题排查带来了很大的困难,特 ...
- 使用Skywalking实现全链路监控
https://opentalk.upyun.com/334.html 2017 年 10 月 29 日,又拍云 Open Talk 联合 Spring Cloud 中国社区成功举办了"进击 ...
- 使用 Skywalking 实现全链路监控
2017 年 10 月 29 日,又拍云 Open Talk 联合 Spring Cloud 中国社区成功举办了"进击的微服务实战派北京站".华为技术专家吴晟作了题为<使用 ...
最新文章
- 快速部署RDA Remote Diagnostic Agent
- 史上讲的最好的Java NIO与IO的区别与应用
- js判断浏览器是否支持webGL
- Java实现string转byte
- kingcms的标签
- android使用Charles抓包https请求
- Linux vlan间路由配置,VLAN间路由
- 服务端软件安全测评标准及实施指南 V1.0
- Android 语音助手
- 获取jpg(或jpeg)图片中的详细信息(EXIF信息)
- layim php,如何通过LayuiAdminLayIMThinkphpGateway实现小程序多客服接入系统的例子
- 利用Excel实现数据抽样
- c语言中的正弦函数与余弦函数
- Shell脚本遍历指定网段的在线ip
- af dns 刷新时间_第一时间上手Redmi K30 Pro,有些想法不吐不快
- 【论文解读】(如何微调BERT?) How to Fine-Tune BERT for Text Classification?
- js代码中for循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting ‘className‘)
- 企业微信如何创建待办事项?
- Numpy 怎么把arange ()产生的列表 变成一个行向量或者列向量
- DDPG中的Ornstein-Uhlenbeck过程怎么理解
热门文章
- Android 最新实现沉浸式状态栏的效果
- 浮动定位弹性页面的布局。
- SF20 | 来聊聊平仓离场的方法,如何构建高效,灵活,可靠的出场策略?
- 求123456789=x成立个数
- a标签href属性的用法
- PowerDesigner设计业务流程图
- 8583 mac 字符选择 java 实现_8583报文MAC验证实现过程
- 手机与个人计算机区别,手机CPU跟电脑CPU有什么差别?两者差距到底有多大?
- Shallow Size、Retained Size、Heap Size 和 Allocated
- 《东周列国志》第三十八回 周襄王避乱居郑 晋文公守信降原