精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

可視化全鏈路日志追蹤通用設(shè)計(jì):?jiǎn)栴}排查從小時(shí)級(jí)降至5分鐘

運(yùn)維 新聞
本文介紹了可視化全鏈路日志追蹤的新方案,它以業(yè)務(wù)鏈路為載體,通過(guò)有效組織業(yè)務(wù)每次執(zhí)行的日志,實(shí)現(xiàn)了執(zhí)行現(xiàn)場(chǎng)的可視化還原,支持問(wèn)題的高效定位。

可觀測(cè)性作為系統(tǒng)高可用的重要保障,已經(jīng)成為系統(tǒng)建設(shè)中不可或缺的一環(huán)。然而隨著業(yè)務(wù)邏輯的日益復(fù)雜,傳統(tǒng)的ELK方案在日志搜集、篩選和分析等方面愈加耗時(shí)耗力,而分布式會(huì)話跟蹤方案雖然基于追蹤能力完善了日志的串聯(lián),但更聚焦于調(diào)用鏈路,也難以直接應(yīng)用于高效的業(yè)務(wù)追蹤。

一、背景

1、業(yè)務(wù)系統(tǒng)日益復(fù)雜

隨著互聯(lián)網(wǎng)產(chǎn)品的快速發(fā)展,不斷變化的商業(yè)環(huán)境和用戶訴求帶來(lái)了紛繁復(fù)雜的業(yè)務(wù)需求。業(yè)務(wù)系統(tǒng)需要支撐的業(yè)務(wù)場(chǎng)景越來(lái)越廣、涵蓋的業(yè)務(wù)邏輯越來(lái)越多,系統(tǒng)的復(fù)雜度也跟著快速提升。與此同時(shí),由于微服務(wù)架構(gòu)的演進(jìn),業(yè)務(wù)邏輯的實(shí)現(xiàn)往往需要依賴多個(gè)服務(wù)間的共同協(xié)作??偠灾?,業(yè)務(wù)系統(tǒng)的日益復(fù)雜已經(jīng)成為一種常態(tài)。

?2、業(yè)務(wù)追蹤面臨挑戰(zhàn)

業(yè)務(wù)系統(tǒng)往往面臨著多樣的日??驮V和突發(fā)問(wèn)題,“業(yè)務(wù)追蹤”就成為了關(guān)鍵的應(yīng)對(duì)手段。業(yè)務(wù)追蹤可以看做一次業(yè)務(wù)執(zhí)行的現(xiàn)場(chǎng)還原過(guò)程,通過(guò)執(zhí)行中的各種記錄還原出原始現(xiàn)場(chǎng),可用于業(yè)務(wù)邏輯執(zhí)行情況的分析和問(wèn)題的定位,是整個(gè)系統(tǒng)建設(shè)中重要的一環(huán)。

目前在分布式場(chǎng)景下,業(yè)務(wù)追蹤的主流實(shí)現(xiàn)方式包括兩類,一類是基于日志的ELK方案,一類是基于單次請(qǐng)求調(diào)用的會(huì)話跟蹤方案。然而隨著業(yè)務(wù)邏輯的日益復(fù)雜,上述方案越來(lái)越不適用于當(dāng)下的業(yè)務(wù)系統(tǒng)。

1)傳統(tǒng)的ELK方案

日志作為業(yè)務(wù)系統(tǒng)的必備能力,職責(zé)就是記錄程序運(yùn)行期間發(fā)生的離散事件,并且在事后階段用于程序的行為分析,比如曾經(jīng)調(diào)用過(guò)什么方法、操作過(guò)哪些數(shù)據(jù)等等。在分布式系統(tǒng)中,ELK技術(shù)棧已經(jīng)成為日志收集和分析的通用解決方案。如下圖1所示,伴隨著業(yè)務(wù)邏輯的執(zhí)行,業(yè)務(wù)日志會(huì)被打印,統(tǒng)一收集并存儲(chǔ)至Elasticsearch(下稱ES)。

圖片

圖1 業(yè)務(wù)系統(tǒng)ELK案例

傳統(tǒng)的ELK方案需要開發(fā)者在編寫代碼時(shí)盡可能全地打印日志,再通過(guò)關(guān)鍵字段從ES中搜集篩選出與業(yè)務(wù)邏輯相關(guān)的日志數(shù)據(jù),進(jìn)而拼湊出業(yè)務(wù)執(zhí)行的現(xiàn)場(chǎng)信息。然而該方案存在如下的痛點(diǎn):

  • 日志搜集繁瑣:雖然ES提供了日志檢索的能力,但是日志數(shù)據(jù)往往是缺乏結(jié)構(gòu)性的文本段,很難快速完整地搜集到全部相關(guān)的日志。

  • 日志篩選困難:不同業(yè)務(wù)場(chǎng)景、業(yè)務(wù)邏輯之間存在重疊,重疊邏輯打印的業(yè)務(wù)日志可能相互干擾,難以從中篩選出正確的關(guān)聯(lián)日志。

  • 日志分析耗時(shí):搜集到的日志只是一條條離散的數(shù)據(jù),只能閱讀代碼,再結(jié)合邏輯,由人工對(duì)日志進(jìn)行串聯(lián)分析,盡可能地還原出現(xiàn)場(chǎng)。

綜上所述,隨著業(yè)務(wù)邏輯和系統(tǒng)復(fù)雜度的攀升,傳統(tǒng)的ELK方案在日志搜集、日志篩選和日志分析方面愈加的耗時(shí)耗力,很難快速實(shí)現(xiàn)對(duì)業(yè)務(wù)的追蹤。

2)分布式會(huì)話跟蹤方案

在分布式系統(tǒng),尤其是微服務(wù)系統(tǒng)中,業(yè)務(wù)場(chǎng)景的某次請(qǐng)求往往需要經(jīng)過(guò)多個(gè)服務(wù)、多個(gè)中間件、多臺(tái)機(jī)器的復(fù)雜鏈路處理才能完成。為了解決復(fù)雜鏈路排查困難的問(wèn)題,“分布式會(huì)話跟蹤方案”誕生。該方案的理論知識(shí)由Google在2010年《Dapper》論文中發(fā)表,隨后Twitter開發(fā)出了一個(gè)開源版本Zipkin。

市面上的同類型框架幾乎都是以Google Dapper論文為基礎(chǔ)進(jìn)行實(shí)現(xiàn),整體大同小異,都是通過(guò)一個(gè)分布式全局唯一的id(即traceId),將分布在各個(gè)服務(wù)節(jié)點(diǎn)上的同一次請(qǐng)求串聯(lián)起來(lái),還原調(diào)用關(guān)系、追蹤系統(tǒng)問(wèn)題、分析調(diào)用數(shù)據(jù)、統(tǒng)計(jì)系統(tǒng)指標(biāo)。分布式會(huì)話跟蹤,是一種會(huì)話級(jí)別的追蹤能力,如下圖2所示,單個(gè)分布式請(qǐng)求被還原成一條調(diào)用鏈路,從客戶端發(fā)起請(qǐng)求抵達(dá)系統(tǒng)的邊界開始,記錄請(qǐng)求流經(jīng)的每一個(gè)服務(wù),直到向客戶端返回響應(yīng)為止。

圖片

圖2 一次典型的請(qǐng)求全過(guò)程(摘自《Dapper》)

