spring-cloud-starter-sleuth 使用brave 的 Tracing 来实现日志trace输出
使用方法
pom增加引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-dubbo-rpc</artifactId>
<version>5.6.0</version>
</dependency>
dubbo增加配置
dubbo.provider.filter: tracing
dubbo.consumer.filter: tracing
此处的tracing 对应的是 brave-instrumentation-dubbo-rpc 包内的 文件com.alibaba.dubbo.rpc.Filter 配置的 brave.dubbo.rpc.TracingFilter 处理类。
源码解析
重要的几个配置类
- AsyncDefaultAutoConfiguration
ExecutorBeanPostProcessor postProcessAfterInitialization 将定义的AsyncTaskExecutor封装wrapAsyncTaskExecutor -> createAsyncTaskExecutorProxy 构建LazyTraceAsyncTaskExecutor对象 。 最主要的还是最终被TraceRunnable封装! - SleuthAnnotationAutoConfiguration SleuthAdvisorConfig SleuthInterceptor 支持 @NewSpan @ContinueSpan
SleuthInterceptor.invoke ->NonReactorSleuthMethodInvocationProcessor.proceedUnderSynchronousSpan -> Trace.withSpanInScope
- TraceAutoConfiguration sleuthCurrentTraceContext方法 给 brave.propagation.CurrentTraceContext 绑定 Slf4jScopeDecorator
- SleuthLogAutoConfiguration 提供Slf4jScopeDecorator
TracingFilter
invoke -> Trace.withSpanInScope -> ThreadLocalCurrentTraceContext.newScope -> CurrentTraceContext.decorateScope -> Slf4jScopeDecorator.decorateScope
在invoke时,先判定当前服务的是provider还是consumer。
provider 则从RpcInvocation中的Attachments获取传入的TraceContext,并joinSpan到当前trace。
consumer 则从当前的Tracer中生成nextSpan,将nextSpan扔入TraceContext 中。