实现.Net程序中OpenTracing采样和上报配置的自动更新
前言
OpenTracing是一個(gè)鏈路跟蹤的開(kāi)放協(xié)議,已經(jīng)有開(kāi)源的.net實(shí)現(xiàn):opentracing-csharp,同時(shí)支持.net framework和.net core,Github地址:https://github.com/opentracing/opentracing-csharp。
這個(gè)庫(kù)支持多種鏈路跟蹤模式,不過(guò)僅提供了最基礎(chǔ)的功能,想用在實(shí)際項(xiàng)目中還需要做很多增強(qiáng),還好也有人做了開(kāi)源項(xiàng)目:opentracing-contrib,Github地址:https://github.com/opentracing-contrib/csharp-netcore。
opentracing-contrib中集成了一個(gè)名為Jaeger的類庫(kù),這個(gè)庫(kù)實(shí)現(xiàn)了鏈路跟蹤數(shù)據(jù)的采樣和上報(bào),支持將數(shù)據(jù)上傳到Jaeger進(jìn)行分析統(tǒng)計(jì)。
為了同時(shí)保障性能和跟蹤關(guān)鍵數(shù)據(jù),能夠遠(yuǎn)程調(diào)整采樣率是很重要的,Jaeger本身也提供了遠(yuǎn)程配置采樣率的支持。
不過(guò)我這里用的阿里云鏈路跟蹤不支持,配置的設(shè)計(jì)也和想要的不同,所以自己做了一個(gè)采樣和上報(bào)配置的動(dòng)態(tài)更新,也才有了這篇文章。
思路
使用Jaeger初始化Tracer大概是這樣的:
var tracer = new Tracer.Builder(serviceName).WithSampler(sampler).WithReporter(reporter).Build(); GlobalTracer.Register(tracer);首先是提供當(dāng)前服務(wù)的名字,然后需要提供一個(gè)采樣器,再提供一個(gè)上報(bào)器,Build下生成ITracer的一個(gè)實(shí)例,最后注冊(cè)到全局。
可以分析得出,采樣和上報(bào)配置的更新就是更新采樣器和上報(bào)器。
不過(guò)Tracer并沒(méi)有提供UpdateSampler和UdapteReporter的方法,被卡住了,怎么辦呢?
前文提到Jaeger是支持采樣率的動(dòng)態(tài)調(diào)整的,看看它怎么做的:
這里只留下關(guān)鍵代碼,可以看到核心就是:通過(guò)一個(gè)Timer定時(shí)獲取采樣策略,然后替換原來(lái)的Sampler。
這是一個(gè)很好理解的辦法,下邊就按照這個(gè)思路來(lái)搞。
方案
分別提供一個(gè)可更新的Sampler和可更新的Reporter,Build Tracer時(shí)使用這兩個(gè)可更新的類。這里延續(xù)開(kāi)源項(xiàng)目中Samper和Reporter的創(chuàng)建方式,給出這兩個(gè)類。
可更新的Sampler:
可更新的Reporter:
注意這里邊用到了讀寫鎖,因?yàn)橐龅讲煌V狗?wù)的更新,而且大部分情況下都是讀,使用lock就有點(diǎn)大柴小用了。
現(xiàn)在初始化Tracer大概是這樣的:
當(dāng)配置發(fā)生改變時(shí),調(diào)用sampler和reporter的更新方法:
這里就不寫如何監(jiān)聽(tīng)配置的改變了,使用Timer或者阻塞查詢等等都可以。
后記
opentracing-contrib這個(gè)項(xiàng)目只支持.net core,如果想用在.net framwork中還需要自己搞,這個(gè)方法會(huì)單獨(dú)寫一篇文章,這里就不做介紹了。
總結(jié)
以上是生活随笔為你收集整理的实现.Net程序中OpenTracing采样和上报配置的自动更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 15分钟从零开始搭建支持10w+用户的生
- 下一篇: ASP.NET Core分布式项目实战(