| 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> 2、初始化Reactor 的全局 Hookpackage 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博客
|
![]() |
|
|
博客園
|
|