分布式會(huì)話跟蹤的主要作用是分析分布式系統(tǒng)的調(diào)用行為,并不能很好地應(yīng)用于業(yè)務(wù)邏輯的追蹤。下圖3是一個(gè)審核業(yè)務(wù)場(chǎng)景的追蹤案例,業(yè)務(wù)系統(tǒng)對(duì)外提供審核能力,待審對(duì)象的審核需要經(jīng)過(guò)“初審”和“復(fù)審”兩個(gè)環(huán)節(jié)(兩個(gè)環(huán)節(jié)關(guān)聯(lián)相同的taskId),因此整個(gè)審核環(huán)節(jié)的執(zhí)行調(diào)用了兩次審核接口。如圖左側(cè)所示,完整的審核場(chǎng)景涉及眾多“業(yè)務(wù)邏輯”的執(zhí)行,而分布式會(huì)話跟蹤只是根據(jù)兩次RPC調(diào)用生成了右側(cè)的兩條調(diào)用鏈路,并沒有辦法準(zhǔn)確地描述審核場(chǎng)景業(yè)務(wù)邏輯的執(zhí)行,問(wèn)題主要體現(xiàn)在以下幾個(gè)方面:

圖片

圖3 分布式會(huì)話跟蹤案例

  • 無(wú)法同時(shí)追蹤多條調(diào)用鏈路

分布式會(huì)話跟蹤僅支持單個(gè)請(qǐng)求的調(diào)用追蹤,當(dāng)業(yè)務(wù)場(chǎng)景包含了多個(gè)調(diào)用時(shí),將生成多條調(diào)用鏈路;由于調(diào)用鏈路通過(guò)traceId串聯(lián),不同鏈路之間相互獨(dú)立,因此給完整的業(yè)務(wù)追蹤增加了難度。例如當(dāng)排查審核場(chǎng)景的業(yè)務(wù)問(wèn)題時(shí),由于初審和復(fù)審是不同的RPC請(qǐng)求,所以無(wú)法直接同時(shí)獲取到2條調(diào)用鏈路,通常需要額外存儲(chǔ)2個(gè)traceId的映射關(guān)系。

  • 無(wú)法準(zhǔn)確描述業(yè)務(wù)邏輯的全景

分布式會(huì)話跟蹤生成的調(diào)用鏈路,只包含單次請(qǐng)求的實(shí)際調(diào)用情況,部分未執(zhí)行的調(diào)用以及本地邏輯無(wú)法體現(xiàn)在鏈路中,導(dǎo)致無(wú)法準(zhǔn)確描述業(yè)務(wù)邏輯的全景。例如同樣是審核接口,初審鏈路1包含了服務(wù)b的調(diào)用,而復(fù)審鏈路2卻并沒有包含,這是因?yàn)閷徍藞?chǎng)景中存在“判斷邏輯”,而該邏輯無(wú)法體現(xiàn)在調(diào)用鏈路中,還是需要人工結(jié)合代碼進(jìn)行分析。

  • 無(wú)法聚焦于當(dāng)前業(yè)務(wù)系統(tǒng)的邏輯執(zhí)行

分布式會(huì)話跟蹤覆蓋了單個(gè)請(qǐng)求流經(jīng)的所有服務(wù)、組件、機(jī)器等等,不僅包含當(dāng)前業(yè)務(wù)系統(tǒng),還涉及了眾多的下游服務(wù),當(dāng)接口內(nèi)部邏輯復(fù)雜時(shí),調(diào)用鏈路的深度和復(fù)雜度都會(huì)明顯增加,而業(yè)務(wù)追蹤其實(shí)僅需要聚焦于當(dāng)前業(yè)務(wù)系統(tǒng)的邏輯執(zhí)行情況。例如審核場(chǎng)景生成的調(diào)用鏈路,就涉及了眾多下游服務(wù)的內(nèi)部調(diào)用情況,反而給當(dāng)前業(yè)務(wù)系統(tǒng)的問(wèn)題排查增加了復(fù)雜度。

3)總結(jié)

傳統(tǒng)的ELK方案是一種滯后的業(yè)務(wù)追蹤,需要事后從大量離散的日志中搜集和篩選出需要的日志,并人工進(jìn)行日志的串聯(lián)分析,其過(guò)程必然耗時(shí)耗力。而分布式會(huì)話跟蹤方案則是在調(diào)用執(zhí)行的同時(shí),實(shí)時(shí)地完成了鏈路的動(dòng)態(tài)串聯(lián),但由于是會(huì)話級(jí)別且僅關(guān)注于調(diào)用關(guān)系等問(wèn)題,導(dǎo)致其無(wú)法很好地應(yīng)用于業(yè)務(wù)追蹤。

因此,無(wú)論是傳統(tǒng)的ELK方案還是分布式會(huì)話跟蹤方案,都難以滿足日益復(fù)雜的業(yè)務(wù)追蹤需求。本文希望能夠?qū)崿F(xiàn)聚焦于業(yè)務(wù)邏輯追蹤的高效解決方案,將業(yè)務(wù)執(zhí)行的日志以業(yè)務(wù)鏈路為載體進(jìn)行高效組織和串聯(lián),并支持業(yè)務(wù)執(zhí)行現(xiàn)場(chǎng)的還原和可視化查看,從而提升定位問(wèn)題的效率,即可視化全鏈路日志追蹤。

下文將介紹可視化全鏈路日志追蹤的設(shè)計(jì)思路和通用方案,同時(shí)介紹新方案在大眾點(diǎn)評(píng)內(nèi)容平臺(tái)的落地情況,旨在幫助有類似需求的業(yè)務(wù)系統(tǒng)開發(fā)需求的同學(xué)提供一些思路。

二、可視化全鏈路日志追蹤

?1、設(shè)計(jì)思路

可視化全鏈路日志追蹤考慮在前置階段,即業(yè)務(wù)執(zhí)行的同時(shí)實(shí)現(xiàn)業(yè)務(wù)日志的高效組織和動(dòng)態(tài)串聯(lián),如下圖4所示,此時(shí)離散的日志數(shù)據(jù)將會(huì)根據(jù)業(yè)務(wù)邏輯進(jìn)行組織,繪制出執(zhí)行現(xiàn)場(chǎng),從而可以實(shí)現(xiàn)高效的業(yè)務(wù)追蹤。

圖片

圖4 業(yè)務(wù)系統(tǒng)日志追蹤案例

新方案需要回答兩個(gè)關(guān)鍵問(wèn)題:如何高效組織業(yè)務(wù)日志,以及如何動(dòng)態(tài)串聯(lián)業(yè)務(wù)日志。下文將逐一進(jìn)行回答。

1)如何高效組織業(yè)務(wù)日志?

為了實(shí)現(xiàn)高效的業(yè)務(wù)追蹤,首先需要準(zhǔn)確完整地描述出業(yè)務(wù)邏輯,形成業(yè)務(wù)邏輯的全景圖,而業(yè)務(wù)追蹤其實(shí)就是通過(guò)執(zhí)行時(shí)的日志數(shù)據(jù),在全景圖中還原出業(yè)務(wù)執(zhí)行的現(xiàn)場(chǎng)。

