如何使用 micrometer-brave 在 spring-cloud-gateway 中获取trace-id

Mur*_*rov 5 spring-boot micrometer spring-cloud-gateway

我想在 Spring Cloud Gateway 中的每个请求的日志中显示traceId。然而,traceId和spanId只是空的。

日志配置如下:

logging:
  pattern:
    level: "%5p [TRACE_ID: %X{traceId:-}] [SPAN_ID: %X{spanId:-}]"
Run Code Online (Sandbox Code Playgroud)

pom.xml 的一部分:

  <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-tracing-bridge-brave</artifactId>
  </dependency>
  
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
      <version>3.0.1</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

che*_*cal 9

使用 Spring Boot 3.x 和 Micrometer 1.10+,您可以尝试以下依赖项:

(pom.xml 的一部分)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing-bridge-brave</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-observation</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <version>1.0.2</version>
        <artifactId>micrometer-tracing</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <version>1.0.2</version>
        <artifactId>context-propagation</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.micrometer</groupId>
            <version>1.10.4</version>
            <artifactId>micrometer-bom</artifactId>
            <scope>import</scope>
        <type>pom</type>
    </dependency>
    </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

并在应用程序的主类中进行以下调用:

import reactor.core.publisher.Hooks;

public static void main(String[] args) {
    Hooks.enableAutomaticContextPropagation();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Spring Boot 应该很快就会集成这些版本的依赖项并为您进行调用,但现在这些手动步骤应该会为您提供带有跟踪信息的日志。

在reactor-core 3.5.3中,我们添加了使用上下文传播(可选)库注册的ThreadLocal值的自动传播,Micrometer也使用该库。如果您对详细信息感兴趣,请查看介绍此功能的PR 。这是3.5.0带来的一般增强,其中 ThreadLocals 填充在特殊运算符 ->句柄分接头(及其重载)中。