skywalking 9.x入门(二) skywalking全链路tid追踪

这里是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

测试

  • 启动参数
-javaagent:/Users/xiaozoujishu/Downloads/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_NAME=order-service
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

我们还是运行项目中的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 Trace 链路图的查看与分析 SkyWalking 提供了一个直观的界面来展示分布式系统的调用链路,帮助开发者快速定位性能瓶颈和异常问题。以下是关于如何查看和分析 SkyWalking 中的 Trace 链路图的具体说明: #### 查看 Trace 链路图 1. **登录 SkyWalking UI** 打开浏览器并访问 SkyWalking 的 Web 控制台,默认地址为 `http://<skywalking-oap-server-ip>:8080`。 2. **进入 Trace 页面** 在左侧导航栏中选择 **Traces** 菜单项,这将显示所有已捕获的调用链路数据[^2]。 3. **筛选条件设置** 使用页面顶部的时间范围、服务名称和服务实例等过滤器,缩小目标 Trace 数据的范围。可以通过输入具体的事务 ID (TID) 来精确检索某一条特定的链路记录[^1]。 4. **查看详情** 单击某个 Trace 记录即可展开其详细的拓扑结构视图。该视图会按照时间轴顺序排列各个节点及其耗时情况,便于理解整个请求路径上的各个环节表现。 #### 分析 Trace 链路图的关键要素 - **节点颜色含义**: 不同的颜色代表不同的状态或者延迟等级。通常红色表示错误发生的位置;黄色可能意味着警告级别事件;绿色则表明正常运行的状态。 - **耗时时长分布**: 关注每一段操作所花费的实际毫秒数,识别哪些部分占据了较多资源从而成为优化重点对象之一[^3]。 - **依赖关系可视化**: 明确看到前后端之间相互作用模式以及第三方库/API接入点所在位置,有助于梳理复杂业务逻辑流程走向。 - **上下文传递机制验证**: 如果应用了自定义扩展功能比如通过 `TraceContext.putCorrelation()` 方法注入额外元数据,则可以在对应的 span 上找到这些附加信息用于辅助诊断问题根源[^1]。 ```java // 示例代码片段展示了如何向当前线程关联的数据存储添加键值对以便后续读取利用 TraceContext.putCorrelation("customKey", "customValue"); Optional<String> valueOpt = TraceContext.getCorrelation("customKey"); if(valueOpt.isPresent()){ System.out.println("Retrieved correlation data:" +valueOpt.get()); } ``` 以上就是针对 SkyWalking 平台上 trace 链路图基本的操作指南及解读技巧总结。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值