新方案對(duì)業(yè)務(wù)邏輯進(jìn)行了抽象,定義出業(yè)務(wù)邏輯鏈路,下面還是以“審核業(yè)務(wù)場(chǎng)景”為例,來(lái)說(shuō)明業(yè)務(wù)邏輯鏈路的抽象過(guò)程:

  • 邏輯節(jié)點(diǎn):業(yè)務(wù)系統(tǒng)的眾多邏輯可以按照業(yè)務(wù)功能進(jìn)行拆分,形成一個(gè)個(gè)相互獨(dú)立的業(yè)務(wù)邏輯單元,即邏輯節(jié)點(diǎn),可以是本地方法(如下圖5的“判斷邏輯”節(jié)點(diǎn))也可以是RPC等遠(yuǎn)程調(diào)用方法(如下圖5的“邏輯A”節(jié)點(diǎn))。

  • 邏輯鏈路:業(yè)務(wù)系統(tǒng)對(duì)外支撐著眾多的業(yè)務(wù)場(chǎng)景,每個(gè)業(yè)務(wù)場(chǎng)景對(duì)應(yīng)一個(gè)完整的業(yè)務(wù)流程,可以抽象為由邏輯節(jié)點(diǎn)組合而成的邏輯鏈路,如下圖5中的邏輯鏈路就準(zhǔn)確完整地描述了“審核業(yè)務(wù)場(chǎng)景”。

一次業(yè)務(wù)追蹤就是邏輯鏈路的某一次執(zhí)行情況的還原,邏輯鏈路完整準(zhǔn)確地描述了業(yè)務(wù)邏輯全景,同時(shí)作為載體可以實(shí)現(xiàn)業(yè)務(wù)日志的高效組織。

圖片

圖5 業(yè)務(wù)邏輯鏈路案例

2)如何動(dòng)態(tài)串聯(lián)業(yè)務(wù)日志?

業(yè)務(wù)邏輯執(zhí)行時(shí)的日志數(shù)據(jù)原本是離散存儲(chǔ)的,而此時(shí)需要實(shí)現(xiàn)的是,隨著業(yè)務(wù)邏輯的執(zhí)行動(dòng)態(tài)串聯(lián)各個(gè)邏輯節(jié)點(diǎn)的日志,進(jìn)而還原出完整的業(yè)務(wù)邏輯執(zhí)行現(xiàn)場(chǎng)。

由于邏輯節(jié)點(diǎn)之間、邏輯節(jié)點(diǎn)內(nèi)部往往通過(guò)MQ或者RPC等進(jìn)行交互,新方案可以采用分布式會(huì)話跟蹤提供的分布式參數(shù)透?jìng)髂芰?shí)現(xiàn)業(yè)務(wù)日志的動(dòng)態(tài)串聯(lián):

  • 通過(guò)在執(zhí)行線程和網(wǎng)絡(luò)通信中持續(xù)地透?jìng)鲄?shù),實(shí)現(xiàn)在業(yè)務(wù)邏輯執(zhí)行的同時(shí),不中斷地傳遞鏈路和節(jié)點(diǎn)的標(biāo)識(shí),實(shí)現(xiàn)離散日志的染色。

  • 基于標(biāo)識(shí),染色的離散日志會(huì)被動(dòng)態(tài)串聯(lián)至正在執(zhí)行的節(jié)點(diǎn),逐漸匯聚出完整的邏輯鏈路,最終實(shí)現(xiàn)業(yè)務(wù)執(zhí)行現(xiàn)場(chǎng)的高效組織和可視化展示。

與分布式會(huì)話跟蹤方案不同的是,當(dāng)同時(shí)串聯(lián)多次分布式調(diào)用時(shí),新方案需要結(jié)合業(yè)務(wù)邏輯選取一個(gè)公共id作為標(biāo)識(shí),例如圖5的審核場(chǎng)景涉及2次RPC調(diào)用,為了保證2次執(zhí)行被串聯(lián)至同一條邏輯鏈路,此時(shí)結(jié)合審核業(yè)務(wù)場(chǎng)景,選擇初審和復(fù)審相同的“任務(wù)id”作為標(biāo)識(shí),完整地實(shí)現(xiàn)審核場(chǎng)景的邏輯鏈路串聯(lián)和執(zhí)行現(xiàn)場(chǎng)還原。

?2、通用方案

明確日志的高效組織和動(dòng)態(tài)串聯(lián)這兩個(gè)基本問(wèn)題后,本文選取圖4業(yè)務(wù)系統(tǒng)中的“邏輯鏈路1”進(jìn)行通用方案的詳細(xì)說(shuō)明,方案可以拆解為以下步驟:

圖片

圖6 通用方案拆解

1)鏈路定義

“鏈路定義”的含義為:使用特定語(yǔ)言,靜態(tài)描述完整的邏輯鏈路,鏈路通常由多個(gè)邏輯節(jié)點(diǎn),按照一定的業(yè)務(wù)規(guī)則組合而成,業(yè)務(wù)規(guī)則即各個(gè)邏輯節(jié)點(diǎn)之間存在的執(zhí)行關(guān)系,包括串行、并行、條件分支。

DSL(Domain Specific Language)是為了解決某一類任務(wù)而專門設(shè)計(jì)的計(jì)算機(jī)語(yǔ)言,可以通過(guò)JSON或XML定義出一系列節(jié)點(diǎn)(邏輯節(jié)點(diǎn))的組合關(guān)系(業(yè)務(wù)規(guī)則)。因此,本方案選擇使用DSL描述邏輯鏈路,實(shí)現(xiàn)邏輯鏈路從抽象定義到具體實(shí)現(xiàn)。

圖片

圖7 鏈路的抽象定義和具體實(shí)現(xiàn)

邏輯鏈路1-DSL

 [
{
"nodeName": "A",
"nodeType": "rpc"
},
{
"nodeName": "Fork",
"nodeType": "fork",
"forkNodes": [
[
{
"nodeName": "B",
"nodeType": "rpc"
}
],
[
{
"nodeName": "C",
"nodeType": "local"
}
]
]
},
{
"nodeName": "Join",
"nodeType": "join",
"joinOnList": [
"B",
"C"
]
},
{
"nodeName": "D",
"nodeType": "decision",
"decisionCases": {
"true": [
{
"nodeName": "E",
"nodeType": "rpc"
}
]
},
"defaultCase": [
{
"nodeName": "F",
"nodeType": "rpc"
}
]
}
]

?2)鏈路染色

“鏈路染色”的含義為:在鏈路執(zhí)行過(guò)程中,通過(guò)透?jìng)鞔?lián)標(biāo)識(shí),明確具體是哪條鏈路在執(zhí)行,執(zhí)行到了哪個(gè)節(jié)點(diǎn)。

鏈路染色包括兩個(gè)步驟:

①步驟一

確定串聯(lián)標(biāo)識(shí),當(dāng)邏輯鏈路開啟時(shí),確定唯一標(biāo)識(shí),能夠明確后續(xù)待執(zhí)行的鏈路和節(jié)點(diǎn)。

