news 2026/7/21 7:23:40

关于springboot引入traceid来保障可观测型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于springboot引入traceid来保障可观测型

概述:
引入traceid是为了让每个用户请求进来,给每个线程分配一个标识,也就是traceid,然后回头,可以区分,哪个用户,在请求接口的,在接口的哪一步除了问题,当然,这里也要合适的使用日志。

我们这里就对这个使用traceid,以及遇到错误。这个全流程的知识点做一点总结。这样如果是涉及traceid的问题的时候可以得到解决。

1.如何引入traceid

哪个依赖里会携带traceid

2.traceid需要做配置吗,需要配置什么东西

3.在哪里可以看到traceid是否生效。

TraceId 全流程使用指南
一、如何引入TraceId

  1. 主要依赖
    Spring Cloud Sleuth(或新版整合的 Micrometer Tracing)是最常用的TraceId实现方案:

xml

<!-- Spring Boot 2.x + Spring Cloud 3.x --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><!-- Spring Boot 3.x + Spring Cloud 4.x --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth-o11y</artifactId></dependency><!-- 或者使用 Micrometer Tracing --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId></dependency>
  1. 链路传递的核心组件
    Brave/Zipkin:分布式追踪库

MDC (Mapped Diagnostic Context):线程上下文存储TraceId

HTTP请求拦截器:自动在HTTP头传递TraceId

消息队列拦截器:如RabbitMQ/Kafka的TraceId传递

二、TraceId配置

  1. 基本配置
    yaml

application.yml

spring: sleuth: enabled: true # TraceId采样率,1.0表示100%采样 probability: 1.0
# 配置示例(不同版本可能不同) trace: id-length: 32 # TraceId长度 propagation: type: B3 # B3, W3C等传播格式
  1. 日志配置
    需要在日志模式中添加TraceId占位符:

xml

<!-- logback-spring.xml --><configuration><appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 关键:添加[traceId]字段 --><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId:-}] %-5level %logger{36} - %msg%n</pattern></encoder></appender></configuration>
  1. 自定义配置
    java
