java應用監(jiān)控之CAT簡介

CAT簡介

CAT 是基于 Java 開發(fā)的實時應用監(jiān)控平臺铐懊,為美團點評提供了全面的實時監(jiān)控告警服務(wù)腊瑟。開源地址:https://github.com/dianping/cat/

CAT

作為服務(wù)端項目基礎(chǔ)組件凶朗,提供了 Java, C/C++, Node.js, Python, Go

等多語言客戶端,已經(jīng)在美團點評的基礎(chǔ)架構(gòu)中間件框架(MVC框架,RPC框架,數(shù)據(jù)庫框架祸泪,緩存框架等,消息隊列藤树,配置系統(tǒng)等)深度集成浴滴,為美團點評各業(yè)務(wù)線提供系統(tǒng)豐富的性能指標、健康狀況岁钓、實時告警等升略。

CAT

很大的優(yōu)勢是它是一個實時系統(tǒng),CAT

大部分系統(tǒng)是分鐘級統(tǒng)計屡限,但是從數(shù)據(jù)生成到服務(wù)端處理結(jié)束是秒級別品嚣,秒級定義是48分鐘40秒,基本上看到48分鐘38秒數(shù)據(jù)钧大,整體報表的統(tǒng)計粒度是分鐘級翰撑;第二個優(yōu)勢,監(jiān)控數(shù)據(jù)是全量統(tǒng)計啊央,客戶端預計算眶诈;鏈路數(shù)據(jù)是采樣計算。

Cat 產(chǎn)品價值

減少故障發(fā)現(xiàn)時間降低故障定位成本輔助應用程序優(yōu)化

Cat 優(yōu)勢

實時處理:信息的價值會隨時間銳減瓜饥,尤其是事故處理過程中全量數(shù)據(jù):全量采集指標數(shù)據(jù)逝撬,便于深度分析故障案例高可用:故障的還原與問題定位,需要高可用監(jiān)控來支撐故障容忍:故障不影響業(yè)務(wù)正常運轉(zhuǎn)乓土、對業(yè)務(wù)透明高吞吐:海量監(jiān)控數(shù)據(jù)的收集宪潮,需要高吞吐能力做保證可擴展:支持分布式、跨 IDC 部署趣苏,橫向擴展的監(jiān)控系統(tǒng)

cat監(jiān)控模型

Transaction 適合記錄跨越系統(tǒng)邊界的程序訪問行為,比如遠程調(diào)用狡相,數(shù)據(jù)庫調(diào)用,也適合執(zhí)行時間較長的業(yè)務(wù)邏輯監(jiān)控食磕,Transaction用來記錄一段代碼的執(zhí)行時間和次數(shù)尽棕。Event 用來記錄一件事發(fā)生的次數(shù),比如記錄系統(tǒng)異常彬伦,它和transaction相比缺少了時間的統(tǒng)計萄金,開銷比transaction要小。Heartbeat 表示程序內(nèi)定期產(chǎn)生的統(tǒng)計信息, 如CPU利用率, 內(nèi)存利用率, 連接池狀態(tài), 系統(tǒng)負載等媚朦。Metric 用于記錄業(yè)務(wù)指標氧敢、指標可能包含對一個指標記錄次數(shù)、記錄平均值询张、記錄總和孙乖,業(yè)務(wù)指標最低統(tǒng)計粒度為1分鐘。

消息樹

CAT監(jiān)控系統(tǒng)將每次URL、Service的請求內(nèi)部執(zhí)行情況都封裝為一個完整的消息樹唯袄、消息樹可能包括Transaction弯屈、Event、Heartbeat恋拷、Metric等信息资厉。

完整的消息樹

可視化消息樹

架構(gòu)設(shè)計

服務(wù)端單機cat-consumer的整體架構(gòu)如下:

如上圖,CAT服務(wù)端在整個實時處理中蔬顾,基本上實現(xiàn)了全異步化處理宴偿。

消息接收是基于Netty的NIO實現(xiàn)消息接收到服務(wù)端就存放內(nèi)存隊列,然后程序開啟一個線程會消費這個消息做消息分發(fā)每個消息都會有一批線程并發(fā)消費各自隊列的數(shù)據(jù)诀豁,以做到消息處理的隔離消息存儲是先存入本地磁盤窄刘,然后異步上傳到hdfs文件,這也避免了強依賴hdfs

當某個報表處理器處理來不及時候舷胜,比如Transaction報表處理比較慢娩践,可以通過配置支持開啟多個Transaction處理線程,并發(fā)消費消息烹骨。

實時分析