鏈路唯一標(biāo)識(shí)  =  業(yè)務(wù)標(biāo)識(shí) + 場(chǎng)景標(biāo)識(shí) + 執(zhí)行標(biāo)識(shí) (三個(gè)標(biāo)識(shí)共同決定“某個(gè)業(yè)務(wù)場(chǎng)景下的某次執(zhí)行”)

  • 業(yè)務(wù)標(biāo)識(shí):賦予鏈路業(yè)務(wù)含義,例如“用戶id”、“活動(dòng)id”等等。

  • 場(chǎng)景標(biāo)識(shí):賦予鏈路場(chǎng)景含義,例如當(dāng)前場(chǎng)景是“邏輯鏈路1”。

  • 執(zhí)行標(biāo)識(shí):賦予鏈路執(zhí)行含義,例如只涉及單次調(diào)用時(shí),可以直接選擇“traceId”;涉及多次調(diào)用時(shí)則,根據(jù)業(yè)務(wù)邏輯選取多次調(diào)用相同的“公共id”。

節(jié)點(diǎn)唯一標(biāo)識(shí)  =  鏈路唯一標(biāo)識(shí) + 節(jié)點(diǎn)名稱 (兩個(gè)標(biāo)識(shí)共同決定“某個(gè)業(yè)務(wù)場(chǎng)景下的某次執(zhí)行中的某個(gè)邏輯節(jié)點(diǎn)”)

  • 節(jié)點(diǎn)名稱:DSL中預(yù)設(shè)的節(jié)點(diǎn)唯一名稱,如“A”。

②步驟二

傳遞串聯(lián)標(biāo)識(shí),當(dāng)邏輯鏈路執(zhí)行時(shí),在分布式的完整鏈路中透?jìng)鞔?lián)標(biāo)識(shí),動(dòng)態(tài)串聯(lián)鏈路中已執(zhí)行的節(jié)點(diǎn),實(shí)現(xiàn)鏈路的染色。例如在“邏輯鏈路1”中:

  • 當(dāng)“A”節(jié)點(diǎn)觸發(fā)執(zhí)行,則開始在后續(xù)鏈路和節(jié)點(diǎn)中傳遞串聯(lián)標(biāo)識(shí),隨著業(yè)務(wù)流程的執(zhí)行,逐步完成整個(gè)鏈路的染色。

  • 當(dāng)標(biāo)識(shí)傳遞至“E”節(jié)點(diǎn)時(shí),則表示“D”條件分支的判斷結(jié)果是“true”,同時(shí)動(dòng)態(tài)地將“E”節(jié)點(diǎn)串聯(lián)至已執(zhí)行的鏈路中。

3)鏈路上報(bào)

“鏈路上報(bào)”的含義為:在鏈路執(zhí)行過(guò)程中,將日志以鏈路的組織形式進(jìn)行上報(bào),實(shí)現(xiàn)業(yè)務(wù)現(xiàn)場(chǎng)的準(zhǔn)確保存。

圖片

圖8 鏈路上報(bào)圖示

如上圖8所示,上報(bào)的日志數(shù)據(jù)包括:節(jié)點(diǎn)日志和業(yè)務(wù)日志。其中節(jié)點(diǎn)日志的作用是繪制鏈路中的已執(zhí)行節(jié)點(diǎn),記錄了節(jié)點(diǎn)的開始、結(jié)束、輸入、輸出;業(yè)務(wù)日志的作用是展示鏈路節(jié)點(diǎn)具體業(yè)務(wù)邏輯的執(zhí)行情況,記錄了任何對(duì)業(yè)務(wù)邏輯起到解釋作用的數(shù)據(jù),包括與上下游交互的入?yún)⒊鰠?、?fù)雜邏輯的中間變量、邏輯執(zhí)行拋出的異常。

4)鏈路存儲(chǔ)

“鏈路存儲(chǔ)”的含義為:將鏈路執(zhí)行中上報(bào)的日志落地存儲(chǔ),并用于后續(xù)的“現(xiàn)場(chǎng)還原”。上報(bào)日志可以拆分為鏈路日志、節(jié)點(diǎn)日志和業(yè)務(wù)日志三類:

  • 鏈路日志:鏈路單次執(zhí)行中,從開始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)的日志中提取的鏈路基本信息,包含鏈路類型、鏈路元信息、鏈路開始/結(jié)束時(shí)間等。

  • 節(jié)點(diǎn)日志:鏈路單次執(zhí)行中,已執(zhí)行節(jié)點(diǎn)的基本信息,包含節(jié)點(diǎn)名稱、節(jié)點(diǎn)狀態(tài)、節(jié)點(diǎn)開始/結(jié)束時(shí)間等。

  • 業(yè)務(wù)日志:鏈路單次執(zhí)行中,已執(zhí)行節(jié)點(diǎn)中的業(yè)務(wù)日志信息,包含日志級(jí)別、日志時(shí)間、日志數(shù)據(jù)等。

下圖就是鏈路存儲(chǔ)的存儲(chǔ)模型,包含了鏈路日志,節(jié)點(diǎn)日志,業(yè)務(wù)日志、鏈路元數(shù)據(jù)(配置數(shù)據(jù)),并且是如下圖9所示的樹狀結(jié)構(gòu),其中業(yè)務(wù)標(biāo)識(shí)作為根節(jié)點(diǎn),用于后續(xù)的鏈路查詢。

圖片

圖9 鏈路的樹狀存儲(chǔ)結(jié)構(gòu)

三、大眾點(diǎn)評(píng)內(nèi)容平臺(tái)實(shí)踐

?1、業(yè)務(wù)特點(diǎn)與挑戰(zhàn)

互聯(lián)網(wǎng)時(shí)代,內(nèi)容為王。內(nèi)容型平臺(tái)的核心打法就是搭建內(nèi)容流水線,保障內(nèi)容可持續(xù)、健康且有價(jià)值地流轉(zhuǎn)到內(nèi)容消費(fèi)者,并最終形成內(nèi)容“生產(chǎn)→治理→消費(fèi)→生產(chǎn)”的良性循環(huán)。

大眾點(diǎn)評(píng)和美團(tuán)App擁有豐富多樣的內(nèi)容,站內(nèi)外業(yè)務(wù)方、合作方有著眾多的消費(fèi)場(chǎng)景。對(duì)于內(nèi)容流水線中的三方,分別有如下需求:

  • 內(nèi)容的生產(chǎn)方:希望生產(chǎn)的內(nèi)容能在更多的渠道分發(fā),收獲更多的流量,被消費(fèi)者所喜愛。

  • 內(nèi)容的治理方:希望作為“防火墻”過(guò)濾出合法合規(guī)的內(nèi)容,同時(shí)整合機(jī)器和人工能力,豐富內(nèi)容屬性。

  • 內(nèi)容的消費(fèi)方:希望獲得滿足其個(gè)性化需求的內(nèi)容,能夠吸引其種草,或輔助其做出消費(fèi)決策。

生產(chǎn)方的內(nèi)容模型各異、所需處理手段各不相同,消費(fèi)方對(duì)于內(nèi)容也有著個(gè)性化的要求。如果由各個(gè)生產(chǎn)方和消費(fèi)方單獨(dú)對(duì)接,內(nèi)容模型異構(gòu)、處理流程和輸出門檻各異的問(wèn)題將帶來(lái)對(duì)接的高成本和低效率。在此背景下,點(diǎn)評(píng)內(nèi)容平臺(tái)應(yīng)運(yùn)而生,作為內(nèi)容流水線的“治理方”,承上啟下實(shí)現(xiàn)了內(nèi)容的統(tǒng)一接入、統(tǒng)一處理和統(tǒng)一輸出:

圖片