@ConfigurationpublicclassTraceConfig{@BeanpublicSampleralwaysSampler(){returnSampler.ALWAYS_SAMPLE;// 始终采样}// 自定义TraceId生成规则@BeanpublicIdGeneratortraceIdGenerator(){returnnewIdGenerator(){@OverridepublicStringgenerateTraceId(){// 自定义TraceId生成逻辑return"myapp-"+UUID.randomUUID().toString().replace("-","");}};}}

三、验证TraceId是否生效

  1. 查看日志输出
    启动应用后,调用任意接口,查看控制台日志:

text

2024-01-1510:30:25[http-nio-8080-exec-1][3f8a4b5c6d7e8f9a]INFOc.example.controller.UserController-用户查询开始 如果有[3f8a4b5c6d7e8f9a]这样的TraceId显示,说明生效。
  1. 通过API验证
    java
@RestController@RequestMapping("/debug")publicclassDebugController{@GetMapping("/trace")publicMap<String,String>getTraceInfo(){// 从MDC获取TraceIdStringtraceId=org.slf4j.MDC.get("traceId");// 或者使用Tracer APIStringspanId=Tracing.currentTracer().currentSpan().context().spanIdString();returnMap.of("traceId",traceId,"spanId",spanId);}}

访问 /debug/trace 查看返回的TraceId。

  1. 验证方法
    验证方式 操作步骤 预期结果
    查看应用日志 调用接口,观察日志格式 每条日志前都有TraceId
    HTTP头检查 查看请求/响应头的X-B3-TraceId 存在TraceId值
    链路调用验证 服务间调用,查看各服务日志 TraceId保持一致
    Zipkin界面 访问Zipkin UI (localhost:9411) 能看到完整的调用链路
  2. 快速验证脚本
    bash

调用接口并显示TraceId

curl -v http://localhost:8080/api/user/1 2>&1 | grep -i “trace|x-b3”

或者使用jq格式化输出

curl -s http://localhost:8080/api/user/1 | jq ‘.’
四、常见问题排查

  1. TraceId不显示
    原因1:日志pattern没有配置%X{traceId}

解决方案:检查logback配置

原因2:采样率设置为0

解决方案:设置spring.sleuth.sampler.probability=1.0

原因3:异步线程丢失TraceId

解决方案:

java
// 异步任务需要手动传递TraceId

@AsyncpublicCompletableFuture<String>asyncMethod(){// 从父线程获取TraceIdStringtraceId=MDC.get("traceId");returnCompletableFuture.supplyAsync(()->{MDC.put("traceId",traceId);// 设置到子线程try{returndoSomething();}finally{MDC.clear();}});}
  1. 跨服务TraceId丢失
    检查点:

确认服务间使用相同的传播格式(B3/W3C)

确认HTTP客户端配置了Tracing拦截器

检查网关是否透传TraceId头

  1. 自定义组件集成
    java
@ComponentpublicclassCustomComponent{// 手动获取当前TraceIdpublicvoidlogWithTrace(){Tracertracer=Tracing.currentTracer();Spanspan=tracer.currentSpan();if(span!=null){StringtraceId=span.context().traceIdString();logger.info("[TraceId: {}] 自定义组件执行",traceId);}}}

五、最佳实践建议
日志规范:在所有微服务中使用统一的日志格式

网关透传:确保API网关透传TraceId相关HTTP头

异步处理:对线程池和消息队列做好TraceId传递

监控告警:将TraceId集成到错误监控系统

开发调试:开发环境可设置100%采样率,生产环境适当调整

通过以上配置和验证方法,可以确保TraceId在整个分布式系统中正确传递和显示,便于问题排查和链路追踪。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 14:44:30

基于Spring Boot的人力资源管理信息系统

基于Spring Boot的人力资源管理信息系统介绍 一、系统定位与用户需求分析 核心目标&#xff1a;随着信息化时代的到来&#xff0c;企业对于人力资源管理的需求日益增加&#xff0c;传统的人力资源管理方式存在工作效率低、工作繁杂等问题&#xff0c;已无法满足现代企业的需求。…

作者头像 李华
网站建设 2026/7/20 20:28:23

ECharts 事件处理

ECharts 事件处理 引言 ECharts 是一个使用 JavaScript 实现的开源可视化库,广泛用于数据可视化。在 ECharts 中,事件处理是一个重要的功能,它允许开发者根据用户的交互动态更新图表。本文将详细介绍 ECharts 事件处理的各个方面,包括事件类型、监听方法以及实际应用案例…

作者头像 李华
网站建设 2026/7/19 22:59:01

springboot基于JAVA框架的学生寝室管理系统

基于SpringBoot的Java学生寝室管理系统介绍 一、系统背景与目标 学生寝室管理是高校后勤管理的重要环节&#xff0c;传统人工管理存在效率低、信息滞后、数据易出错等问题。本系统基于SpringBoot框架与Java语言开发&#xff0c;旨在实现寝室管理的数字化、智能化、规范化&#…

作者头像 李华
网站建设 2026/7/20 21:15:46

HTML 视频(Video)播放

HTML 视频(Video)播放 概述 HTML5 引入的 <video> 元素为网页提供了一种在浏览器中嵌入和播放视频内容的方式。它极大地简化了在网页上嵌入视频的过程,并允许开发者通过多种方式进行控制。 视频元素介绍 在 HTML5 中,<video> 元素用于在网页上嵌入视频。它…

作者头像 李华
网站建设 2026/7/21 6:41:10

通信系统仿真:通信系统基础理论_(4).数字通信基础

数字通信基础 1. 数字信号的表示与处理 1.1 数字信号的概念 数字信号是离散时间信号的一种,通常由一系列的二进制位组成。在数字通信系统中,信息首先被转化为数字信号,然后通过信道传输,最终在接收端恢复为原始信息。数字信号具有抗干扰能力强、易于存储和处理等优点,因…

作者头像 李华
网站建设 2026/7/21 6:38:26

Python 爬虫实战:将爬取数据存入 CSV 表格

前言 在数据采集与分析的工作场景中&#xff0c;Python 爬虫是获取网络公开数据的核心技术手段&#xff0c;而将爬取到的数据规范化存储则是后续数据处理的基础环节。CSV&#xff08;逗号分隔值&#xff09;格式作为一种轻量级、跨平台的表格文件格式&#xff0c;因其结构简单…

作者头像 李华