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

spring-cloud-starter-sleuth 使用brave 的 Tracing 來實現日誌trace輸出
javascript

使用方法

maven:java

<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配置spring

dubbo.provider.filter: tracing
dubbo.consumer.filter: tracing

此處的tracing 對應的是 brave-instrumentation-dubbo-rpc 包內的 文件 com.alibaba.dubbo.rpc.Filter 配置的 brave.dubbo.rpc.TracingFilter 處理類。async

核心類的執行流程

  1. org.springframework.cloud.sleuth.instrument.async.AsyncDefaultAutoConfiguration  
    1. TraceAsyncAspect 針對@Async註解,JoinPoint.proceed 執行前設置Span。
    2. ExecutorBeanPostProcessor.postProcessAfterInitialization  
      將定義的AsyncTaskExecutor封裝wrapAsyncTaskExecutor:  createAsyncTaskExecutorProxy 構建LazyTraceAsyncTaskExecutor ,其核心是將runnable封裝爲TraceRunnable,在runnable.run 前開啓新的Span.
  2. org.springframework.cloud.sleuth.annotation.SleuthAnnotationAutoConfiguration   
    1. SleuthAdvisorConfig -> 初始化SleuthInterceptor  來支持 @NewSpan 與 @ContinueSpan

      SleuthInterceptor.invoke ->NonReactorSleuthMethodInvocationProcessor.proceedUnderSynchronousSpan -> Trace.withSpanInScopemaven

  3. org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration  
    sleuthCurrentTraceContext方法:   
    給初始化 brave.propagation.ThreadLocalCurrentTraceContext(CurrentTraceContext的實現) 綁定 org.springframework.cloud.sleuth.log.SleuthLogAutoConfiguration  初始化的org.springframework.cloud.sleuth.log.Slf4jScopeDecorator (CurrentTraceContext內部接口ScopeDecorator的實現)

TracingFilter

在invoke時,經過com.alibaba.dubbo.rpc.RpcContext斷定當前服務的角色:
consumer 從當前的Tracer中生成nextSpan,將span.context()扔入中com.alibaba.dubbo.rpc.RpcInvocation的attachments中,傳遞到provider去。
provider 從RpcInvocation中的Attachments獲取傳入的TraceContext,並joinSpan到當前trace。
(固然,若是爲空,會生成新的TraceContext)
ide

在真正的Invoker.invoke前
brave.Tracer.withSpanInScope -> brave.propagation.ThreadLocalCurrentTraceContext.newScope -> brave.propagation.CurrentTraceContext.decorateScope
-> org.springframework.cloud.sleuth.log.Slf4jScopeDecorator.decorateScope  設置MDC值
post

相關文章
相關標籤/搜索