圖10 點(diǎn)評(píng)內(nèi)容平臺(tái)業(yè)務(wù)形態(tài)

  • 統(tǒng)一接入:統(tǒng)一內(nèi)容數(shù)據(jù)模型,對(duì)接不同的內(nèi)容生產(chǎn)方,將異構(gòu)的內(nèi)容轉(zhuǎn)化為內(nèi)容平臺(tái)通用的數(shù)據(jù)模型。

  • 統(tǒng)一處理:統(tǒng)一處理能力建設(shè),積累并完善通用的機(jī)器處理和人工運(yùn)營(yíng)能力,保證內(nèi)容合法合規(guī),屬性豐富。

  • 統(tǒng)一輸出:統(tǒng)一輸出門檻建設(shè),對(duì)接不同的內(nèi)容消費(fèi)方,為下游提供規(guī)范且滿足其個(gè)性化需求的內(nèi)容數(shù)據(jù)。

如下圖11所示,是點(diǎn)評(píng)內(nèi)容平臺(tái)的核心業(yè)務(wù)流程,每一條內(nèi)容都會(huì)經(jīng)過(guò)這個(gè)流程,最終決定在各個(gè)渠道下是否分發(fā)。

圖片

圖11 點(diǎn)評(píng)內(nèi)容平臺(tái)業(yè)務(wù)流程

內(nèi)容是否及時(shí)、準(zhǔn)確經(jīng)過(guò)內(nèi)容平臺(tái)的處理,是內(nèi)容生產(chǎn)方和消費(fèi)方的核心關(guān)注,也是日常值班的主要客訴類型。而內(nèi)容平臺(tái)的業(yè)務(wù)追蹤建設(shè),主要面臨以下的困難與復(fù)雜性:

  • 業(yè)務(wù)場(chǎng)景多:業(yè)務(wù)流程涉及多個(gè)不同的業(yè)務(wù)場(chǎng)景,且邏輯各異,例如實(shí)時(shí)接入、人工運(yùn)營(yíng)、分發(fā)重算等圖中列出的部分場(chǎng)景。

  • 邏輯節(jié)點(diǎn)多:業(yè)務(wù)場(chǎng)景涉及眾多的邏輯節(jié)點(diǎn),且不同內(nèi)容類型節(jié)點(diǎn)各異,例如同樣是實(shí)時(shí)接入場(chǎng)景,筆記內(nèi)容和直播內(nèi)容在執(zhí)行的邏輯節(jié)點(diǎn)上存在較大差異。

  • 觸發(fā)執(zhí)行多:業(yè)務(wù)場(chǎng)景會(huì)被多次觸發(fā)執(zhí)行,且由于來(lái)源不同,邏輯也會(huì)存在差異,例如筆記內(nèi)容被作者編輯、被系統(tǒng)審核等等后,都會(huì)觸發(fā)實(shí)時(shí)接入場(chǎng)景的重新執(zhí)行。

點(diǎn)評(píng)內(nèi)容平臺(tái)日均處理百萬(wàn)條內(nèi)容,涉及百萬(wàn)次業(yè)務(wù)場(chǎng)景的執(zhí)行、高達(dá)億級(jí)的邏輯節(jié)點(diǎn)的執(zhí)行,而業(yè)務(wù)日志分散在不同的應(yīng)用中,并且不同內(nèi)容,不同場(chǎng)景,不同節(jié)點(diǎn)以及多次執(zhí)行的日志混雜在一起,無(wú)論是日志的搜集還是現(xiàn)場(chǎng)的還原都相當(dāng)繁瑣耗時(shí),傳統(tǒng)的業(yè)務(wù)追蹤方案越來(lái)越不適用于內(nèi)容平臺(tái)。

點(diǎn)評(píng)內(nèi)容平臺(tái)亟需新的解決方案,實(shí)現(xiàn)高效的業(yè)務(wù)追蹤,因此我們進(jìn)行了可視化全鏈路日志追蹤的建設(shè),下面本文將介紹一下相關(guān)的實(shí)踐和成果。

?2、實(shí)踐與成果

1)實(shí)踐

點(diǎn)評(píng)內(nèi)容平臺(tái)是一個(gè)復(fù)雜的業(yè)務(wù)系統(tǒng),對(duì)外支撐著眾多的業(yè)務(wù)場(chǎng)景,通過(guò)對(duì)于業(yè)務(wù)場(chǎng)景的梳理和抽象,可以定義出實(shí)時(shí)接入、人工運(yùn)營(yíng)、任務(wù)導(dǎo)入、分發(fā)重算等多個(gè)業(yè)務(wù)邏輯鏈路。由于點(diǎn)評(píng)內(nèi)容平臺(tái)涉及眾多的內(nèi)部服務(wù)和下游依賴服務(wù),每天支撐著大量的內(nèi)容處理業(yè)務(wù),伴隨著業(yè)務(wù)的執(zhí)行將生成大量的日志數(shù)據(jù),與此同時(shí)鏈路上報(bào)還需要對(duì)眾多的服務(wù)進(jìn)行改造。因此在通用的全鏈路日志追蹤方案的基礎(chǔ)上,點(diǎn)評(píng)內(nèi)容平臺(tái)進(jìn)行了如下的具體實(shí)踐。

①支持大數(shù)據(jù)量日志的上報(bào)和存儲(chǔ)

點(diǎn)評(píng)內(nèi)容平臺(tái)實(shí)現(xiàn)了圖12所示的日志上報(bào)架構(gòu),支持眾多服務(wù)統(tǒng)一的日志收集、處理和存儲(chǔ),能夠很好地支撐大數(shù)據(jù)量下的日志追蹤建設(shè)。

圖片

圖12 點(diǎn)評(píng)內(nèi)容平臺(tái)日志上報(bào)架構(gòu)

日志收集:各應(yīng)用服務(wù)通過(guò)機(jī)器上部署的log_agent收集異步上報(bào)的日志數(shù)據(jù),并統(tǒng)一傳輸至Kafka通道中,此外針對(duì)少量不支持log_agent的服務(wù),搭建了如圖所示的中轉(zhuǎn)應(yīng)用。

日志解析:收集的日志通過(guò)Kafka接入到Flink中,統(tǒng)一進(jìn)行解析和處理,根據(jù)日志類型對(duì)日志進(jìn)行分類和聚合,解析為鏈路日志、節(jié)點(diǎn)日志和業(yè)務(wù)日志。

日志存儲(chǔ):完成日志解析后,日志會(huì)按照樹狀的存儲(chǔ)模型進(jìn)行落地存儲(chǔ),結(jié)合存儲(chǔ)的需求分析以及各個(gè)存儲(chǔ)選項(xiàng)的特點(diǎn),點(diǎn)評(píng)內(nèi)容平臺(tái)最終選擇HBase作為存儲(chǔ)選型。

圖片

整體而言,log_agent + Kafka + Flink + HBase的日志上報(bào)和存儲(chǔ)架構(gòu)能夠很好地支持復(fù)雜的業(yè)務(wù)系統(tǒng),天然支持分布式場(chǎng)景下眾多應(yīng)用的日志上報(bào),同時(shí)適用于高流量的數(shù)據(jù)寫入。

②實(shí)現(xiàn)眾多后端服務(wù)的低成本改造

