dubbo集成zipkin获取Traceid的实现

dubbo集成zipkin获取Traceid

dubbo集成zipkin有java的客户端brave,实现原理的通过定义Filter来实现的,然后通过RpcContext.getContext().getAttachments()来获取,通过RpcContext.getContext()来传递。

按照dubbo官网的博客配置了这个MDCScopeDecorator应该就可以做在日志里面使用[%X{traceId}/%X{spanId}来打印了,但是我的一致打印不出来,不知道为啥,然后就想了一个折中的方法。

 <bean id="tracing" class="brave.spring.beans.TracingFactoryBean">        <property name="localServiceName" value="hello-service"/>        <property name="spanReporter">            <bean class="zipkin2.reporter.beans.AsyncReporterFactoryBean">                <property name="sender" ref="sender"/>                <!-- wait up to half a second for any in-flight spans on close -->                <property name="closeTimeout" value="500"/>            </bean>        </property>        <property name="currentTraceContext">            <bean class="brave.spring.beans.CurrentTraceContextFactoryBean">                <property name="scopeDecorators">                    <bean class="brave.context.slf4j.MDCScopeDecorator" factory-method="create"/>                </property>            </bean>        </property>    </bean>

一、dubbo中使用zipkin获取traceid折中方法

zipkin集成dubbo就是扩展了dubbo的filter过滤器,在执行了TracingFilter之后呢,rpc的上下文RpcContext.getContext().getAttachments()里面就有这些traceId和spanId了,可以使用类似ThreadLocal这样的保存在当前线程的上下文里面,然后在使用的地方获取一下。

具体实现:

再自定义一个dubbo的过滤器,挂在zipkin的过滤器的后面,类似这样,挂两个过滤器,自定义的过滤器放在zipkin的过滤器的后面,在自定义的过滤器使用RpcContext.getContext().getAttachments()获取前面那个zipkin过滤器里面的自定义参数。

方法二

如果使用的springboot项目直接使用spring-cloud-starter-zipkin来打印更方便,并且可以直接在代码里获取traceId和spanId

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

不然你大概会一直好奇和不甘吧——家门前的那条小路,

dubbo集成zipkin获取Traceid的实现

相关文章:

你感兴趣的文章:

标签云: