Sleuth如何生成traceId

Sleuth如何生成traceIdSpringBoot 启动时在 zipkin 的包中配置 MDCScopeDeco 属性 添加 traceId 和 spanId Sleuth 版本 3 1 0 生成 traceId 和 spanId 直接使用 traceId 和 spanId 获取 日志格式为 traceId X traceId spanId X spanId Logback 天然配置 MDC 通过 LogbackMDCAd 最终填充 traceId 和 spanId 值

1 版本

Sleuth版本:3.1.0

ZipKin版本:io.zipkin.brave:5.13.2

Logback版本:1.2.3

2 启动SpringBoot

2.1 构建MDCScopeDecorator属性

brave.baggage.CorrelationScopeDecorator.Builder

在这里插入图片描述

2.2 构建对象:MDCScopeDecorator

brave.context.slf4j.MDCScopeDecorator.Builder

在这里插入图片描述

2.3 填充属性:traceId和spanId

brave.baggage.CorrelationScopeDecorator.Builder

在这里插入图片描述

在这里插入图片描述

2.4 traceId和spanId

3 请求接口并打印日志

3.1 生成traceId

3.1.1 初始值

3.1.2 生成span

3.1.3 生成decorateContext

brave.Tracer#decorateContext(int, long, long, long, long, long, java.util.List

)

在这里插入图片描述



3.1.4 生成spanId

在这里插入图片描述
随机生成数据:
brave.Tracer#nextId
在这里插入图片描述






3.1.5 生成traceId

在这里插入图片描述

3.1.6 生成localRootId

在这里插入图片描述

3.1.7 生成span

3.1.8 添加请求属性

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 实际traceId

3.2.1 MDC添加traceId和值

3.2.2 生成最终的traceId

public String traceIdString() { 
    String r = traceIdString; if (r == null) { 
    r = toTraceIdString(traceIdHigh, traceId); traceIdString = r; } return r; } 
static String toTraceIdString(long traceIdHigh, long traceId) { 
    if (traceIdHigh != 0) { 
    char[] result = RecyclableBuffers.parseBuffer(); writeHexLong(result, 0, traceIdHigh); writeHexLong(result, 16, traceId); return new String(result, 0, 32); } return toLowerHex(traceId); } 
public static void writeHexLong(char[] data, int pos, long v) { 
    writeHexByte(data, pos + 0, (byte) ((v >>> 56L) & 0xff)); writeHexByte(data, pos + 2, (byte) ((v >>> 48L) & 0xff)); writeHexByte(data, pos + 4, (byte) ((v >>> 40L) & 0xff)); writeHexByte(data, pos + 6, (byte) ((v >>> 32L) & 0xff)); writeHexByte(data, pos + 8, (byte) ((v >>> 24L) & 0xff)); writeHexByte(data, pos + 10, (byte) ((v >>> 16L) & 0xff)); writeHexByte(data, pos + 12, (byte) ((v >>> 8L) & 0xff)); writeHexByte(data, pos + 14, (byte) (v & 0xff)); } 
static void writeHexByte(char[] data, int pos, byte b) { 
    data[pos + 0] = HEX_DIGITS[(b >> 4) & 0xf]; data[pos + 1] = HEX_DIGITS[b & 0xf]; } 

3.3 更新traceId和spanId值

brave.baggage.CorrelationScopeDecorator.Multiple#decorateScope

在这里插入图片描述

3.4 更新方法

3.5 添加MDCAdapter

3.6 logbackMDCAdapter添加traceId

ch.qos.logback.classic.util.LogbackMDCAdapter#put

在这里插入图片描述

3.7 threadLocal中生成span

3.8 路径过滤

3.9 输出日志

在这里插入图片描述

3.10 传输traceId和spanId

4 日志中生成traceId和spanId

在这里插入图片描述

5 小结

  • SpringBoot启动时在zipkin的包中配置MDCScopeDecorator属性,添加traceId和spanId;
  • Sleuth版本:3.1.0:生成traceId和spanId直接使用traceId和spanId获取,日志格式为:[traceId=%X{traceId:-}, spanId=%X{spanId:-}]
  • Logback天然配置MDC,通过LogbackMDCAdapter最终填充traceId和spanId值。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212508.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:53
下一篇 2026年3月18日 下午7:54


相关推荐

  • OpenClaw 初级到高级完整教程!

    OpenClaw 初级到高级完整教程!

    2026年3月16日
    3
  • fastDB_最近使用

    fastDB_最近使用fastdb的官网fastdb怎么在Linux上面安装?$su-$cd/usr/local/src$wgethttp://www.garret.ru/fastdb-3.76.tar

    2022年8月2日
    12
  • mysql的int最大值_MySQL中int最大值深入讲解

    mysql的int最大值_MySQL中int最大值深入讲解导语前两天看到的问题,展开写一下。字节我们都知道计算机是以二进制为基础。存储的基本单位是Bit,也称为比特、二进制位。1bit可以表示0或者1两个数字,是可能存在的最小的信息量,任何小于1bit的内容都算不上信息。复杂的内容就要用多bit来表示。Byte,也称为字节,通常用作计量单位。1byte等于8bit,即1byte可以表示28内容。MySQL中的字节…

    2025年7月13日
    4
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

    2022年4月25日
    61
  • 完整版—Android studio入门教程

    完整版—Android studio入门教程AS的安装及第一个AS中android项目的搭建前言:前段时间公司搞了个”校企合作”的项目,要求公司人员去学校对学生进行阶段性的专业培训,荣幸的我被派去当了回“老师”;哈哈,真的有点“打肿脸充胖子”的感觉;不过,也算是复习下as的安装过程吧,顺便有空了就记录下来,后面万一忘了也好查看。正文:首先需要确定好电脑是否有安装java环境:直接电脑桌面windows+R输入cmd…

    2022年6月7日
    45
  • 直插式电阻电容封装与尺寸图…[通俗易懂]

    原文地址:直插式电阻电容封装与尺寸图解作者:北极光直插式无源器件体积普遍要比贴片式要大一些,而且直插式器件在制作PCB时需要打孔,焊接工艺跟贴片式也有差别,较为麻烦,相对而言,直插式电阻电容多是面向大功率电路应用。一、直插式电阻封装及尺寸直插式电阻封装为AXIAL-xx形式(比如AXIAL-0.3、AXIAL-0.4),后面的xx代表焊盘中心间距为xx英寸,这一点在网上很多文章都没说清楚

    2022年4月12日
    469

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号