點(diǎn)評(píng)內(nèi)容平臺(tái)實(shí)現(xiàn)了“自定義日志工具包”(即下圖13的TraceLogger工具包),屏蔽鏈路追蹤中的上報(bào)細(xì)節(jié),實(shí)現(xiàn)眾多服務(wù)改造的成本最小化。TraceLogger工具包的功能包括:

  • 模仿slf4j-api:工具包的實(shí)現(xiàn)在slf4j框架之上,并模仿slf4j-api對(duì)外提供相同的API,因此使用方無(wú)學(xué)習(xí)成本。

  • 屏蔽內(nèi)部細(xì)節(jié),內(nèi)部封裝一系列的鏈路日志上報(bào)邏輯,屏蔽染色等細(xì)節(jié),降低使用方的開發(fā)成本。

a. 上報(bào)判斷:

判斷鏈路標(biāo)識(shí):無(wú)標(biāo)識(shí)時(shí),進(jìn)行兜底的日志上報(bào),防止日志丟失。

判斷上報(bào)方式:有標(biāo)識(shí)時(shí),支持日志和RPC中轉(zhuǎn)兩種上報(bào)方式。

b. 日志組裝:實(shí)現(xiàn)參數(shù)占位、異常堆棧輸出等功能,并將相關(guān)數(shù)據(jù)組裝為Trace對(duì)象,便于進(jìn)行統(tǒng)一的收集和處理。

c. 異常上報(bào):通過(guò)ErrorAPI主動(dòng)上報(bào)異常,兼容原日志上報(bào)中ErrorAppender。

d. 日志上報(bào):適配Log4j2日志框架實(shí)現(xiàn)最終的日志上報(bào)。

圖片

圖13 TraceLogger日志工具包

下面是TraceLogger工具包分別進(jìn)行業(yè)務(wù)日志和節(jié)點(diǎn)日志上報(bào)的使用案例,整體的改造成本較低。

  • 業(yè)務(wù)日志上報(bào):無(wú)學(xué)習(xí)成本,基本無(wú)改造成本。?
// 替換前:原日志上報(bào)
LOGGER.error("update struct failed, param:{}", GsonUtils.toJson(structRequest), e);
// 替換后:全鏈路日志上報(bào)
TraceLogger.error("update struct failed, param:{}", GsonUtils.toJson(structRequest), e);
  • 節(jié)點(diǎn)日志上報(bào):支持API、AOP兩種上報(bào)方式,靈活且成本低。
public Response realTimeInputLink(long contentId) {
// 鏈路開始:傳遞串聯(lián)標(biāo)識(shí)(業(yè)務(wù)標(biāo)識(shí) + 場(chǎng)景標(biāo)識(shí) + 執(zhí)行標(biāo)識(shí))
TraceUtils.passLinkMark("contentId_type_uuid");
// ...
// 本地調(diào)用(API上報(bào)節(jié)點(diǎn)日志)
TraceUtils.reportNode("contentStore", contentId, StatusEnums.RUNNING)
contentStore(contentId);
TraceUtils.reportNode("contentStore", structResp, StatusEnums.COMPLETED)
// ...
// 遠(yuǎn)程調(diào)用
Response processResp = picProcess(contentId);
// ...
}
// AOP上報(bào)節(jié)點(diǎn)日志
@TraceNode(nodeName="picProcess")
public Response picProcess(long contentId) {
// 圖片處理業(yè)務(wù)邏輯
// 業(yè)務(wù)日志數(shù)據(jù)上報(bào)
TraceLogger.warn("picProcess failed, contentId:{}", contentId);
}

?2)成果

基于上述實(shí)踐,點(diǎn)評(píng)內(nèi)容平臺(tái)實(shí)現(xiàn)了可視化全鏈路日志追蹤,能夠一鍵追蹤任意一條內(nèi)容所有業(yè)務(wù)場(chǎng)景的執(zhí)行,并通過(guò)可視化的鏈路進(jìn)行執(zhí)行現(xiàn)場(chǎng)的還原,追蹤效果如下圖所示:

【鏈路查詢功能】:根據(jù)內(nèi)容id實(shí)時(shí)查詢?cè)搩?nèi)容所有的邏輯鏈路執(zhí)行,覆蓋所有的業(yè)務(wù)場(chǎng)景。

圖片

圖14 鏈路查詢

【鏈路展示功能】:通過(guò)鏈路圖可視化展示業(yè)務(wù)邏輯的全景,同時(shí)展示各個(gè)節(jié)點(diǎn)的執(zhí)行情況。

圖片

圖15 鏈路展示

【節(jié)點(diǎn)詳情查詢功能】:支持展示任意已執(zhí)行節(jié)點(diǎn)的詳情,包括節(jié)點(diǎn)輸入、輸出,以及節(jié)點(diǎn)執(zhí)行過(guò)程中的關(guān)鍵業(yè)務(wù)日志。

圖片

圖16 節(jié)點(diǎn)詳情

目前,可視化全鏈路日志追蹤系統(tǒng)已經(jīng)成為點(diǎn)評(píng)內(nèi)容平臺(tái)的“問(wèn)題排查工具”,我們可以將問(wèn)題排查耗時(shí)從小時(shí)級(jí)降低到5分鐘內(nèi);同時(shí)也是“測(cè)試輔助工具”,利用可視化的日志串聯(lián)和展示,明顯提升了RD自測(cè)、QA測(cè)試的效率。最后總結(jié)一下可視化全鏈路日志追蹤的優(yōu)點(diǎn):

  • 接入成本低:DSL配置配合簡(jiǎn)單的日志上報(bào)改造,即可快速接入。

  • 追蹤范圍廣:任意一條內(nèi)容的所有邏輯鏈路,均可被追蹤。

  • 使用效率高:管理后臺(tái)支持鏈路和日志的可視化查詢展示,簡(jiǎn)單快捷。

四、總結(jié)與展望

隨著分布式業(yè)務(wù)系統(tǒng)的日益復(fù)雜,可觀測(cè)性對(duì)于業(yè)務(wù)系統(tǒng)的穩(wěn)定運(yùn)行也愈發(fā)重要。作為大眾點(diǎn)評(píng)內(nèi)容流水線中的復(fù)雜業(yè)務(wù)系統(tǒng),為了保障內(nèi)容流轉(zhuǎn)的穩(wěn)定可靠,點(diǎn)評(píng)內(nèi)容平臺(tái)落地了全鏈路的可觀測(cè)建設(shè),在日志(Logging)、指標(biāo)(Metrics)和追蹤(Tracing)的三個(gè)具體方向上都進(jìn)行了一定的探索和建設(shè)。

其中之一就是本文的“可視化全鏈路日志追蹤”,結(jié)合日志(Logging)與追蹤(Tracing),我們提出了一套新的業(yè)務(wù)追蹤通用方案,通過(guò)在業(yè)務(wù)執(zhí)行階段,結(jié)合完整的業(yè)務(wù)邏輯動(dòng)態(tài)完成日志的組織串聯(lián),替代了傳統(tǒng)方案低效且滯后的人工日志串聯(lián),最終可以實(shí)現(xiàn)業(yè)務(wù)全流程的高效追蹤以及業(yè)務(wù)問(wèn)題的高效定位。此外,在指標(biāo)(Metrics)方向上,點(diǎn)評(píng)內(nèi)容平臺(tái)實(shí)踐落地了“可視化全鏈路指標(biāo)監(jiān)控”,支持實(shí)時(shí)、多維度地展示業(yè)務(wù)系統(tǒng)的關(guān)鍵業(yè)務(wù)和技術(shù)指標(biāo),同時(shí)支持相應(yīng)的告警和異常歸因能力,實(shí)現(xiàn)了對(duì)業(yè)務(wù)系統(tǒng)整體運(yùn)行狀況的有效把控。

