H__D  

参考:spring webflux链路跟踪【traceId日志自动打印】_springboot webflux 定义统一的 treaid-CSDN博客

介绍

  2016 年,Spring Cloud 团队创建了一个可以帮助许多开发人员的跟踪库。 它被称为 Spring Cloud Sleuth。 Spring 团队意识到跟踪可以从 Spring Cloud 中分离出来,并创建了 Micrometer Tracing 项目,该项目本质上是 Spring Cloud Sleuth 的 Spring 不可知的副本。 Micrometer Tracing 于 2022 年 11 月发布了 1.0.0 GA 版本,此后一直在稳步改进。

  Micrometer Tracing 为最流行的 Tracer 库提供了一个简单的外观,让您能够检测基于 JVM 的应用程序代码,而不会受到供应商限制。 它旨在为您的跟踪收集活动增加很少或没有开销,同时最大限度地提高跟踪工作的可移植性。

  它还提供了对 Micrometer 的跟踪扩展(从 Micrometer 1.10.0 开始)。 每当使用 an 时,都会创建、启动、停止和报告相应的 span。

  现在 Spring Cloud 使用 Micrometer 进行日志追踪

问题

  新建一个项目 Spring Cloud Gateway项目,引入依赖

 1         <dependency>
 2             <groupId>org.springframework.boot</groupId>
 3             <artifactId>spring-boot-starter-actuator</artifactId>
 4         </dependency>
 5 
 6         <!-- Micrometer Tracing 核心 -->
 7         <dependency>
 8             <groupId>io.micrometer</groupId>
 9             <artifactId>micrometer-tracing</artifactId>
10         </dependency>
11 
12         <!-- 桥接到 OpenTelemetry(推荐) -->
13         <dependency>
14             <groupId>io.micrometer</groupId>
15             <artifactId>micrometer-tracing-bridge-otel</artifactId>
16         </dependency>

  测试网关功能,并打印日志,发现日志中并没有traceId

  调试发现应该是traceId 无法在WebFlux项目中传播的问题

解决

1、引入支持 Reactor 自动传播的jar包

1         <!-- Reactor 的自动上下文传播(traceId) -->
2         <dependency>
3             <groupId>io.projectreactor</groupId>
4             <artifactId>reactor-core</artifactId>
5         </dependency>

   完整pom.xml

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0"
  3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5     <modelVersion>4.0.0</modelVersion>
  6     <parent>
  7         <groupId>org.springframework.boot</groupId>
  8         <artifactId>spring-boot-starter-parent</artifactId>
  9         <version>3.2.5</version>
 10         <relativePath/>
 11     </parent>
 12 
 13     <groupId>com.test</groupId>
 14     <artifactId>test-framework-gateway</artifactId>
 15     <version>2.0.0-SNAPSHOT</version>
 16 
 17     <properties>
 18         <!-- 基础配置 -->
 19         <java.version>17</java.version>
 20         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 21         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 22 
 23         <!-- Spring 相关 -->
 24         <spring-boot.version>3.2.5</spring-boot.version>  <!-- Spring Boot 3.x 最新稳定版 -->
 25         <spring-cloud.version>2023.0.1</spring-cloud.version>  <!-- 对应Spring Boot 3.2.x -->
 26         <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>  <!-- 支持JDK17的最新版 -->
 27 
 28         <test-framework.version>2.0.0-SNAPSHOT</test-framework.version>
 29 
 30     </properties>
 31 
 32     <dependencyManagement>
 33         <dependencies>
 34             <!-- ========== Spring 官方依赖 ========== -->
 35             <!-- Spring Boot 依赖管理 -->
 36             <dependency>
 37                 <groupId>org.springframework.boot</groupId>
 38                 <artifactId>spring-boot-dependencies</artifactId>
 39                 <version>${spring-boot.version}</version>
 40                 <type>pom</type>
 41                 <scope>import</scope>
 42             </dependency>
 43 
 44             <!-- Spring Cloud 依赖管理 -->
 45             <dependency>
 46                 <groupId>org.springframework.cloud</groupId>
 47                 <artifactId>spring-cloud-dependencies</artifactId>
 48                 <version>${spring-cloud.version}</version>
 49                 <type>pom</type>
 50                 <scope>import</scope>
 51             </dependency>
 52 
 53             <!-- Spring Cloud Alibaba 依赖管理 -->
 54             <dependency>
 55                 <groupId>com.alibaba.cloud</groupId>
 56                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
 57                 <version>${spring-cloud-alibaba.version}</version>
 58                 <type>pom</type>
 59                 <scope>import</scope>
 60             </dependency>
 61         </dependencies>
 62     </dependencyManagement>
 63 
 64 
 65     <dependencies>
 66 
 67         <!-- Spring Cloud Gateway -->
 68         <dependency>
 69             <groupId>org.springframework.cloud</groupId>
 70             <artifactId>spring-cloud-starter-gateway</artifactId>
 71         </dependency>
 72 
 73         <!-- alibaba nacos 注册中心-->
 74         <dependency>
 75             <groupId>com.alibaba.cloud</groupId>
 76             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 77         </dependency>
 78 
 79         <!-- alibaba nacos 配置中心-->
 80         <dependency>
 81             <groupId>com.alibaba.cloud</groupId>
 82             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 83         </dependency>
 84 
 85         <!-- 负载均衡 -->
 86         <dependency>
 87             <groupId>org.springframework.cloud</groupId>
 88             <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 89         </dependency>
 90 
 91         <dependency>
 92             <groupId>org.springframework.boot</groupId>
 93             <artifactId>spring-boot-starter-actuator</artifactId>
 94         </dependency>
 95 
 96         <!-- Micrometer Tracing 核心 -->
 97         <dependency>
 98             <groupId>io.micrometer</groupId>
 99             <artifactId>micrometer-tracing</artifactId>
