1.一種分布式服務(wù)跟蹤實(shí)現(xiàn)方法,包括日志采樣模塊、日志收集模塊、日志存儲(chǔ)模塊、統(tǒng)計(jì)報(bào)表模塊、前端模塊,所述日志采樣模塊利用攔截器攔截技術(shù)或面向切面編程技術(shù)攔截分布式調(diào)用鏈中的進(jìn)程行為,所述日志收集模塊定期實(shí)時(shí)讀取文件,并將有用的日志信息發(fā)送到日志存儲(chǔ)模塊,所述統(tǒng)計(jì)報(bào)表模塊定期進(jìn)行日志統(tǒng)計(jì),前端模塊提供用戶交互界面;整體架構(gòu)稱為Cicada;
對于請求發(fā)起進(jìn)程的設(shè)為客戶端,服務(wù)提供進(jìn)程的設(shè)為服務(wù)端,同一次請求的所有相關(guān)調(diào)用的情況稱作分布式調(diào)用鏈,記為Trace,每個(gè)分布式調(diào)用鏈擁有一個(gè)全局唯一的ID來標(biāo)識(shí),其中所述服務(wù)端調(diào)用其他進(jìn)程時(shí)成為該調(diào)用中的的客戶端,該跨進(jìn)程的一次調(diào)用記為Span;
在客戶端的前端請求到達(dá)服務(wù)器時(shí),應(yīng)用容器在執(zhí)行實(shí)際業(yè)務(wù)處理之前,會(huì)先執(zhí)行Cicada的埋點(diǎn)邏輯,埋點(diǎn)邏輯為這個(gè)前端請求分配一個(gè)全局唯一的調(diào)用鏈ID,稱為TraceId,埋點(diǎn)邏輯把TraceId放在一個(gè)調(diào)用上下文對象Span里面,而調(diào)用上下文對象會(huì)存儲(chǔ)在ThreadLocal里面,ThreadLocal能夠基于線程進(jìn)行數(shù)據(jù)的存儲(chǔ)和讀取,能在同一次請求的多個(gè)本地處理方法間傳遞信息。
2.根據(jù)權(quán)利要求1所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:所述Span包括客戶端Span和服務(wù)端Span,一個(gè)遠(yuǎn)程調(diào)用對應(yīng)兩個(gè)span,多條Span形成樹形結(jié)構(gòu),組合成一次Trace追蹤記錄,在Span中的標(biāo)注點(diǎn)用于記錄整個(gè)Span時(shí)間段內(nèi)發(fā)生的事件,用特殊標(biāo)注點(diǎn)記錄用戶自定義事件。
3.根據(jù)權(quán)利要求2所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:所述標(biāo)注點(diǎn)的屬性包括timestamp、type、ip、port,分別表示記錄行為發(fā)生時(shí)間、記錄行為類型、IP地址、端口;所述特殊標(biāo)注點(diǎn)的屬性包括timestamp、type、ip、port、key、value,分別表示記錄行為發(fā)生時(shí)間、記錄行為類型、IP地址、端口、用戶定義屬性名、用戶定義屬性值;所述Span的屬性包括traceId、Id、parentId、appName、serviceName、methodName、subSpanNum、annotations、binaryAnnotations,分別表示分布式調(diào)用唯一id、Span唯一id、Span父id、應(yīng)用名、類名、方法名、子span數(shù)量、調(diào)用信息、補(bǔ)充信息或異常信息。
4.根據(jù)權(quán)利要求1所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:在調(diào)用上下文時(shí)設(shè)置有第二種ID,稱作spanId,用于區(qū)分同一個(gè)調(diào)用鏈下的多個(gè)網(wǎng)絡(luò)調(diào)用的發(fā)生順序和嵌套層次關(guān)系;
對于前端收到請求,生成的spanId固定都是1,當(dāng)這個(gè)前端執(zhí)行業(yè)務(wù)處理需要發(fā)起RPC調(diào)用時(shí),RPC調(diào)用客戶端Dubbo會(huì)首先從當(dāng)前線程ThreadLocal上面獲取之前設(shè)置的調(diào)用上下文,然后,把spanId遞增一個(gè)序號(hào),并使用多級序號(hào)來表示spanId;
之后,調(diào)用上下文會(huì)作為附件隨這次請求一起發(fā)送到遠(yuǎn)程的Dubbo服務(wù)器,遠(yuǎn)程的Dubbo服務(wù)端收到這個(gè)請求之后,會(huì)從請求附件里取出調(diào)用上下文,并放到當(dāng)前線程ThreadLocal上面;
如果服務(wù)A在處理時(shí),需要調(diào)用另一個(gè)服務(wù),則會(huì)重復(fù)以上步驟,并將spanId遞增一個(gè)序號(hào)再傳過去,服務(wù)A的邏輯全部處理完畢之后,Dubbo在返回響應(yīng)對象之前,會(huì)把這次調(diào)用情況以及traceId、spanId都打印到它的訪問日志之中,同時(shí),會(huì)從ThreadLocal清理掉調(diào)用上下文。
5.根據(jù)權(quán)利要求1所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:當(dāng)服務(wù)發(fā)生時(shí),所述日志采樣模塊攔截分布式系統(tǒng)各組成部分的處理行為,記錄行為日志并將日志通過Http Post異步發(fā)送到日志收集模塊,將收集好的日志發(fā)送到遠(yuǎn)程服務(wù)器時(shí)采用批處理和異步發(fā)送的方法,并增加了連接超時(shí)設(shè)置和傳輸超時(shí)設(shè)置,將超過一定時(shí)長的日志直接扔掉,同時(shí)對單位時(shí)間內(nèi)抓取的日志量過多的情況進(jìn)行了限流處理。
6.根據(jù)權(quán)利要求1所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:所述日志收集模塊分日志接收子系統(tǒng)和日志匯總子系統(tǒng),所述日志接收子系統(tǒng)為nginx集群,所述nginx接收到客戶端POST過來的消息數(shù)據(jù),直接記錄本地文件;所述日志匯總子系統(tǒng)從nginx日志中讀取最新數(shù)據(jù),記錄讀取進(jìn)度并進(jìn)行數(shù)據(jù)清洗,將異步數(shù)據(jù)存儲(chǔ)到Elastic Search。
7.根據(jù)權(quán)利要求1所述的分布式服務(wù)跟蹤實(shí)現(xiàn)方法,其特征在于:所述統(tǒng)計(jì)報(bào)表模塊進(jìn)行定期日志統(tǒng)計(jì),統(tǒng)計(jì)項(xiàng)包括以下:
avgDuration:平均響應(yīng)時(shí)間;
minDuration:最快響應(yīng)時(shí)間;
maxDuration:最慢響應(yīng)時(shí)間;
line95Duration:95%line最大響應(yīng)時(shí)間;
line999Duration:99.9%line最大響應(yīng)時(shí)間;
failureRate:請求失敗率;
提供統(tǒng)計(jì)結(jié)果以及Trace數(shù)據(jù)訪問的RESTful接口。