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

在這裡插入圖片描述

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: