愛(ài)奇藝全鏈路自動(dòng)化監(jiān)控平臺(tái)的探索與實(shí)踐
點(diǎn)擊“開(kāi)發(fā)者技術(shù)前線(xiàn)”,選擇“星標(biāo)?”
讓一部分開(kāi)發(fā)者看到未來(lái)

1
互聯(lián)網(wǎng)技術(shù)普及過(guò)程中,數(shù)據(jù)的監(jiān)控對(duì)每個(gè)公司都很重要。近些年,隨著一些優(yōu)秀監(jiān)控工具(比如Zabbix、Graphite、Prometheus)的成熟,每個(gè)公司都會(huì)搭建自己的監(jiān)控體系,來(lái)分析整體業(yè)務(wù)流量和應(yīng)對(duì)異常報(bào)警。但隨著系統(tǒng)復(fù)雜性的提高,微服務(wù)的成熟,監(jiān)控又有了新的問(wèn)題需要解決,如上下文的鏈路關(guān)系、跨系統(tǒng)的故障定位等相關(guān)問(wèn)題。
為減輕公司業(yè)務(wù)線(xiàn)資源和開(kāi)發(fā)的監(jiān)控壓力,愛(ài)奇藝技術(shù)產(chǎn)品團(tuán)隊(duì)研發(fā)了一套全鏈路自動(dòng)化監(jiān)控平臺(tái),可以提供統(tǒng)一的監(jiān)控標(biāo)準(zhǔn)和基礎(chǔ)的監(jiān)控能力,增強(qiáng)故障定位和深度分析能力,提升監(jiān)控準(zhǔn)確性和透明性,本文將基于監(jiān)控一些經(jīng)驗(yàn),和大家分享全鏈路自動(dòng)化監(jiān)控平臺(tái)。
2
近些年ELK Stack、Cat、以及Google Dapper等監(jiān)控工具在機(jī)器數(shù)據(jù)分析實(shí)時(shí)日志處理領(lǐng)域,也都在嘗試解決一些新問(wèn)題,我們對(duì)此做了分析,總結(jié)來(lái)看,ELK Stack重依賴(lài)ES,存儲(chǔ)能力和查詢(xún)能力較難擴(kuò)展。Cat側(cè)重于Java后端?;贕oogle Dapper的全鏈路監(jiān)控思想相對(duì)成熟,但多數(shù)開(kāi)源實(shí)現(xiàn)的介紹缺少深度分析,查詢(xún)性能比較差,見(jiàn)下圖:
維度 | ELK Stack | Cat | Pinpoint/SkyWalking |
可視化 | 弱 | 一般 | 一般 |
報(bào)表 | 豐富 | 豐富 | 中 |
指標(biāo) | 無(wú) | 有 | 無(wú) |
拓?fù)?/span> | 無(wú) | 簡(jiǎn)單依賴(lài)圖 | 好 |
埋點(diǎn) | Logstash/Beats | 侵入 | 無(wú)侵入,字節(jié)碼增強(qiáng) |
大查詢(xún) | 弱 | 弱 | 弱 |
社區(qū) | 好,有中文 | 好,文檔豐富 | 一般,文檔缺,無(wú)中文 |
案例 | 很多公司 | 攜程、點(diǎn)評(píng)、陸金所、獵聘網(wǎng) | 暫無(wú) |
源頭 | ELK | aBay CAL | Google Dapper |
另一方面看,隨著微服務(wù)的成熟,實(shí)時(shí)監(jiān)控更加重要,Prometheus等基礎(chǔ)監(jiān)控解決了基本指標(biāo)和報(bào)警問(wèn)題,部分全鏈路監(jiān)控的實(shí)現(xiàn)解決鏈路追蹤的問(wèn)題,但兩者各司其職,是互相的補(bǔ)充,卻未融成統(tǒng)一的全鏈路監(jiān)控平臺(tái)。
基于對(duì)這些工具的分析,我們以現(xiàn)有的基礎(chǔ)監(jiān)控和日志采集為基礎(chǔ),融合Google Dapper思想,形成了統(tǒng)一的全鏈路自動(dòng)化監(jiān)控平臺(tái),并且可靈活快速接入公司的其他業(yè)務(wù)。對(duì)Google Dapper的改造,我們加入了緩存和離線(xiàn)處理的部分,大大提升了查詢(xún)性能;加入了深度分析部分,能夠自動(dòng)診斷用戶(hù)具體的報(bào)障;在改造鏈路UI展示的基礎(chǔ)上,加入了監(jiān)控指標(biāo),在看服務(wù)鏈路的同時(shí)能看到監(jiān)控指標(biāo),體驗(yàn)升級(jí)并更易發(fā)現(xiàn)性能瓶頸,可指導(dǎo)資源伸縮、可看到容量預(yù)警。
下面我們總結(jié)出全鏈路監(jiān)控的四部分:鏈路采集、指標(biāo)采集、日志采集、深度分析,并在全鏈路監(jiān)控平臺(tái)中一一落地。

