log trace (2) - springのsleuth 支持dubbo

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 处理类。

源码解析

重要的几个配置类

  1. AsyncDefaultAutoConfiguration ExecutorBeanPostProcessor postProcessAfterInitialization 将定义的AsyncTaskExecutor封装wrapAsyncTaskExecutor -> createAsyncTaskExecutorProxy 构建LazyTraceAsyncTaskExecutor对象 。 最主要的还是最终被TraceRunnable封装!
  2. SleuthAnnotationAutoConfiguration SleuthAdvisorConfig SleuthInterceptor 支持 @NewSpan @ContinueSpan SleuthInterceptor.invoke ->NonReactorSleuthMethodInvocationProcessor.proceedUnderSynchronousSpan -> Trace.withSpanInScope
  3. TraceAutoConfiguration sleuthCurrentTraceContext方法 给 brave.propagation.CurrentTraceContext 绑定 Slf4jScopeDecorator
  4. 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 中。

spring-cloud-starter-sleuth 使用brave 的 Tracing 来实现日志trace输出 使用方法 pom增加引用 org.springframework.cloud spring-cloud-starter-sleuth 2.1.1.RELEASE io.zipkin.brave brave-instrumentation-dubbo-rpc 5.6.0 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 中。
经验分享 程序员 微信小程序 职场和发展