分布式链路跟踪 traceId spanId parentSpanId自定义业务处理:比如设置userId

微服务调用链日志追踪分析 一、技术原理 1.1 背景 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。 举个例子,在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面),然后 阅读详情

背景:在分布式服务架构下,一个 Web 请求从网关流入,有可能会调用多个服务对请求进行处理,拿到最终结果。在这个过程中每个服务之间的通信又是单独的网络请求,无论请求流经的哪个服务除了故障或者处理过慢都会对前端造成影响。

一、相关概念

在分布式链路追踪中有两个重要的概念:跟踪(trace)和 跨度(span)。trace 是请求在分布式系统中的整个链路视图,span 则代表整个链路中不同服务内部的视图,span 组合在一起就是整个 trace 的视图。

traceId:用于标识某一次具体的请求ID。当用户的请求进入系统后,会在RPC调用网络的第一层生成一个全局唯一的traceId,并且会随着每一层的RPC调用,不断往后传递,这样的话通过traceId就可以把一次用户请求在系统中调用的路径串联起来。

spanId,用于标识一次RPC调用在分布式请求中的位置。请求到达每个服务后,服务都会为请求生成spanId。当用户的请求进入系统后,处在RPC调用网络的第一层A时spanId初始值是0,进入下一层RPC调用B的时候spanId是0.1,继续进入下一层RPC调用C时spanId是0.1.1,而与B处在同一层的RPC调用D的spanId是0.2,这样的话通过spanId就可以定位某一次RPC请求在系统调用中所处的位置,以及它的上下游依赖分别是谁。

parent-spanId:用于标识上游RPC调用在分布式请求中的位置。请求到达每个服务后,随请求一起从上游传过来的上游服务的 spanId 会被记录成 parent-spanId,或者叫 pspanId。当前服务生成的 spanId 随着请求一起,在传到下游服务时,这个 spanId 又会被下游服务当作 parent-spanId 记录。

MDC:(Mapped Diagnostic Context)映射诊断环境,是 log4j 和 logback 提供的一种方便在线多线程条件下记录日志的功能,可以看成是一个与当前线程绑定的 ThreadLocal。

org.slf4j 1.7.25 版本
public static void put(String key, String val) throws IllegalArgumentException {
if (key == null) {
throw new IllegalArgumentException(“key parameter cannot be null”);
} else if (mdcAdapter == null) {
throw new IllegalStateException(“MDCAdapter cannot be null. See also http://www.slf4j.org/codes.html#null_MDCA”);
} else {
mdcAdapter.put(key, val);
}
}

public static MDC.MDCCloseable putCloseable(String key, String val) throws IllegalArgumentException {
    put(key, val);
    return new MDC.MDCCloseable(key);
}

public static String get(String key) throws IllegalArgumentException {
    if (key == null) {
        throw new IllegalArgumentException("key parameter cannot be null");
    } else if (mdcAdapter == null) {
        throw new IllegalStateException("MDCAdapter cannot be null. See also http://www.slf4j.org/codes.html#null_MDCA");
    } else {
        return mdcAdapter.get(key);
    }
}

public static void remove(String key) throws IllegalArgumentException {
    if (key == null) {
        throw new IllegalArgumentException("key parameter cannot be null");
    } else if (mdcAdapter == null) {
        throw new IllegalStateException("MDCAdapter cannot be null. See also http://www.slf4j.org/codes.html#null_MDCA");
    } else {
        mdcAdapter.remove(key);
    }
}

public static void clear() {
    if (mdcAdapter == null) {
        throw new IllegalStateException("MDCAdapter cannot be null. See also http://www.slf4j.org/codes.html#null_MDCA");
    } else {
        mdcAdapter.clear();
    }
}

二、写过滤器继承GenericFilterBean,请求就能拦截到

@Component
public class CustomerHttpSpanInterceptor extends GenericFilterBean {

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	try {
		// 填充数据(适用logback、log4j 1.x)
		MDC.put("userId","121242");
		servletRequest.getAttribute("");
		// 填充数据(适用log4j 2.x)
		// ThreadContext.put(Contents.REQUEST_ID, UUID.randomUUID().toString());
		filterChain.doFilter(servletRequest, servletResponse);
	} finally {
		// 请求结束时清除数据,否则会造成内存泄露问题
		MDC.remove("traceId");
	}
}

}
在这里插入图片描述