圖1整體實(shí)踐
3
總體概覽
鏈路采集包括調(diào)用鏈和服務(wù)拓?fù)?,是全鏈路分析的串?lián)器。
指標(biāo)采集整合到服務(wù)鏈路上,使全鏈路具備基礎(chǔ)監(jiān)控能力。
日志采集的數(shù)據(jù)源,也是全鏈路分析的數(shù)據(jù)源。
深度分析包括離線(xiàn)、在線(xiàn)模塊,滿(mǎn)足全鏈路的問(wèn)題定位需求。

圖2全鏈路分析流程
鏈路采集
? ?鏈路采集,分為調(diào)用關(guān)系鏈和服務(wù)拓?fù)鋬刹糠?
調(diào)用關(guān)系鏈:兩個(gè)系統(tǒng)之間的調(diào)用,稱(chēng)之為Span,每個(gè)Span會(huì)記錄服務(wù)信息和上下文信息。串聯(lián)Span關(guān)系的字段是Trace id,是每個(gè)請(qǐng)求產(chǎn)生的唯一算法值。調(diào)用鏈?zhǔn)怯啥鄠€(gè)Span組成的有向無(wú)環(huán)圖(DAG),表示了一次請(qǐng)求的完整處理過(guò)程。圖中的每一個(gè)節(jié)點(diǎn)代表的是一個(gè)Span,圖中的邊表示的是不同服務(wù)(或服務(wù)內(nèi)部)的調(diào)用關(guān)系。通過(guò)深度分析Span,我們就能得到每個(gè)請(qǐng)求的調(diào)用鏈。 
圖3 有向無(wú)環(huán)圖DAG
????????① 代碼侵入模式
????????按照規(guī)范,在相關(guān)組件手動(dòng)埋點(diǎn)投遞。
????????② 無(wú)侵入模式(保證應(yīng)用級(jí)的透明)
????????支持Java、Go、Lua等Agent,原理采用探針技術(shù),對(duì)客戶(hù)端應(yīng)用程序沒(méi)有任何代碼入侵,使用方便易于對(duì)接。

圖4 鏈路采集架構(gòu)圖
我們的設(shè)計(jì)
1)鏈路分析基礎(chǔ)能力:
① 具備調(diào)用鏈檢索能力,有具體到接口級(jí)別的Trace鏈路,可根據(jù)Trace id來(lái)查看調(diào)用關(guān)系。? ?
② 調(diào)用關(guān)系中包含每個(gè)節(jié)點(diǎn)的響應(yīng)時(shí)間,請(qǐng)求方法和參數(shù)、以及自定義的Tag等信息,方便查詢(xún)和優(yōu)化鏈路。
2)鏈路分析優(yōu)化:
服務(wù)鏈路拓?fù)?ELK Stack的Kibana沒(méi)有服務(wù)拓?fù)淠芰ΑI(yè)界的Skywalking、Zipkin等,具備了服務(wù)拓?fù)淠芰Φ梢暬容^弱,功能單一,而且目前看到的全鏈路實(shí)現(xiàn),均未加入客戶(hù)端節(jié)點(diǎn)。
我們的設(shè)計(jì)
包裝了客戶(hù)端日志,在鏈路中加上前端節(jié)點(diǎn);在Skywalking基礎(chǔ)上,升級(jí)了UI頁(yè)面增強(qiáng)交互和視覺(jué);存儲(chǔ)組件從關(guān)系型數(shù)據(jù)庫(kù)改為圖數(shù)據(jù)庫(kù),使得UI有更多的邏輯展示空間和更快的響應(yīng)速度。最終補(bǔ)全整體鏈路,提供更友好的可視化(比如我們支持三層展示:首先業(yè)務(wù)線(xiàn)、業(yè)務(wù)線(xiàn)內(nèi)的服務(wù)、服務(wù)內(nèi)的調(diào)用)。
圖5 業(yè)務(wù)線(xiàn)維度?
圖6 服務(wù)維度???
圖7 服務(wù)維度切換視圖??