未來(lái),點(diǎn)評(píng)內(nèi)容平臺(tái)會(huì)持續(xù)深耕,實(shí)現(xiàn)覆蓋告警、概況、排錯(cuò)和剖析等功能的可觀測(cè)體系,持續(xù)沉淀和輸出相關(guān)的通用方案,希望可以為業(yè)務(wù)系統(tǒng)(特別是復(fù)雜的業(yè)務(wù)系統(tǒng)),提供一些可觀測(cè)性建設(shè)的借鑒和啟發(fā)。

責(zé)任編輯:張燕妮 來(lái)源: dbaplus社群
相關(guān)推薦

2022-07-22 07:59:17

日志方案

2022-09-28 11:33:38

架構(gòu)

2023-10-16 23:43:52

云原生可觀測(cè)性

2018-01-10 14:15:14

2023-08-06 06:55:29

數(shù)字可視化物聯(lián)網(wǎng)

2023-01-30 22:34:44

Node.js前端

2023-12-21 11:39:47

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2021-01-07 06:14:31

數(shù)據(jù)地圖可視化數(shù)據(jù)可視化

2025-10-10 08:58:13

2023-08-24 22:13:31

2021-03-31 09:10:25

UI設(shè)計(jì)經(jīng)驗(yàn)

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2012-06-28 10:26:51

Silverlight

2024-06-07 08:19:05

2021-12-02 06:58:03

AIOps通信服務(wù)

2022-01-05 08:27:17

C++全鏈路追蹤

2021-06-02 09:12:04

App自動(dòng)化測(cè)試測(cè)試自動(dòng)化

2021-08-11 09:47:22

項(xiàng)目Django 管理

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

