上周的工作內(nèi)容是開(kāi)發(fā)一個(gè)運(yùn)維需求——對(duì)接公有云的分布式追蹤系統(tǒng)嗜愈。服務(wù)上線(xiàn)轉(zhuǎn)商用之前,運(yùn)維能力需要滿(mǎn)足商用要求莽龟,而使用分布式追蹤系統(tǒng)把服務(wù)監(jiān)控起來(lái)蠕嫁,是商用運(yùn)維要求中的必須項(xiàng),因此有了這個(gè)需求毯盈。一周下來(lái)剃毒,代碼已經(jīng)開(kāi)發(fā)得差不多了,還差驗(yàn)證和上線(xiàn)工作搂赋,在這之前赘阀,先梳理回顧一下。
對(duì)接到分布式追蹤系統(tǒng)之所以如此重要脑奠,是因?yàn)槭褂梅植际阶粉櫹到y(tǒng)監(jiān)控服務(wù)有以下好處
- 通過(guò)在各個(gè)微服務(wù)埋點(diǎn)打印的調(diào)用鏈日志基公,能夠把一個(gè)請(qǐng)求處理的完整鏈路端到端地展示出來(lái)
- 能夠快速定位到異常環(huán)節(jié),如中間在某個(gè)環(huán)節(jié)響應(yīng)慢或是處理失敗
- 能夠根據(jù)調(diào)用鏈日志生成服務(wù)依賴(lài)關(guān)系拓?fù)鋱D捺信,直觀(guān)地觀(guān)察到故障點(diǎn)或哪個(gè)微服務(wù)是系統(tǒng)的瓶頸點(diǎn)所在
- 甚至能夠根據(jù)采集的日志進(jìn)行告警配置
我們的服務(wù)主要使用Python和Go語(yǔ)言進(jìn)行開(kāi)發(fā)酌媒,分別獲取對(duì)應(yīng)的SDK進(jìn)行開(kāi)發(fā)即可,整個(gè)開(kāi)發(fā)對(duì)接上線(xiàn)的流程大致是這樣的:
- 聯(lián)系接口人溝通埋點(diǎn)方案
- 使用統(tǒng)一的SDK進(jìn)行埋點(diǎn)代碼開(kāi)發(fā)和測(cè)試
- 整理服務(wù)—微服務(wù)—節(jié)點(diǎn)—日志路徑信息迄靠,服務(wù)—微服務(wù)—業(yè)務(wù)—URL信息秒咨。公司的分布式追蹤系統(tǒng)的日志采集借用了已有的日志服務(wù)的能力,日志服務(wù)接收到調(diào)用鏈日志時(shí)掌挚,會(huì)直接轉(zhuǎn)發(fā)給分布式追蹤系統(tǒng)雨席,因此信息需要分別反饋給日志采集系統(tǒng)和分布式追蹤系統(tǒng)在服務(wù)節(jié)點(diǎn)上安裝日志采集Agent
- 升級(jí)微服務(wù),打開(kāi)打印調(diào)用鏈日志的開(kāi)關(guān)(開(kāi)始打印調(diào)用鏈日志吠式,與此同時(shí)陡厘,節(jié)點(diǎn)上的日志采集Agent把采集的調(diào)用鏈日志信息上報(bào)到日志系統(tǒng))
- 類(lèi)生產(chǎn)環(huán)境驗(yàn)證對(duì)接效果:本地正常打印調(diào)用鏈日志,日志采集Agent正常上報(bào)調(diào)用鏈日志特占;分布式追蹤系統(tǒng)能夠檢索到服務(wù)的Trace信息糙置,能夠正常顯示微服務(wù)依賴(lài)關(guān)系拓?fù)鋱D
- 上線(xiàn)生產(chǎn)環(huán)境各個(gè)局點(diǎn)
埋點(diǎn)開(kāi)發(fā)
哪些地方需要打印調(diào)用鏈日志呢?
和性能調(diào)優(yōu)類(lèi)似是目,打點(diǎn)的地方可以包括:HTTP請(qǐng)求服務(wù)/客戶(hù)端谤饭、RPC請(qǐng)求服務(wù)/客戶(hù)端、數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)懊纳、中間件調(diào)用揉抵、本地方法調(diào)用。
What points should be tracked by default?
I think that for all projects we should include by default 5 kinds of points:
- All HTTP calls - helps to get information about: what HTTP requests were done, duration of calls (latency of service), information about projects involved in request.
- All RPC calls - helps to understand duration of parts of request related to different services in one project. This information is essential to understand which service produce the bottleneck.
- All DB API calls - in some cases slow DB query can produce bottleneck. So it’s quite useful to track how much time request spend in DB layer.
- All driver calls - in case of nova, cinder and others we have vendor drivers. Duration
- ALL SQL requests (turned off by default, because it produce a lot of traffic)
埋點(diǎn)方式
- 顯示調(diào)用start和stop方法
- 函數(shù)/類(lèi)裝飾器
- with代碼塊
- 某些框架或依賴(lài)庫(kù)有官方的集成支持嗤疯,JAVA和Go的支持非常全冤今,而Python的則缺少一些中間件
聽(tīng)說(shuō)Go還有一種直接替換Go-SDK就能夠完成埋點(diǎn)功能注入的方式...
兩篇重要的論文
- 《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》讓分布式追蹤系統(tǒng)這個(gè)領(lǐng)域流行起來(lái)
- 《Uncertainty in Aggregate Estimates from Sampled Distributed Traces》對(duì)采樣進(jìn)行了詳細(xì)分析
標(biāo)準(zhǔn)
Uber發(fā)起的OpenTracing現(xiàn)在已經(jīng)成為云原生計(jì)算基金會(huì)的一個(gè)成員項(xiàng)目,OpenTracing Semantic Specification定義了數(shù)據(jù)采集時(shí)的數(shù)據(jù)模型和一些接口茂缚,應(yīng)該算是分布式追蹤系統(tǒng)的接口標(biāo)準(zhǔn)了戏罢,比較出名的Jaeger和Zipkin都實(shí)現(xiàn)了OpenTracing API。
業(yè)界實(shí)踐
- 阿里淘寶:EagleEye
- Twitter:Zipkin
- Uber:Jaeger
- AWS:XRays
- Google:Dapper阱佛,StakeDriver Trace帖汞,OpenCensus
- Golang:AppDash
- 螞蟻:云圖
- 阿里云:諦聽(tīng),盤(pán)古
- 神馬:STrace
- OpenStack:osprofiler(原本是用于采集方法調(diào)用耗時(shí)數(shù)據(jù)凑术,上報(bào)到ceilometer監(jiān)控計(jì)量計(jì)費(fèi)系統(tǒng)翩蘸,用于性能調(diào)優(yōu),經(jīng)過(guò)定制修改日志打印格式兼容OpenTracing的話(huà)打印出來(lái)的就是調(diào)用鏈日志了)
參考鏈接
https://blog.csdn.net/yunqiinsight/article/details/80134045
https://yq.aliyun.com/articles/514488
https://www.cnblogs.com/sting2me/p/4393018.html
https://blog.appoptics.com/intro-to-opentracing-and-opencensus-for-distributed-tracing/
https://logz.io/blog/zipkin-vs-jaeger/
https://opentracing.io/