圖8 監(jiān)控指標(biāo)??
指標(biāo)采集
在指標(biāo)采集方面:指標(biāo)采集的技術(shù),如今Graphite、Prometheus配合時(shí)序數(shù)據(jù)庫(kù)的監(jiān)控體系,都能做到。問(wèn)題在于每個(gè)業(yè)務(wù)線(xiàn)都有自己的一套監(jiān)控,比如同樣計(jì)算成功率,因?yàn)榇鎯?chǔ)或者性能等方面的影響,算法有差異(有的是根據(jù)總成功數(shù)/總請(qǐng)求數(shù),有的在每臺(tái)機(jī)器的每分鐘的成功率聚合的基礎(chǔ)上匯總做算數(shù)平均或者加權(quán)平均)。因此監(jiān)控統(tǒng)一,整體架構(gòu)的數(shù)據(jù)分析才可描述。
我們的設(shè)計(jì)
日志采集
在日志采集方面,分為兩個(gè)階段:
ELK Stack的日志監(jiān)控階段,采用的是Logstash/Beats+Kafka+ES,優(yōu)點(diǎn)是采集靈活,缺點(diǎn)是ES存儲(chǔ)能力和查詢(xún)能力弱。 全鏈路監(jiān)控方面,比如蘑菇街的實(shí)現(xiàn),采用的是Logstash+Kafka+ES+Hadoop,優(yōu)點(diǎn)是解決了ES存儲(chǔ)能力問(wèn)題,缺點(diǎn)是未解決查詢(xún)能力問(wèn)題。
我們的設(shè)計(jì)

圖9 日志采集流程
深度分析
深度分析在報(bào)警方面,普遍的問(wèn)題,比如OPS、RT、Success Rate、P999,僅能反應(yīng)服務(wù)整體質(zhì)量。但具體到用戶(hù)的個(gè)人APP問(wèn)題,傳統(tǒng)方式都是開(kāi)發(fā)手動(dòng)排查,需要良好的架構(gòu)技術(shù)和豐富的業(yè)務(wù)經(jīng)驗(yàn),排查周期長(zhǎng)且結(jié)果模糊。這是業(yè)界存在的痛點(diǎn)。 我們的設(shè)計(jì)

圖10 環(huán)環(huán)相扣的診斷
聚合分析思路
① 對(duì)接客戶(hù)端錯(cuò)誤和客服系統(tǒng)用戶(hù)反饋,將粒度細(xì)到單條記錄作為分析的起點(diǎn),再根據(jù)鏈路關(guān)系,離線(xiàn)聚合該起點(diǎn)對(duì)應(yīng)所有后續(xù)鏈路服務(wù)的日志。其中,我們聚合的索引是Device id,因?yàn)橛械姆?wù)無(wú)法獲得該參數(shù),我們優(yōu)化了Trace id算法(包含Device id)。首先在服務(wù)請(qǐng)求的開(kāi)始,會(huì)全量自動(dòng)生成Trace id,保證后方服務(wù)都有Trace id,從而后方服務(wù)能從中提取到Device id。
② 所有的節(jié)點(diǎn)日志,進(jìn)行多維度最優(yōu)診斷,直到發(fā)現(xiàn)錯(cuò)誤點(diǎn)或遍歷結(jié)束。配合Easy Rule在不同的場(chǎng)景制定專(zhuān)門(mén)的診斷策略,靈活可拓展。策略之外,我們有對(duì)用戶(hù)的行為分析,用來(lái)展示用戶(hù)在一段時(shí)間內(nèi)的請(qǐng)求和行為。

