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

news2024/11/25 14:58:26

这里是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;
});

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB | 查询usb设备占用带宽

USB | 查询usb设备占用带宽 请教一下windows下有什么工具能查询usb设备占用带宽吗&#xff1f;Linux上有usbtop&#xff0c;windows有类似工具吗 DeviceMonitoringStudio设备监控工具的使用

好用的自动化框架-Allure

概述 报告主要包含总览、类别、测试套件、图表、时间刻度、功能、包等7大部分&#xff0c;支持自定义诸多信息&#xff0c;包括附件添加、缺陷链接、案例链接、测试步骤、Epic、Feature、Story、Title、案例级别等&#xff0c;相当强大。 allure与pytest的结合使用可以呈现完…

华为OD机试真题B卷 Java 实现【求小球落地5次后所经历的路程和第5次反弹的高度】,附详细解题思路

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…

Mysql存储过程的递归调用及数据量过大group_concat()显示不全的问题

业务场景 使用mysql group_concat()函数&#xff0c;对查询的数据进行字符串连接操作。 由于查询的结果较多&#xff0c;连接后的结果很长导致不能完全显示。 第一种解决方案&#xff08;不需要重启Mysql, 如果mysql重启后设置会失效&#xff0c;需重新设置&#xff09; 执行…

代码随想录-哈希表

学习《代码随想录》 基础知识哈希函数哈希碰撞三种哈希结构 有效的字母异位词两个数组的交集两数之和暴力法Map 四数相加三数之和哈希解法双指针法 四数之和 基础知识 哈希表是一种根据关键码的值直接访问数据的数据结构。一般用来快速判断一个元素是否出现在集合中。 哈希函…

【AUTOSAR】Com通讯栈配置说明(二)---- CanIf模块

CanIf模块 CanIfCtrlDrvCfgs CanIfCtrlDrvBusOffNotification:busoff 发生后的callback函数 CanIfCtrlDrvWakeupNotification: wakeup 发生后的callback函数 CanIfCtrlId: 逻辑Canif id CanIfWakeupSupport:是否支持唤醒 CanIfMaxDlc:最大报文长度 CanIfCtrlCanCtrlRef: 关联…

我们是如何管理蓝精灵协会 PFP 集合的程序性生成的?

自从 Cryptopunks 和 Bored Apes 发布以来&#xff0c;大多数蓝筹 NFT 系列都在其创意基准中使用了相同的反复出现的概念&#xff1a;一幅插图肖像&#xff08;也称为 PFP&#xff0c;用于个人资料图片或证明图片&#xff09;通过使用随机分布的定制层而被改变成几千种略有不同…

【回顾经典AI神作】理解和实现ResNeXt(比ResNet最先进的图像分类模型)

与 ResNet 相比好在哪里? 相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半 论文参考:https://arxiv.org/pdf/1611.05431.pdf 以下三篇是介绍和改进残差网络的论文: 用于图像识别的深度残差学习(链接…

ELECTRA模型简单介绍

目录 一、整体概要 二、生成器 三、判别器 四、模型训练 五、其它改进 一、整体概要 ELECTRA&#xff08;Efficiently Learning an Encoder that Classifies Token Replacements Accurately&#xff09;采用了一种“生成器——判别器”结构&#xff0c;其与生成式对抗网络…

报表服务器Stimulsoft Server v2023.2亮点:支持PostgreSQL、选项卡

Stimulsoft Server&#xff08;原Stimulsoft Reports.Server&#xff09;是一款完善的商业智能解决方案&#xff0c;采用C/S架构&#xff0c;提供报告和分析功能。前端用来展现数据&#xff0c;后台用来处理和存储数据。Stimulsoft Server&#xff08;原Stimulsoft Reports.Ser…

IDEA性能优化设置(解决卡顿问题)

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

成都远石无人机航测服务的具体内容

成都远石拥有多年西南地区无人机航测作业经验&#xff0c;现具备DEM、DSM、DOM、三维实景模型及机载激光雷达全套数据成果的生产能力&#xff0c;致力于为各个行业提供准确的数据支持。现在&#xff0c;小编就来给大家介绍成都远石无人机航测服务的具体内容。 1、数字高程模型…

SocketTools Library Edition C++ Crack

SocketTools 库版 SocketTools Library Edition 是一套 Windows 库&#xff0c;可简化 Internet 应用程序开发。它提供您入门所需的一切&#xff0c;包括文档和示例&#xff0c;以及免费的技术支持来回答您遇到的任何开发问题。SocketTools Library Edition 包括本机 Windows 库…

Java集成influxDB 默认UTC时区问题

dd 我用的influxDB 1.8版本高版本我不清楚&#xff0c;因为1.x版本便于写sq语法。 influxDB时序库默认使用 UTC时区&#xff0c;并且无法通过配置来修改这个时区&#xff0c;很多文档说在查询数据的时候加上 tz(Asia/Shanghai)。 而这个在Windows环境下的influxdb会报错…

【youcans动手学模型】AlexNet模型CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】AlexNet模型CIFAR10图像分类 1. AlexNet 卷积神经网络模型1.1 论文简介1.2 AlexNet 的主要贡献1.3 AlexNet 网络1.4 模型的运行结果 2. 在 PyTorch 中定义 AlexNet 模型类2.1 按…

Qt编写视频监控系统77-Onvif组件支持非正常时间的设备

一、前言 在经历了大量的现场设备测试&#xff0c;至少几十种厂家、几百种设备&#xff0c;遇见过奇奇怪怪的问题&#xff0c;一个个想方设法解决&#xff0c;发现有个问题是在下发鉴权的时候&#xff0c;需要带上设备的时间&#xff0c;而不是发送端的时间&#xff0c;如果带…

LeetCode 1110. 删点成林

【LetMeFly】1110.删点成林 力扣题目链接&#xff1a;https://leetcode.cn/problems/delete-nodes-and-return-forest/ 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c…

MySQL 系统信息函数

文章目录 系统信息函数1. 查看当前 MySQL 数据库版本号2. 查看当前使用的数据库3. 查看当前服务器连接次数 系统信息函数 当我们需要知道当前 MySQL 数据库的一些基本信息和使用情况的时候&#xff0c;可以使用系统信息函数来获取相关信息&#xff0c;以随时掌握数据库的使用情…

【C++系列P2】引用——背刺指针的神秘刺客(精讲一篇过!)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01;如标题所示&#xff0c;本章主要内容主要来侃侃“引用”这个刺客&#xff01;如下就是大纲啦~ 一.引用 1.含义与特点 引用&#xff0c;即取别名。它的最大特点是编译器不会为引用变量而开辟空间…

Segment Anything——图像分割的基础模型介绍

人工智能中的基础模型变得越来越重要。这个术语开始在 NLP 领域加快步伐,现在,随着 Segment Anything Model 的出现,他们也慢慢进入了计算机视觉领域。Segment Anything是 Meta 的一个项目,旨在为图像分割的基础模型构建起点。在本文中,我们将了解 Segment Anything 项目最…