CAT服務(wù)端實時報表分析是整個監(jiān)控系統(tǒng)的核心翻伺,CAT重客戶端采集的是是原始的Logview,目前一天大約有3000億的消息沮焕,所以需要在這些消息基礎(chǔ)上實現(xiàn)豐富報表穆趴,以支持業(yè)務(wù)問題以及性能分析的需要。

CAT根據(jù)日志消息的特點(比如只讀特性)和問題場景遇汞,量身定做的。CAT將所有的報表按消息的創(chuàng)建時間簿废,一小時為單位分片空入,那么每小時就產(chǎn)生一個報表。當前小時報表的所有計算都是基于內(nèi)存的族檬,用戶每次請求即時報表得到的都是最新的實時結(jié)果歪赢。對于歷史報表,因為它是不變的单料,所以就實時不實時也就無所謂了埋凯。

CAT基本上所有的報表模型都可以增量計算,它可以分為:計數(shù)扫尖、計時和關(guān)系處理三種白对。計數(shù)又可以分為兩類:算術(shù)計數(shù)和集合計數(shù)。典型的算術(shù)計數(shù)如:總個數(shù)(count)换怖,總和(sum)甩恼,均值(avg),最大/最小(max/min)条摸,吞吐(tps)和標準差(std)等悦污,其他都比較直觀,標準差稍微復雜一點钉蒲,大家自己可以推演一下怎么做增量計算切端。那集合運算,比如95線(表示95%請求的完成時間)顷啼,999線(表示99.9%請求的完成時間)踏枣,則稍微復雜一些,系統(tǒng)開銷也更大一點线梗。

報表建模

CAT每個報表往往有多個維度椰于,以transaction報表為例,它有5個維度仪搔,分別是應用瘾婿、機器、Type烤咧、Name和分鐘級分布情況偏陪。如果全維度建模,雖然靈活煮嫌,但開銷將會非常之大笛谦。CAT選擇固定維度建模,可以理解成將這5個維度組織成深度為5的樹昌阿,訪問時總是從根開始饥脑,逐層往下進行。

CAT服務(wù)端為每個報表單獨分配一個線程懦冰,所以不會有鎖的問題灶轰,所有報表模型都是非線程安全的,其數(shù)據(jù)是可變的刷钢。這樣帶來的好處是簡單且低開銷笋颤。

CAT報表建模是使用自研的maven plugin自動生成的。所有報表是可合并和裁剪的内地,可以輕易地將2個或多個報表合并成一個報表伴澄。在報表處理代碼中,CAT大量使用訪問者模式(visitor pattern)阱缓。

性能分析報表

故障發(fā)現(xiàn)報表

實時業(yè)務(wù)指標監(jiān)控 :核心業(yè)務(wù)都會定義自己的業(yè)務(wù)指標非凌,這不需要太多,主要用于24小時值班監(jiān)控荆针,實時發(fā)現(xiàn)業(yè)務(wù)指標問題清焕,圖中一個是當前的實際值并蝗,一個是基準值,基準值是根據(jù)歷史趨勢計算的預測值秸妥。如下圖就是當時出故障滚停,直觀看到支付業(yè)務(wù)出問題的故障。系統(tǒng)報錯大盤實時數(shù)據(jù)庫大盤粥惧、服務(wù)大盤键畴、緩存大盤等

存儲設(shè)計

CAT系統(tǒng)的存儲主要有兩塊

CAT的報表的存儲CAT原始logview的存儲

報表是根據(jù)logview實時運算出來的給業(yè)務(wù)分析用的報表,默認報表有小時模式突雪,天模式起惕,周模式以及月模式。CAT實時處理報表都是產(chǎn)生小時級別統(tǒng)計咏删,小時級報表中會帶有最低分鐘級別粒度的統(tǒng)計惹想。天、周督函、月等報表都是在小時級別報表合并的結(jié)果報表嘀粱。

原始logview存儲一天大約300TB的數(shù)據(jù)量,因為數(shù)據(jù)量比較大所以存儲必須要要壓縮辰狡,原始logview需要根據(jù)messageId讀取锋叨。在這樣的情況下,存儲整體要求就是批量壓縮以及隨機讀宛篇。在當時場景下娃磺,并沒有特別合適成熟的系統(tǒng)以支持這樣的特性,所以我們開發(fā)了一種基于文件的存儲以支持CAT的場景叫倍,在存儲上一直是最難的問題偷卧,我們一直在這塊持續(xù)的改進和優(yōu)化。

消息ID的設(shè)計