④ 除了時(shí)序數(shù)據(jù)庫(kù)產(chǎn)生的指標(biāo),我們會(huì)將部分需要聚合的指標(biāo)存入Clickhouse,這樣能支持更多維度的實(shí)施聚合,對(duì)監(jiān)控能力作補(bǔ)充,保證日志采集和深度分析質(zhì)量。
在日志都上報(bào)的情況下,該思路覆蓋了常規(guī)開(kāi)發(fā)操作所能想到的問(wèn)題。不斷的補(bǔ)充策略會(huì)讓深度分析更智能。
4
圖11 整體架構(gòu)設(shè)計(jì)
目前在打通客戶(hù)端和后臺(tái)鏈路的基礎(chǔ)上,兼容不同系統(tǒng)架構(gòu)和后臺(tái)服務(wù)實(shí)現(xiàn),各個(gè)流程自動(dòng)化,單條業(yè)務(wù)線(xiàn)采集OPS高峰在每秒幾十萬(wàn),Hikv數(shù)據(jù)量在幾T(壓縮后平均數(shù)據(jù)長(zhǎng)度不到1k),ES每小時(shí)數(shù)據(jù)量在幾百G左右(總量看保存多少小時(shí)),Hbase一天落地日志量幾十T。鏈路、指標(biāo)、日志采集和深度分析均達(dá)到準(zhǔn)時(shí)。
① 統(tǒng)一的指標(biāo)監(jiān)控
② 豐富的報(bào)警機(jī)制
③ 報(bào)警的根因定位
④ 資源的擴(kuò)容分析
⑤ 日志的自動(dòng)分析
⑥ 跨機(jī)房的調(diào)用檢測(cè)
5
自愛(ài)奇藝全鏈路自動(dòng)化監(jiān)控平臺(tái)上線(xiàn)以來(lái),填補(bǔ)移動(dòng)端在鏈路監(jiān)控上的空白,擴(kuò)大了可監(jiān)控的范圍,提高了問(wèn)題定位效率,從鏈路的角度保障移動(dòng)端的整體服務(wù)質(zhì)量。通過(guò)統(tǒng)一技術(shù)規(guī)范,目前全鏈路是公司微服務(wù)參考架構(gòu)的一部分。通過(guò)自動(dòng)識(shí)別依賴(lài)關(guān)系,使鏈路可視化,能夠分鐘級(jí)的聚合指標(biāo)和報(bào)警,及時(shí)發(fā)現(xiàn)故障點(diǎn)和其中的依賴(lài)。通過(guò)基于規(guī)則引擎的自動(dòng)化分析,解決錯(cuò)誤日志存儲(chǔ)時(shí)間短導(dǎo)致無(wú)法定位的問(wèn)題,錯(cuò)誤日志查找效率提升50%以上,提高了客訴響應(yīng)速度。并且調(diào)用鏈路的分析,精準(zhǔn)輔助發(fā)現(xiàn)鏈路性能瓶頸進(jìn)行優(yōu)化,提升整體架構(gòu)質(zhì)量。
未來(lái),我們會(huì)在當(dāng)前基礎(chǔ)上,加入全鏈路壓測(cè)(普通壓測(cè)基本是單系統(tǒng)壓測(cè))的功能,使系統(tǒng)具備線(xiàn)上壓測(cè)和模擬壓測(cè)的能力,提前感知系統(tǒng)負(fù)載能力,使系統(tǒng)的資源伸縮智能化,以應(yīng)對(duì)假期或者熱劇等突發(fā)流量。

掃碼助手小姐姐微信,進(jìn)群大廠(chǎng)內(nèi)推&大佬技術(shù)交流



