这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

继上次我们对skywalking整体架构作了一些了解,然后就是学习了spring boot项目如何基于agent接入skywalking

这次我们要实现的是spring boot项目的全链路追踪
我们都知道在分布式系统中,会存在多个系统之间的相互调用
比如系统之间的http调用,系统之间的MQ消费,系统与MySql的调用
一个请求包含这么多组件,整个链路非常长,为了方便我们监控排查问题我们就需要一个全链路id(Tid、TraceId)

skywalking版本

  • 9.4.0

源码

本demo所有使用的源码都以上传github

  • github:https://github.com/weihubeats/weihubeats_demos/tree/master/spring-boot-demos/spring-boot-skywalking

spring boot接入全链路id

这里我们以order-skywalking这个demo为例

添加依赖

      <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.15.0</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.15.0</version></dependency>

虽然我们的skywalking ui、oap使用的是9.4.0版本
但是最新的skywalking-agetn版本只有8.15.0

新建order-logback.xml 文件

我们新建log文件

<?xml version="1.0" encoding="UTF-8"?><configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(%X{tl:-}){yellow} %clr(${PID:- }){magenta} %clr([%tid]){faint}  %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><pattern>${CONSOLE_LOG_PATTERN}</pattern></layout><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder></appender><!-- skywalking grpc 日志收集 8.4.0版本开始支持 --><appender name="GRPC-LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>${CONSOLE_LOG_PATTERN}</Pattern></layout><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder></appender><!--根日志基本是INFO,输出到控制台--><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="GRPC-LOG" /></root><logger name="com.skywalking.order" level="INFO"/><springProfile name="test"><logger name="com.skywalking.order" level="DEBUG" additivity="true"></logger></springProfile><springProfile name="prd"><logger name="com.skywalking.order" level="INFO" additivity="true"></logger></springProfile>
</configuration>

application.yml指定log文件

我们在application.yml中指定我们自定义的log文件

logging:config: classpath:order-logback.xml

测试

我们还是运行项目中的test.http中的
GET localhost:8091/order/rpc?name="小奏技术"

实际效果

  • order-skywalking打印log

  • product-skywalking打印log

可以看到一个请求,所有的tid是一致的都是e277f8e35a024a3599b744a71bf6c4dc.87.16853575884480001
我们去ui页面搜索看看

一个小坑

需要注意在使用RocketMQ全链路tid追踪的时候我们不能使用匿名内部类的方式去消费消息比如这种

consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {log.info("Receive New Messages {}", list.toString());return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});

源码参考github:https://github.com/weihubeats/weihubeats_demos/tree/master/spring-boot-demos/spring-boot-skywalking

这种打印出来的log是没有tid
具体原因是如下:
字节码增强无法增强基于Lambda表达式的实现,主要是因为两种实现方式在字节码层面上存在很大的差异。

  1. 当使用匿名内部类的方式创建实例时,Java编译器会实际上生成一个新的类,该类继承自原始接口。在这个过程中,编译器会生成一个完整的类,包括类结构和方法实现。在这个情况下,字节码增强可以很容易地找到并修改这个新生成的类和方法。
  2. 当使用Lambda表达式时,情况就完全不同。Java编译器并不会为Lambda表达式单独生成一个新的类。相反,它将Lambda表达式编译为一个名为“invokedynamic”的字节码指令。这使得JVM可以在运行时动态地将Lambda表达式转换为实现相应函数接口的实例。这里的关键是,实例的实际类和方法是在运行时动态生成的,而不是在编译时静态生成的。
    由于这种运行时的动态生成机制,Lambda表达式的字节码结构使得它在编译时很难被字节码增强工具直接修改。要想增强这种实现方式,需要在运行时刻进行拦截,修改或者增强Lambda表达式的行为,这样的技术成本和实现难度比直接修改静态字节码要高得多。因此,当前的字节码增强工具通常不能直接增强基于Lambda表达式的实现