CAT每個消息都有一個唯一的ID吆倦,這個ID在客戶端生成听诸,后續(xù)CAT都通過這個ID在進行消息內(nèi)容的查找。比如在分布式調(diào)用里面逼庞,RPC消息需要串起來,比如A調(diào)用B的時候瞻赶,在A這端生成一個MessageId赛糟,在A調(diào)用B的過程中,將MessageId作為調(diào)用傳遞到B端砸逊,在B執(zhí)行過程中璧南,B用context傳遞的MessageId作為當前監(jiān)控消息的MessageId。

CAT消息的MessageId格式ShopWeb-0a010680-375030-2师逸,CAT消息一共分為四段

第一段是應用名shop-web第二段是當前這臺機器的ip的16進制格式司倚,01010680表示10.1.6.108第三段的375030,是系統(tǒng)當前時間除以小時得到的整點數(shù)第四段的2,是表示當前這個客戶端在當前小時的順序遞增號

存儲數(shù)據(jù)的設(shè)計

消息存儲是CAT最有挑戰(zhàn)的部分动知。關(guān)鍵問題是消息數(shù)量多且大皿伺,目前美團點評每天處理消息3000億左右,大小大約300TB盒粮,單物理機每秒要處理200MB左右的流量鸵鸥。CAT服務(wù)端基于此流量做實時計算,還需要將這些數(shù)據(jù)壓縮后寫入磁盤丹皱。

整體存儲結(jié)構(gòu)如下圖

CAT數(shù)據(jù)文件分為兩種妒穴,一類是index文件,一類是Data文件

data文件是分段GZIP壓縮摊崭,每個分段大小小于64K讼油,這樣可以用16bits可以表示一個最大分段地址一個MessageId都用需要48bits的空間大小來存索引,索引根據(jù)MessageId的第四段來確定索引的位置呢簸,比如消息MessageId為ShopWeb-0a010680-375030-2矮台,這條消息ID對應的索引位置為2*48bits的位置48bits前面32bits存數(shù)據(jù)文件的塊偏移地址,后面16bits存數(shù)據(jù)文件解壓之后的塊內(nèi)地址偏移CAT讀取消息的時候阔墩,首先根據(jù)MessageId的前面三段確定唯一的索引文件嘿架,在根據(jù)MessageId第四段確定此MessageId索引位置,根據(jù)索引文件的48bits讀取數(shù)據(jù)文件的內(nèi)容啸箫,然后將數(shù)據(jù)文件進行GZIP解壓耸彪,在根據(jù)塊內(nèi)偏移地址讀取出真正的消息內(nèi)容。

服務(wù)端設(shè)計總結(jié)

CAT在分布式實時方面忘苛,主要歸結(jié)于以下幾點因素:

去中心化蝉娜,數(shù)據(jù)分區(qū)處理基于日志只讀特性,以一個小時為時間窗口扎唾,實時報表基于內(nèi)存建模和分析召川,歷史報表通過聚合完成基于內(nèi)存隊列,全面異步化胸遇,單線程化荧呐,無鎖設(shè)計全局消息ID,數(shù)據(jù)本地化生產(chǎn)纸镊,集中式存儲組件化倍阐、服務(wù)化理念

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逗威,隨后出現(xiàn)的幾起案子峰搪,更是在濱河造成了極大的恐慌,老刑警劉巖凯旭,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概耻,死亡現(xiàn)場離奇詭異使套,居然都是意外死亡,警方通過查閱死者的電腦和手機鞠柄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門侦高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人春锋,你說我怎么就攤上這事矫膨。” “怎么了期奔?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵侧馅,是天一觀的道長。 經(jīng)常有香客問我呐萌,道長馁痴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任肺孤,我火速辦了婚禮罗晕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赠堵。我一直安慰自己小渊,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布茫叭。 她就那樣靜靜地躺著酬屉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揍愁。 梳的紋絲不亂的頭發(fā)上呐萨,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音莽囤,去河邊找鬼谬擦。 笑死,一個胖子當著我的面吹牛朽缎,可吹牛的內(nèi)容都是我干的惨远。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼话肖,長吁一口氣:“原來是場噩夢啊……” “哼北秽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狼牺,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡儿,失蹤者是張志新(化名)和其女友劉穎礼患,沒想到半個月后是钥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠归,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年悄泥,在試婚紗的時候發(fā)現(xiàn)自己被綠了虏冻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡弹囚,死狀恐怖厨相,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸥鹉,我是刑警寧澤蛮穿,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站毁渗,受9級特大地震影響践磅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灸异,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一府适、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肺樟,春花似錦檐春、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹦狂,卻和暖如春誓篱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凯楔。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工窜骄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摆屯。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓邻遏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虐骑。 傳聞我的和親對象是個殘疾皇子准验,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容