三、设置日志

在 log4j、logback中配置 %X{userId},即可在日志中打印userId。

[%X{userId:-}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [%thread] %-5level %logger{50} %L - %msg%n
(如果是引用了sleuth,就可以直接使用X-B3-TraceId 和X-B3-SpanId
[%X{userId:-}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [%thread] %-5level %logger{50} %L - %msg%n
)

日志打印实例:
[121242] 2022-07-14 10:52:36.621 [0b34b37d0e7655f0] [0b34b37d0e7655f0] [http-nio-13053-exec-1] DEBUG c.t.dao.IXXXXXDao.queryXXXXInfo 159 - <== Total: 1

✅全链路追踪关键技术-TraceId、SpanId生成规则 链路追踪的traceid原理梳理 阅读详情

相关推荐

分布式链路追踪—traceId生成与使用(MDC)

之前遇到过在分布式环境中不方便查找日志的问题,虽然现在的很多云服务环境都提供这种功能,但是在自己搭建的分布式环境中可以考虑应急的这样做,先记录下,以便下次快速使用 注意:MDC-traceId在分布式环境中使用步骤(下面的3456四个类在分布式用到的工程中都需要添加,可以考虑添加到第三方工程中统一在pom中引入) 1、 引入log4j的同时需要注意去除冲突包 <dependency> <groupId>org.spr...

专注基础架构领域 1万+

分布式链路跟踪中的traceid和spanid代表什么?

在分布式服务架构下,一个 Web 请求从网关流入,有可能会调用多个服务对请求进行处理,拿到最终结果。这个过程中每个服务之间的通信又是单独的网络请求,无论请求经过的哪个服务出了故障或者处理过...

kevin_tech的博客,微信搜「网管叨bi叨」 2万+

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 560

TraceId和SpanID(分布式ID)

一次完整的请求链路,从请求发起到请求结束,整个过程的所有请求都会有相同的。用户请求 → API 网关 → 订单服务 → 支付服务 → 库存服务。,比如执行了哪些操作、耗时多少、是否出错等。traceId 可能包含多个 spanId。一起使用,帮助开发者快速定位系统问题。,包括它经过的所有微服务和调用。,方便后续分析整个请求链路。代表整个请求的全局 ID。里的核心概念,主要用于。下的某个具体的请求片段。这些所有的调用,都会。继续上面的例子,一个。,代表整个请求链路。,用于记录调用关系。

2302_79637382的博客 2982

忘记安卓锁屏密码怎么办?3种方法教你用ADB恢复访问(含gesture.key解密)

本文详细解析了安卓设备锁屏密码的存储与加密机制,特别是gesture.key文件的解密原理。针对遗忘密码的常见问题,提供了三种核心恢复方法:利用ADB调试接口删除密码文件、对gesture.key进行离线分析与解密,以及应对高版本系统的替代方案。重点介绍了通过ADB工具在Recovery模式下操作的具体步骤,帮助用户在合法合规前提下恢复设备访问权限。

php55的博客 959

HDMI接口技术解析:从基础到应用

本文深入解析HDMI接口技术,从其发展历程、物理结构到传输原理,全面剖析HDMI如何成为影音传输的主流标准。通过对比不同版本的带宽升级和实际应用案例,展示HDMI在4K/8K视频传输中的卓越性能,并分享硬件设计中的实战经验与避坑指南。

weixin_30485379的博客 370

TranceId和SpanId介绍

在分布式链路追踪系统中,Trace ID和Span ID是两个核心概念,它们用于标识和追踪请求在分布式系统中的流转路径。

猿脑2.0的博客 1422

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2155

spanId+traceId+segmentId的区别

segmentId : 同一个 线程链路中,这个值都是相同的,不同线程链路中 这个值不同。parentSpanId : 在同一个线程的链路中,用来连接 span。spanId : 同一个线程中唯一, 从0始,按照调用链路从0递增。traceId : 在一个 链路 中 traceId 唯一。下面就总结一下 上面出现的 几个 ID 都是什么含义。

weixin_37862824的博客 1396

搜索神器Perplexity的详细使用方法(持续更新)

本文主要介绍了ChatGPT的互补工具Perplexity的详细使用方法,希望对新手有所帮助。需要说明的是,Perplexity不需要上网工具,很方便新手和小白上手使用。Perplexity的官网链接为:https://www.perplexity.ai/ 。 文章目录 1. 为什么要讲Perplexity? 2. 详细使用方法 2.1 使用要点一 2.2 使用要点二 2.3 使用要点三

herosunly的博客 8万+

JNI的本质解析:Android Framework视角下的Java-Native衔接机制

本文基于Android 14源码深入分析JNI机制,从Android Framework视角解析Java-Native衔接原理。主要内容包括:JNI的双轨制注册机制(静态与动态注册),核心数据结构(JNIEnv与JavaVM)的实现原理,以及完整的调用链路剖析。文章通过MessageQueue的JNI实现案例,展示Android Framework如何利用JNI实现Java层与Native层的高效交互,并提供了性能优化建议。分析表明,JNI作为Android系统架构的关键桥梁,其设计充分考虑了性能、安全性

保持专注,保持热爱 1211

在分布式系统中使用过滤器对请求进行链路追踪:Span ID和Trace ID的作用和处理流程

在微服务架构中,一个请求可能需要经过多个服务。为了更好地理解和跟踪一个请求在各个服务之间的运行情况,我们通常需要使用链路追踪。这篇博客将会解释如何利用过滤器来实现这一功能,重点关注Trace ID和Span ID的作用及其处理流程。利用过滤器进行链路追踪是跟踪微服务中请求处理状态的一种高效方式。正确使用与理解Span ID和Trace ID对于分析和优化微服务性能至关重要。

weixin_31188147的博客 1012

【WRFDA第三期】OBSPROC namelist 变量总结

OBSPROC namelist 变量总结

WW、forever的博客 1120

使用Tlog记录traceId/spanId

记录traceId/spanId的必要性,可以理清楚一整个调用链路。

imVainiycos的博客 1668

Python爬招聘网站:Selenium+ActionChains破解滑动验证码,批量采集岗位数据(新手可跑)

通过本文实战,你不仅学会了用Selenium+ActionChains破解滑动验证码,还掌握了爬虫的核心优化思路——“模拟人类行为”是突破反爬的关键。这套逻辑不仅适用于招聘网站,还能迁移到其他有滑动验证码的平台(如电商、资讯网站)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1188

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

多线程情形下,日志链路traceId、spanId的传递

创建线程池异步调用服务的情形中,子线程在打印日志的过程中traceId将丢失 解决思路:重写线程池,对任务进行一次封装,在调度任务的之前将链路塞入MDC。几乎所有的情形下很少会new线程池(及其不推荐使用),自带的创建线程池的方案也不推荐使用,阿里巴巴开发手册推荐创建线程池的方案是使用ThreadPoolExecutor创建线程池,线程池创建大小,自定义名称,自定义拒绝策略等优点在此不多赘述 直接上代码: import com.csrcb.constants.MyConstant; impor.

gangye19970101的博客 9227

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

微服务之间的trace_id追踪链

微服务trace追踪链路

一只笨鸟的博客 4576

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

撸了几天的sofa-tracer之后,我悟了!

什么是分布式链路跟踪 简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术。 应用场景如下: 应用A,B,C,D,E 以一个层级关系依赖, 当用户向 应用A 发起请求,但是返回了个异常,为了排查这个问题,我们可能要一台台服务器去排查。在分布式架构下,每个应用又部署了几十上百台服务器, 那一天下来,可能多没找到问题的触发点。 通过分布式链路跟踪,结合 如 鹰眼 等平台的 链路分析,我们可以很快定位到 问题发生机器地址。 那为什么我们可以很快速定位到哪台机器? TraceId 日志收集,收集

JokerKon的博客 873

SpringCloud Logback日志配置输出 sleuth 中的 span和traceid

springboot logback的源码分析请参考这篇,讲的很好:https://juejin.im/post/5cd0cdcc6fb9a0323120a3f4 一、日志常规配置 直接贴出logback-spring.xml,基本满足了对日志的常规需求: 1、控制台日志(带颜色显示) 2、全部日志文件(包括全别日志级别的日志,每天一个,自动压缩) 3、错误日志文件(仅抽取ERROR级别日志,每天一个,自动压缩) 说明: a. 日志存放目录需要在application.yml中配置: loggi.

z69183787的专栏 8966

SpringCloud 远程调用日志记录traceId和spanId

最近在项目开发中遇到了一些问题,项目为多机部署,大量日志输出导致很难筛出指定请求的全部相关日志,以及下游服务调用对应的日志。因此计划对项目日志打印进行一些小改造,使用一个traceId跟踪请求的全部路径,前提是不修改原有的打印方式。 简单的解决思路 想要跟踪请求,第一个想到的就是当请求来时生成一个traceId放在ThreadLocal里,然后打印时去取就行了。但在不改动原有输出语句的前提下自然...

batman 8864

spring-cloud-sleuth及自定义日志链路traceId、spanId跟踪

在上文ELK日志集成中讲到了日志的排查方法,现在聊聊使用spring-cloud-sleuth和MDC+拦截器两种方法操作traceId实现全链路调用日志跟踪 方法一:直接使用spring-cloud-starter-sleuth进行日志链路跟踪 在pom.xml文件中直接配置依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <arti.

gangye19970101的博客 1万+

trace链路追踪分享

首先需要知道traceId、spanId、cspanId都是干什么的? 如上图所示: 1.http请求serve1 2.serve1生成一个traceId贯穿整个链路(serve1->serve2->serve3),spanId是贯穿整个serve1的(serve2,serve3同理) 3.cspanId的作用主要就是当serve1触发请求serve2的时候,serve1这个时候会生成一个cspanId作为下游(serve2)链路的spanId,同理:serve2请求serve3的时

dong_1997_的博客 1268

全链路追踪关键技术-Thrift协议Header添加

首先对于远程通信的链路埋点来说,有两个关键信息需要传递,即 traceId 与 spanId(parent spanId)。 通信方式目前 链路跟踪框架 只支持 Http 一种。而 Http 利用 header 来传递 trace 信息也十分方便(traceId,spanId)。Client 端采用封装过的 httpClient 或者在 soa 中埋点,均往 header 中塞入了 trace 信息。Server 端采用 spring-web-servlet-filter,本质也就是个拦截器来读取 req

maoyeqiu的专栏 2441

SpringCloud Sleuth 实现业务逻辑日志包含 Span 和 Trace信息

概述 SpringCloud Sleuth是Spring Cloud的核心组件之一,实现了一种分布式链路跟踪的功能。在调用链层级很深的分布式系统中,为定位问题提供了很大便利。 Sleuth 大致的原理是自定义了一个拦截器:TraceFeignRequestInterceptor,该拦截器继承了 Feign 的拦截器接口:RequestInterceptor,所以在服务与服务直接调用时,可以进行一些...

程序员阿康 5106

分布式链路追踪-skywalking基础

分布式链路追踪skywalking的介绍和单机版安装

weixin_44044929的博客 938

微服务架构之「 调用链监控 」

点击上方“朱小厮的博客”,选择“设为星标”做积极的人,而不是积极废人「 调用链监控 」是在微服务兴起后才有的一种新流行的监控模式。因为在我们传统单体应用的项目中,不存在服...

朱小厮的博客 1682
上一篇: 软件中GA、Release、RC、Beta、Alpha 各版本号的意义
下一篇: Angularjs启动安装过程
Java_sanlin
博客等级 码龄10年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值