本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,具體涉及一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法及其系統(tǒng)。
背景技術(shù):
隨著公司業(yè)務(wù)的發(fā)展壯大,各個業(yè)務(wù)系統(tǒng)衍生的接口越來越多,各接口之間相互調(diào)用關(guān)系越來越復(fù)雜,例如:一個A請求,需要調(diào)用B接口和C接口,其中B接口中又調(diào)了D接口,C接口調(diào)用了E接口。系統(tǒng)分析人員想知道系統(tǒng)的瓶頸、性能以及各接口使用率,已經(jīng)無法全盤掌控,一旦某些接口出現(xiàn)瓶頸,將直接影響整個系統(tǒng)的性能。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法及其系統(tǒng)。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
本發(fā)明實(shí)施例提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法,該方法為:任意一業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;當(dāng)任意一業(yè)務(wù)接口調(diào)用另一個業(yè)務(wù)接口時,將攜帶所述跟蹤ID的通訊報文發(fā)送給另一業(yè)務(wù)接口,所述另一接口解出通訊報文,檢查是否攜帶有跟蹤ID,如果攜帶有跟蹤ID,生成的跟蹤數(shù)據(jù)中增加節(jié)點(diǎn)parent_id,形成父子關(guān)系,將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;周期性地將每個業(yè)務(wù)接口對應(yīng)的緩存中的跟蹤數(shù)據(jù)根據(jù)先進(jìn)先出方式取出,根據(jù)所述跟蹤數(shù)據(jù)中的節(jié)點(diǎn)和跟蹤ID確定每一個調(diào)用鏈的層級依賴關(guān)系;所述跟蹤數(shù)據(jù)還包括調(diào)用發(fā)起時間、發(fā)起IP、發(fā)起服務(wù)的服務(wù)名稱、Span名稱、調(diào)用結(jié)束時間;所述通訊報文的通訊方式為http或者socket。
上述方案中,該方法還包括:當(dāng)該業(yè)務(wù)接口調(diào)用另一個業(yè)務(wù)接口時,將攜帶所述跟蹤ID的通訊報文發(fā)送給另一業(yè)務(wù)接口,所述另一接口解出通訊報文,檢查是否攜帶有跟蹤ID,如果沒有攜帶跟蹤ID,則所述另一個業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中。
本發(fā)明實(shí)施例還提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)系統(tǒng),該系統(tǒng)包括:跟蹤數(shù)據(jù)生成單元、調(diào)用單元、解析單元、讀取顯示單元;
所述跟蹤數(shù)據(jù)生成單元,用于針對任意一業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;還用于如果所述通訊報文攜帶有跟蹤ID,生成的跟蹤數(shù)據(jù)中增加節(jié)點(diǎn)parent_id,形成父子關(guān)系,將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;所述通訊報文的通訊方式為http或者socket;
所述調(diào)用單元,用于當(dāng)任意一業(yè)務(wù)接口調(diào)用另一個業(yè)務(wù)接口時,將攜帶所述跟蹤ID的通訊報文發(fā)送給另一業(yè)務(wù)接口;
所述解析單元,用于解析所述通訊報文,檢查是否攜帶有跟蹤ID;
所述讀取顯示單元,用于周期性地將每個業(yè)務(wù)接口對應(yīng)的緩存中的跟蹤數(shù)據(jù)根據(jù)先進(jìn)先出方式取出,根據(jù)所述跟蹤數(shù)據(jù)中的節(jié)點(diǎn)和跟蹤ID確定每一個調(diào)用鏈的層級依賴關(guān)系;所述跟蹤數(shù)據(jù)還包括調(diào)用發(fā)起時間、發(fā)起IP、發(fā)起服務(wù)的服務(wù)名稱、Span名稱、調(diào)用結(jié)束時間;
所述跟蹤數(shù)據(jù)生成單元,如果所述通訊報文沒有攜帶跟蹤ID,則不參與訪問鏈路跟蹤關(guān)系。
上述方案中,所述跟蹤數(shù)據(jù)生成單元,如果所述通訊報文沒有攜帶父級跟蹤ID,則生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果:
本發(fā)明數(shù)據(jù)讀寫快,同時利用報文格式自定義的方便,使調(diào)用鏈路追蹤變得簡單易用,能夠?qū)崿F(xiàn)上下級調(diào)用關(guān)系、請求次數(shù)、執(zhí)行時間,通過匯總統(tǒng)計能夠清晰地實(shí)現(xiàn)調(diào)用關(guān)系拓?fù)鋱D。
附圖說明
圖1為本發(fā)明實(shí)施例提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法的流程圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明實(shí)施例提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法,如圖1所示,該方法通過以下步驟實(shí)現(xiàn):
步驟101:任意一業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;
具體地,所述跟蹤數(shù)據(jù)還包括調(diào)用發(fā)起時間、發(fā)起IP、發(fā)起服務(wù)的服務(wù)名稱、Span名稱、調(diào)用結(jié)束時間。
例如,業(yè)務(wù)接口A生成跟蹤數(shù)據(jù)(包含跟蹤ID),將數(shù)據(jù)寫入系統(tǒng)緩存中,同時把跟蹤ID放到全局變量中。
步驟102:當(dāng)任意一業(yè)務(wù)接口調(diào)用另一個業(yè)務(wù)接口時,將攜帶所述跟蹤ID的通訊報文發(fā)送給另一業(yè)務(wù)接口,所述另一接口解出通訊報文,檢查是否攜帶有跟蹤ID,如果攜帶有跟蹤ID,生成的跟蹤數(shù)據(jù)中增加節(jié)點(diǎn)parent_id,形成父子關(guān)系,將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;
如果所述通訊報文沒有攜帶父級跟蹤ID,則所述另一業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中。
具體地,所述通訊報文的通訊方式為http或者socket。
例如,業(yè)務(wù)接口A調(diào)用接口B時,把跟蹤ID帶到通訊報文中,業(yè)務(wù)接口B收到請求后,解出通訊報文,檢查是否帶有跟蹤ID,如果帶有跟蹤ID,生成的跟蹤數(shù)據(jù)中增加節(jié)點(diǎn)parent_id,形成父子關(guān)系,將數(shù)據(jù)寫入當(dāng)前操作系統(tǒng)緩存中,同時把跟蹤ID放到全局變量中;業(yè)務(wù)接口C處理方式與業(yè)務(wù)接口B相同。
步驟103:周期性地將每個業(yè)務(wù)接口對應(yīng)的緩存中的跟蹤數(shù)據(jù)根據(jù)先進(jìn)先出方式取出,根據(jù)所述跟蹤數(shù)據(jù)中的節(jié)點(diǎn)和跟蹤ID確定每一個調(diào)用鏈的層級依賴關(guān)系并且進(jìn)行顯示。
具體地,將每個系統(tǒng)中的緩存數(shù)據(jù)按先進(jìn)先出的方式取出來,統(tǒng)一寫入kafka分布式消息系統(tǒng)中,用zipkin將kafka分布式消息系統(tǒng)中的數(shù)據(jù)取出來,寫入到Elasticsearch中分布式存儲,用zipkin-ui程序把Elasticsearch中的數(shù)據(jù)讀取出來,并做調(diào)用鏈上下級依賴關(guān)系顯示。
實(shí)施例:
本發(fā)明實(shí)施例提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)方法,該方法通過以下步驟實(shí)現(xiàn):
1.接口調(diào)用方發(fā)起調(diào)用時,生成TraceID和Span跟蹤數(shù)據(jù),所述Span跟蹤數(shù)據(jù)包括:調(diào)用發(fā)起時間、發(fā)起IP、發(fā)起服務(wù)的服務(wù)名稱、Span名稱、調(diào)用結(jié)束時間。
2.把Span跟蹤數(shù)據(jù)寫入到系統(tǒng)緩存中,由程序直接操作系統(tǒng)的System V IPC。
3.調(diào)用接口時,把TraceID與其它數(shù)據(jù)一起組裝到通訊報文中傳輸,通訊方式支持http,socket,報文內(nèi)容格式可自行定義,如:Json\Protobuf\Thrift。
4.接口接收方收到TraceID后,再生成新的Span,同時在Span上增加parentId節(jié)點(diǎn)并賦上TraceID的值,與上一個Span建立關(guān)聯(lián)關(guān)系。
5.上一接口再調(diào)另一接口,處理方式將與前面步驟相同。
6.每臺服務(wù)器不間斷的執(zhí)行緩存數(shù)據(jù)(System V)的讀取操作,并統(tǒng)一寫入到kafka分布式消息服務(wù)中。
7.zipkin程序?qū)崟r的從kafka分布式消息服務(wù)把數(shù)據(jù)讀取出來,進(jìn)行整理,整理完數(shù)據(jù)寫入到Elasticsearch存儲,采用Elasticsearch存儲的優(yōu)勢是它具有搜索引擎機(jī)制,數(shù)據(jù)讀取檢索快,支持分布式存儲。
8.zipkin-ui程序?qū)崟r的檢索Elasticsearch的數(shù)據(jù),并在界面上展示出來每一個調(diào)用鏈的層級依賴關(guān)系,執(zhí)行時長。
本發(fā)明實(shí)施例還提供一種非入侵式的訪問鏈路跟蹤實(shí)現(xiàn)系統(tǒng),該系統(tǒng)包括:跟蹤數(shù)據(jù)生成單元、調(diào)用單元、解析單元、讀取顯示單元;
所述跟蹤數(shù)據(jù)生成單元,用于針對任意一業(yè)務(wù)接口生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;還用于如果所述通訊報文攜帶有跟蹤ID,生成的跟蹤數(shù)據(jù)中增加節(jié)點(diǎn)parent_id,形成父子關(guān)系,將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中;
所述調(diào)用單元,用于當(dāng)任意一業(yè)務(wù)接口調(diào)用另一個業(yè)務(wù)接口時,將攜帶所述跟蹤ID的通訊報文發(fā)送給另一業(yè)務(wù)接口;
所述解析單元,用于解析所述通訊報文,檢查是否攜帶有跟蹤ID;
所述讀取顯示單元,用于周期性地將每個業(yè)務(wù)接口對應(yīng)的緩存中的跟蹤數(shù)據(jù)根據(jù)先進(jìn)先出方式取出,根據(jù)所述跟蹤數(shù)據(jù)中的節(jié)點(diǎn)和跟蹤ID確定每一個調(diào)用鏈的層級依賴關(guān)系并且進(jìn)行顯示。
所述跟蹤數(shù)據(jù)還包括調(diào)用發(fā)起時間、發(fā)起IP、發(fā)起服務(wù)的服務(wù)名稱、Span名稱、調(diào)用結(jié)束時間。
所述通訊報文的通訊方式為http或者socket。
所述跟蹤數(shù)據(jù)生成單元,如果所述通訊報文沒有攜帶跟蹤ID,則不參與訪問鏈路跟蹤關(guān)系。
所述跟蹤數(shù)據(jù)生成單元,如果所述通訊報文沒有攜帶父級跟蹤ID,則生成包含跟蹤ID的跟蹤數(shù)據(jù),將所述跟蹤數(shù)據(jù)寫入緩存中同時把所述跟蹤ID存儲到全局變量中。
以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。