Spring Cloud Sleuth

- Spring Cloud Sleuth Spring Cloud

Spring Cloud Sleuth 核心原理

1. 分布式追踪概念

cs (Client Sent):标识客户端发起请求的时间点。
sr (Server Received):标识服务端接收到请求并开始处理的时间点。
ss (Server Sent):标识服务端处理完请求并准备返回响应的时间点。
cr (Client Received):标识客户端接收到服务端响应的时间点。

2. 核心功能

3. 数据模型

Trace
├── Span 1
│   ├── Annotation: cs
│   ├── Annotation: sr
│   ├── Annotation: ss
│   └── Annotation: cr
└── Span 2
    ├── Annotation: cs
    └── Annotation: cr

源码分析

1. Tracer 核心类

public interface Tracer {
    Span nextSpan();
    Span nextSpan(Span parent);
    Span newTrace();
    void continueSpan(Span span);
    void close(Span span);
    Span currentSpan();
    // ... other methods ...
}

2. TraceContext 传播

public interface Propagator {
    <C> void inject(TraceContext context, C carrier, Setter<C> setter);
    <C> Span.Builder extract(C carrier, Getter<C> getter);
}

3. Span 创建

public interface Span {
    boolean isNoop();
    Span start();
    Span name(String name);
    Span tag(String key, String value);
    Span event(String value);
    Span error(Throwable throwable);
    void end();
    // ... other methods ...
}

4. 自动配置

@Configuration
@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
public class TraceAutoConfiguration {
    @Bean
    public Tracer tracer() {
        return new DefaultTracer();
    }
    
    @Bean
    public CurrentTraceContext currentTraceContext() {
        return ThreadLocalCurrentTraceContext.create();
    }
    
    // ... other beans ...
}

重要知识点

1. Sleuth 如何实现分布式追踪?

2. Trace 和 Space 的区别是什么?

3. 如何自定义 Span 信息?

// ... existing code ...
@Autowired
private Tracer tracer;

public void customSpan() {
    Span span = tracer.nextSpan().name("custom-operation").start();
    try (Tracer.SpanInScope ws = tracer.withSpan(span.start())) {
        // business logic
        span.tag("custom-tag", "value");
    } finally {
        span.end();
    }
}
// ... existing code ...

4. Sleuth 如何与 Zipkin 集成?

5. 如何实现跨服务追踪

6. Sleuth 的性能影响如何?

7. 如何配置采样率?

spring:
  sleuth:
    sampler:
      probability: 1.0 # 1.0表示100%采样

8. Sleuth 支持哪些通信协议?

9. 如何查看 Sleuth 的追踪日志?

10. Sleuth 如何处理异步操作?

// ... existing code ...
Mono.just("value")
    .doOnNext(value -> {
        Span span = tracer.nextSpan().name("async-operation").start();
        try (Tracer.SpanInScope ws = tracer.withSpan(span.start())) {
            // async logic
        } finally {
            span.end();
        }
    })
    .contextWrite(Context.of(Span.class, span));
// ... existing code ...