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

相关文章
相关标签/搜索