100         </dependency>
101 
102         <!-- 桥接到 OpenTelemetry(推荐) -->
103         <dependency>
104             <groupId>io.micrometer</groupId>
105             <artifactId>micrometer-tracing-bridge-otel</artifactId>
106         </dependency>
107 
108         <!-- Reactor 的自动上下文传播(traceId) -->
109         <dependency>
110             <groupId>io.projectreactor</groupId>
111             <artifactId>reactor-core</artifactId>
112         </dependency>
113 
114         <dependency>
115             <groupId>org.projectlombok</groupId>
116             <artifactId>lombok</artifactId>
117             <optional>true</optional>
118             <scope>provided</scope>
119         </dependency>
120 
121     </dependencies>
122 
123 
124     <build>
125         <plugins>
126             <!-- 指定Maven编译版本 -->
127             <plugin>
128                 <groupId>org.apache.maven.plugins</groupId>
129                 <artifactId>maven-compiler-plugin</artifactId>
130                 <version>3.11.0</version>
131                 <configuration>
132                     <source>${java.version}</source>
133                     <target>${java.version}</target>
134                     <encoding>${project.build.sourceEncoding}</encoding>
135                 </configuration>
136             </plugin>
137         </plugins>
138     </build>
139 </project>
View Code

2、初始化Reactor 的全局 Hook

package com.test.gateway.config;

import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Hooks;

@Configuration
public class OtelConfig {

    /**
     * 初始化阶段:
     *
     * Hooks.enableAutomaticContextPropagation() 注册 Reactor 的全局 Hook。
     * 将 OpenTelemetry 的 Context 与 Reactor 的 ContextView 自动关联。
     */
    @PostConstruct
    public void enableReactorContextPropagation() {
        // 启用 Reactor 的自动上下文传播 traceId
        Hooks.enableAutomaticContextPropagation();
    }

}

  测试网关功能,并打印日志,发现日志中打印了traceId

参考:spring webflux链路跟踪【traceId日志自动打印】_springboot webflux 定义统一的 treaid-CSDN博客

 

posted on 2025-06-04 00:55  H__D  阅读(188)  评论(1)    收藏  举报