链路追踪 - Micrometer


在分布式系统中,跟踪请求的流转路径是非常重要的,有助于调试、监控和优化系统性能。 Spring Cloud Sleuth是常见的解决方案,用于实现分布式追踪。

Spring官方文档已经说明,Springboot 3.x不再支持sleuth的使用,已经转移至Micrometer Tracing项目

Micrometer

Spring Cloud Sleuth 在最近的更新中已经进行了重大调整。在 Spring Cloud 2022.0.0 及以后版本中,Spring Cloud Sleuth 的功能已经整合进了 Spring Boot 和 Spring Cloud 体系中,并且开始推荐使用 Micrometer 来代替部分 Sleuth 的功能。

1. 引入依赖

新版本推荐使用 Micrometer Tracing 和 Spring Boot Actuator 提供的追踪功能。确保配置了相关依赖:

Maven:

   <dependency>
       <groupId>io.micrometer</groupId>
       <artifactId>micrometer-tracing</artifactId>
   </dependency>
   <dependency>
       <groupId>io.micrometer</groupId>
       <artifactId>micrometer-tracing-bridge-brave</artifactId>
   </dependency>
  • 对于自动化配置,Spring Boot Actuator 提供了开箱即用的集成。只需要引入 Actuator 相关依赖:

*** Maven: ***

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

2. 配置 Micrometer Tracing

Micrometer Tracing 会自动将 traceId 和 spanId 注入到日志的 MDC(Mapped Diagnostic Context)上下文中。确保在 Spring Boot 应用中激活必要的配置。
在配置文件application.propertiesapplication.yml中添加必要的配置。例如:

management.endpoints.web.exposure.include=*
management.metrics.export.influx.enabled=true
management.metrics.export.influx.uri=http://localhost:8086
management.metrics.export.influx.org=my-org
management.metrics.export.influx.bucket=my-bucket
management.metrics.export.influx.token=my-token
management.tracing.enabled=true

这样设置将会启用 Micrometer 的追踪功能。

3. 添加自定义的 Span

除了自动生成的 Span,还可以在代码中手动创建 Span 来追踪特定的业务逻辑。简单示例:

import io.micrometer.tracing.Tracer;
import io.micrometer.tracing.Span;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TraceController {

    @Autowired
    private Tracer tracer;

    @GetMapping("/trace")
    public String trace() {
        Span newSpan = tracer.nextSpan().name("custom-span").start();
        try (Tracer.SpanInScope ws = tracer.withSpan(newSpan)) {
            // 业务逻辑
            return "Tracing example";
        } finally {
            newSpan.end();
        }
    }
}

4. 配置 Logback

src/main/resources目录下创建或编辑logback-spring.xml文件,配置 Span 信息输出。以下示例展示了如何将 Span ID 和 Trace ID 输出到日志中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 定义日志格式 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n%X{traceId:-} %X{spanId:-}"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

此配置将 traceId 和 spanId 添加到每条日志消息的后面。

5. 查看链路追踪数据

导出追踪数据到合适的监控系统,如 Zipkin 或 Jaeger:

management.zipkin.enabled=true
management.zipkin.base-url=http://localhost:9411/

配置以上属性将会将追踪数据发送到本地运行的 Zipkin 实例。

6. 官方支持文档截图

Micrometer Tracing

名词解释

官方推荐报告工具- Zipkin

我理解你的问题是关于在Spring Boot 3中使用Micrometer Tracing Bridge Brave进行RabbitMQ链路追踪时遇到的问题。 首先,你需要在你的项目中添加以下依赖: ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-zipkin</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> ``` 然后,在你的配置文件中,你需要启用Micrometer和Zipkin: ``` management.metrics.export.zipkin.enabled=true management.metrics.export.zipkin.uri=http://localhost:9411 ``` 接下来,你需要配置RabbitMQ,以便将跟踪信息添加到消息头中: ``` @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Tracer tracer) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setBeforePublishPostProcessors(message -> { Span span = tracer.currentSpan(); if (span != null) { message.getMessageProperties().setHeader("X-B3-TraceId", span.context().traceIdString()); message.getMessageProperties().setHeader("X-B3-SpanId", span.context().spanIdString()); } return message; }); return rabbitTemplate; } ``` 最后,你需要在你的应用程序中创建一个跨度: ```java @Autowired private Tracer tracer; public void sendMessage() { Span span = tracer.nextSpan().name("sendMessage").start(); try (Tracer.SpanInScope ws = tracer.withSpan(span)) { // 发送消息 } finally { span.finish(); } } ``` 如果你的链路追踪仍然无效,可能是因为你的RabbitMQ配置不正确或你的Zipkin服务器没有启动。你可以使用Zipkin UI查看跟踪信息,或者使用Zipkin API查询跟踪信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值