gogogogo高清视频在线| 中文字幕人妻丝袜乱一区三区| 一区二区三区在线免费看 | 白白色亚洲国产精品| 国产91在线视频| 国产三级精品三级观看| 国产图片一区| 9191精品国产综合久久久久久| 97视频在线免费| 99riav在线| 97se亚洲国产综合自在线不卡| 国产综合久久久久久| 亚洲欧美在线视频免费| 日韩精品久久| 亚洲精品99久久久久中文字幕| 制服丝袜综合网| 色在线免费观看| 亚洲欧美精品午睡沙发| 日韩欧美一区二区在线观看| 精品国产伦一区二区三区| 羞羞答答国产精品www一本| 久久精品免费电影| 国产高潮呻吟久久| 黄色免费大全亚洲| 91精品国产综合久久精品app| 黄色片一级视频| 国产第一页在线| 亚洲欧美另类图片小说| 四虎永久国产精品| 天天操天天干天天爱| 国产一区999| 成人a在线视频| 中文字幕a级片| 米奇777在线欧美播放| 亚洲**2019国产| 69av视频在线| 91成人影院| 日韩亚洲精品电影| 亚洲精品成人av久久| 尤物tv在线精品| 日韩成人中文字幕| 中文字幕在线播放一区| 白嫩白嫩国产精品| 欧美v国产在线一区二区三区| 精品国产鲁一鲁一区二区三区| 欧美日韩国产网站| 欧美自拍偷拍一区| 亚洲最大成人在线观看| 麻豆精品蜜桃| 欧洲精品在线观看| 男人女人黄一级| 欧美三级精品| 在线观看一区日韩| 999精品视频在线| 国产亚洲精品精品国产亚洲综合| 欧美少妇一区二区| 色婷婷综合网站| 宅男噜噜噜66国产精品免费| 欧美疯狂做受xxxx富婆| www.日本久久| 综合激情久久| 亚洲韩国青草视频| 在哪里可以看毛片| 欧美三级伦理在线| 日韩在线精品一区| 日韩精品一区二区亚洲av性色| 香蕉视频国产精品 | 免费电影日韩网站| 欧美性一二三区| 久久久久久久久久一区二区| av日韩一区| 亚洲精品一区二区三区蜜桃下载| 亚洲 欧美 日韩在线| 免费国产自久久久久三四区久久| 亚洲人成亚洲人成在线观看| 波多野结衣家庭教师在线观看| 国产精品麻豆久久| 欧美精品第一页在线播放| 尤物视频在线观看国产| 久久永久免费| 国产成人黄色| 欧洲福利电影| 女生裸体视频一区二区三区| 精品国产自在精品国产浪潮| 日韩成人毛片视频| 99国产精品视频免费观看一公开 | 欧美极品日韩| 嫩草香蕉在线91一二三区| 一区二区三区久久| 成人久久久久久久久| 久久精品超碰| 欧美精品一区二区在线播放 | 人妻精品一区一区三区蜜桃91 | 在线视频这里只有精品| 午夜精品电影| 国产成人精品免高潮费视频| 国产人妖在线播放| 91美女片黄在线观看91美女| 亚洲视频sss| 97在线超碰| 在线观看日产精品| 东京热av一区| 亚洲国产精品久久久久蝴蝶传媒| 538国产精品一区二区免费视频 | 精品国产sm最大网站免费看| 国产又黄又粗视频| 亚洲清纯自拍| 97在线电影| a视频网址在线观看| 一区二区三区免费在线观看| 日本888xxxx| 亚洲动漫精品| 欧美激情一区二区久久久| 国产成人无码专区| a级高清视频欧美日韩| 亚洲一二区在线| 欧美成人a交片免费看| 欧美成人一区二区三区| 色www亚洲国产阿娇yao| 国产深夜精品| 国产一区二区三区免费不卡| 国产在线高清视频| 欧美最新大片在线看| 国产福利短视频| 日韩午夜av在线| 国产精品免费一区二区三区四区| 免费黄色网页在线观看| 欧美系列日韩一区| 受虐m奴xxx在线观看| 亚洲国产日本| 成人资源av| av黄在线观看| 欧美一级夜夜爽| 色哟哟一一国产精品| 美女视频黄免费的久久| 日韩电影天堂视频一区二区| 麻豆免费版在线观看| 欧美精品一区二区三区高清aⅴ| 国产传媒免费在线观看| 激情丁香综合五月| 亚洲图片小说在线| 日日夜夜亚洲| 久久精品成人动漫| 国产又粗又黄又爽视频| 中文字幕在线观看不卡视频| 色综合天天色综合| 日韩欧美不卡| 91精品视频网站| 菠萝菠萝蜜在线观看| 666欧美在线视频| 99久久99久久精品国产| 国产一区视频网站| 精品免费久久久久久久| av动漫精品一区二区| 欧美丰满少妇xxxxx做受| 亚洲高清在线观看视频| 亚洲电影第三页| 99久久人妻精品免费二区| 一区二区黄色| 欧美一区观看| 自拍偷拍欧美日韩| 欧美高清videos高潮hd| 五月婷婷六月色| 欧美在线观看视频一区二区 | 亚洲色欧美另类| 色综合天天做天天爱| 国产在线免费av| 国产一区二区久久| 男女激情免费视频| 亚洲宅男网av| 国产欧美精品xxxx另类| v片在线观看| 亚洲精品动漫100p| 激情网站在线观看| 亚洲三级小视频| 理论片大全免费理伦片| 久久亚洲欧洲| 91精品一区二区三区四区| 成人影院中文字幕| 国产97人人超碰caoprom| 免费在线观看av片| 精品国产乱码久久久久久1区2区| aaaaaa毛片| 亚洲精品ww久久久久久p站| 亚洲精品中文字幕在线播放| 日韩电影免费在线观看网站| 永久免费看av| 国产99久久精品一区二区300| 91精品一区二区| 亚洲国产福利| 久久成人一区二区| 欧美少妇另类| 日韩一区二区不卡| 自拍偷拍18p| 午夜亚洲福利老司机| аⅴ天堂中文在线网| 丁香啪啪综合成人亚洲小说| 992kp快乐看片永久免费网址| 午夜视频一区| 亚洲成人精品电影在线观看| 一区视频网站| 成人免费淫片aa视频免费| 毛片在线网站| 欧美激情欧美激情在线五月| av在线电影观看| 亚洲精品美女在线| 精品人妻少妇嫩草av无码专区| 91福利国产成人精品照片| 麻豆影视在线播放| 中文字幕制服丝袜一区二区三区| 内射中出日韩无国产剧情| 国产剧情一区在线| xxww在线观看| 久久这里有精品15一区二区三区| 女人色极品影院| 国产精品福利在线观看播放| 欧美亚洲免费在线| 精品一区二区男人吃奶| 91亚洲精品在线观看| 78精品国产综合久久香蕉| 欧美一区二区.| 爱情岛论坛亚洲品质自拍视频网站| 久久精品小视频| 9191在线观看| 中文字幕日韩精品在线| 欧洲一区av| 亚洲精品国偷自产在线99热| 国产av精国产传媒| 在线电影国产精品| 97人妻一区二区精品免费视频| 欧美在线高清视频| www.av88| 欧美日韩视频专区在线播放| 亚洲国产成人精品女人久久| 欧美午夜电影在线| 国产精品100| 精品久久久久久中文字幕| 91浏览器在线观看| 精品久久久香蕉免费精品视频| 日本少妇吞精囗交| 大伊人狠狠躁夜夜躁av一区| 日操夜操天天操| 亚洲一二三区在线观看| 久久精品国产亚洲AV无码麻豆| 亚洲精品久久久久久国产精华液| 一起操在线播放| 一区二区在线观看av| 免看一级a毛片一片成人不卡| 夜夜嗨av一区二区三区中文字幕| 欧美日韩一级大片| 午夜精品国产更新| 九九热精品视频在线| 欧美日韩中文字幕在线| 黄色av一级片| 欧美优质美女网站| 怡红院男人的天堂| 欧美一区二区在线免费观看| 精品久久在线观看| 精品电影一区二区| 噜噜噜在线观看播放视频| 国产一区二区免费| 麻豆网站在线看| 欧美丰满老妇厨房牲生活| 丁香花在线观看完整版电影| 97超级碰在线看视频免费在线看| 综合另类专区| 成人网在线免费观看| 一区二区亚洲视频| 欧美专区一二三| 99re66热这里只有精品8| 中文字幕色呦呦| 国产欧美短视频| 91丨九色丨蝌蚪| 成人免费毛片片v| 国产又粗又猛又爽视频| 亚洲视频中文字幕| 日韩一区二区视频在线| 欧美日韩在线播放| www.xxxx国产| 亚洲三级av在线| 黄色精品在线观看| 91黄色8090| 9999在线精品视频| 精品蜜桃一区二区三区| 日韩av专区| 日本黄大片在线观看| 日韩精品一二三| 中国男女全黄大片| 国产亚洲欧美在线| 国产小视频在线看| 欧美亚洲国产一区在线观看网站| 99国产在线播放| 亚洲人成77777在线观看网| 国产三区在线观看| 欧美专区在线播放| 永久免费精品视频| 亚洲欧美成人一区| 亚洲精品乱码久久久久久蜜桃麻豆| 日本激情视频在线播放| 99精品视频一区二区| 欧美成人精品一区二区免费看片 | 久久久国产精品久久久| 久久精品这里都是精品| 麻豆亚洲av熟女国产一区二| 欧美视频一区在线| 日本中文字幕一区二区有码在线| 久久中国妇女中文字幕| 蜜桃成人精品| 另类欧美小说| 伊人精品视频| 免费观看黄网站| 国产精品免费人成网站| 欧美国产成人精品一区二区三区| 91精品蜜臀在线一区尤物| 婷婷亚洲一区二区三区| 欧美激情精品久久久久久黑人| 素人啪啪色综合| 麻豆av一区二区三区| 樱桃成人精品视频在线播放| 先锋资源在线视频| 中文字幕一区二区三中文字幕| 精品成人无码久久久久久| 日韩av一区二区在线| 美女精品视频| 动漫一区二区在线| 中文字幕免费精品| 色婷婷综合在线观看| 中文字幕一区二区三区四区不卡 | www.成人在线视频| 欧美中日韩免费视频| 99热免费精品| 国产又粗又长又爽| 亚洲国产视频网站| 高h震动喷水双性1v1| 欧美国产日本高清在线| 日韩精品视频中文字幕| 男人j进女人j| 国产成人精品aa毛片| 久久久久免费看| 亚洲电影第1页| 国产乱码午夜在线视频| 精品国产乱码久久久久久久软件 | 91av在线视频观看| 欧美男人操女人视频| 又大又硬又爽免费视频| www.成人在线| 潘金莲一级淫片aaaaaa播放| 亚洲精选在线观看| 91成人在线| 亚洲欧美影院| 国产一区视频在线看| 久久国产在线观看| 日韩电视剧在线观看免费网站| 悠悠资源网亚洲青| 日本一区二区三区四区高清视频 | 最近中文字幕免费| 欧美日韩国产天堂| 色a资源在线| 精品视频导航| 日韩激情在线观看| 黄色香蕉视频在线观看| 精品福利一二区| 亚洲精品一区| 亚洲三区在线| 国产不卡高清在线观看视频| 天堂网一区二区三区| 在线观看国产精品日韩av| 国产精品美女久久久久人| 精品一区二区三区无码视频| 99精品欧美一区二区三区小说| 免费精品一区二区| 欧美乱大交xxxxx| 自拍视频一区| 交换做爰国语对白| 精品国产电影一区| 青青青青在线| 国产精品福利视频| 丝袜美腿亚洲综合| 91插插插插插插| 精品亚洲一区二区三区在线观看 | 日本美女爱爱视频| 99久久er热在这里只有精品15| 亚洲午夜无码久久久久| 欧美高清在线播放| 成人看的羞羞网站| 91成人在线观看喷潮蘑菇| 欧美午夜精品久久久久久久| 三区四区在线视频| 看高清中日韩色视频| 国产一区在线看| 日韩黄色片网站| 欧美激情欧美狂野欧美精品| 欧洲杯什么时候开赛| 青青草视频网站| 欧美美女视频在线观看| 在线免费日韩片| 草b视频在线观看| 亚洲丝袜制服诱惑| 国产福利小视频在线| 国产一区二区高清不卡|