skywalking 9.x入门(二) skywalking全链路tid追踪相关推荐

  1. 可视化全链路日志追踪

    可观测性作为系统高可用的重要保障,已经成为系统建设中不可或缺的一环.然而随着业务逻辑的日益复杂,传统的ELK方案在日志搜集.筛选和分析等方面愈加耗时耗力,而分布式会话跟踪方案虽然基于追踪能力完善了日志 ...

  2. python轨迹追踪、全链路日志追踪trace_id实现

    python轨迹追踪.全链路日志追踪trace_id实现 非链路日志(普通日志) 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 ...

  3. 如何用阿里云实行全链路数据追踪

    简介: 阿里云采用了日志服务,帮助畅捷通构建了用户体验感知.业务安全合规.用户业务链路追踪.成本预算的使用场景,实现了对用户.业务.成本.安全等方面的全维度感知,使得运维效率提升了30%. 在日常生活 ...

  4. 服务器搭建系列之25:k8s安装skywalking全链路消息追踪神器,2022最新版本

    准备工作: 下载skywalking安装包,地址:skywalking官网 修改安装包config文件夹中application.yml的storage属性 推荐配置SW_STORAGE:elasti ...

  5. 【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战

    文章目录 一.背景 链路追踪介绍 为什么需要链路追踪? 那该如何解决呢? 二.常见的链路追踪技术有下面这些: 三.Sleuth 3.1.Sleuth(读作/sluːθ/)介绍 3.2.相关术语 3.3 ...

  6. 基于Spring Boot + Dubbo的全链路日志追踪(一)

    一. 概要 当前公司后端整体架构为:Spring Boot + Dubbo.由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志.这也对后面的问题排查带来了很大的困难,特 ...

  7. 【架构实践】全链路实时追踪系统架构实战: 链路追踪系统 Tracing Analysis System

    目录 什么是链路追踪Tracing Analysis? 产品架构 产品功能 为什么需要分布式追踪系统? 什么是调用链(Trace)? OpenTracing数据模型 数据是如何上报的?

  8. skywalking 安装_SkyWalking全链路追踪利器

    随着目前系统架构的复杂度越来越高(中台.微服务),并且线上应用的多级监控覆盖到了通讯.应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复:而传统的监控分析方式已经无法满足我们的需求, ...

  9. 一文带你入坑全链路监控,skywalking

    一,APM概念介绍 APM(Application Performance Management)对应用程序性能和可用性的监控管理系统.它主要有这三个方面的内容,分别是 Logs(日志). Trace ...

最新文章

  1. 视频+课件| PointDSC:基于特征匹配的点云配准方法(CVPR2021)
  2. 毕业论文中使用的技术—FileReader接口
  3. 翻译关于ViewController的一篇文章
  4. 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案.doc
  5. python全栈工程师是指_Python全栈工程师(exercises)
  6. php是isapi运行模式,php isapi运行模式
  7. windows 配置C++环境
  8. 一个关于HINT中指定索引查询的问题
  9. 我所知的javascript之prototype
  10. sql点滴41—MyISAM 和 InnoDB 讲解
  11. 【clickhouse】BAT 都在追捧的 ClickHouse ,到底有多快 笔记
  12. java机器PDF_机器人制作入门(第3版)PDF 下载
  13. python正则表达式怎么看_python如何使用正则表达式
  14. 漫谈 - 从技术业务骨干走向管理
  15. 大数据技术原理与应用:期末考点总结
  16. html文本框设置大小,css怎么设置文本框大小
  17. checkSelfPermission总是返回PERMISSION_GRANTED
  18. Fixed Resistors
  19. 路由器工作原理及路由、路由表
  20. C#人民币大小写金额转换(C#版本)

热门文章

  1. 国二计算机c 考试内容,计算机国二C语言考试试题第三套
  2. 解读报告 Future of Project Management
  3. SwiftUI SceneKit之绘制SCNTube管件圆柱体(教程含源码)
  4. 代码审计文章资源汇总
  5. JVM 堆(heap)详解
  6. 关于双定向耦合器的设计
  7. 近代物理系的高能物理研究现状
  8. 电脑连接串口设备后鼠标不受控制,在屏幕上乱飞问题解决
  9. uniapp的物理返回键
  10. Windows API Monitor