個(gè)人專題目錄
實(shí)現(xiàn)全鏈路監(jiān)控
SkyWalking
https://github.com/apache/skywalking
SkyWalking是apache基金會下面的一個(gè)開源APM項(xiàng)目,為微服務(wù)架構(gòu)和云原生架構(gòu)系統(tǒng)設(shè)計(jì)扔役。它通過探針自動收集所需的指標(biāo)帆喇,并進(jìn)行分布式追蹤。通過這些調(diào)用鏈路以及指標(biāo)亿胸,Skywalking APM會感知
應(yīng)用間關(guān)系和服務(wù)間關(guān)系坯钦,并進(jìn)行相應(yīng)的指標(biāo)統(tǒng)計(jì)。Skywalking支持鏈路追蹤和監(jiān)控應(yīng)用組件基本涵蓋
主流框架和容器侈玄,如國產(chǎn)RPC Dubbo和motan等婉刀,國際化的spring boot,spring cloud序仙。SkyWalking 是針對分布式系統(tǒng)的 APM 系統(tǒng)突颊,也被稱為分布式追蹤系統(tǒng)
- 全自動探針監(jiān)控,不需要修改應(yīng)用程序代碼潘悼。查看支持的中間件和組件庫列表:https://github.com/apache/incubator-skywalking
- 支持手動探針監(jiān)控, 提供了支持 OpenTracing 標(biāo)準(zhǔn)的SDK律秃。覆蓋范圍擴(kuò)大到 OpenTracing-Java 支持的組件。查看OpenTracing組件支持列表:https://github.com/opentracing-contrib/meta
- 自動監(jiān)控和手動監(jiān)控可以同時(shí)使用治唤,使用手動監(jiān)控彌補(bǔ)自動監(jiān)控不支持的組件棒动,甚至私有化組件。
- 純 Java 后端分析程序宾添,提供 RESTful 服務(wù)船惨,可為其他語言探針提供分析能力。
- 高性能純流式分析
- 支持多種插件缕陕,UI功能較強(qiáng)粱锐,接入端無代碼侵入。
Zipkin
https://github.com/openzipkin/zipkin
由Twitter公司開源扛邑,開放源代碼分布式的跟蹤系統(tǒng)卜范,用于收集服務(wù)的定時(shí)數(shù)據(jù),以解決微服務(wù)架構(gòu)中的延遲問題鹿榜,包括:數(shù)據(jù)的收集海雪、存儲、查找和展現(xiàn)舱殿。特點(diǎn)是輕量奥裸,使用部署簡單。通過Java程序中引入客戶端沪袭,可隱式攔截Http湾宙、Thrift等形式服務(wù)調(diào)用樟氢。通過Http、Kafka侠鳄、Scribe等方式同步監(jiān)控?cái)?shù)據(jù)到服務(wù)端埠啃,ZipKin帶有Web UI,但沒有告警功能伟恶。
Pinpoint
https://github.com/naver/pinpoint
一款對Java編寫的大規(guī)模分布式系統(tǒng)的APM工具碴开,由韓國人開源的分布式跟蹤組件。特點(diǎn)是支持多種插件博秫,UI功能強(qiáng)大潦牛,接入端無代碼侵入。
CAT
https://github.com/dianping/cat
CAT是大眾點(diǎn)評開源的基于編碼和配置的調(diào)用鏈分析挡育,應(yīng)用監(jiān)控分析巴碗,日志采集,監(jiān)控報(bào)警等一系列的監(jiān)控平臺工具即寒。支持JVM性能數(shù)據(jù)采集橡淆、服務(wù)Trace、告警等功能母赵,但需要寫監(jiān)控代碼明垢。
維度 | Cat | Zipkin | PinPoint | Skywalking |
---|---|---|---|---|
實(shí)現(xiàn)方式 | 代碼埋點(diǎn)(攔截器,注解市咽,過濾器等) | 攔截請求,發(fā)送(HTTP抵蚊,MQ)數(shù)據(jù)至Zipkin服務(wù) | Java探針施绎,字節(jié)碼增強(qiáng) | Java探針,字節(jié)碼增強(qiáng) |
接入方式 | 代碼侵入 | 基于Linkerd或者Sleuth方式贞绳,引入配置即可 | JavaAgent字節(jié)碼谷醉,高并發(fā)情況下,代理對吞吐量的影響比skywalking和zipkin都大 | JavaAgent字節(jié)碼冈闭,支持20+的中間件俱尼、框架、類庫 |
agent到collector的協(xié)議 | http/tcp | http,MQ | thrift | gRPC |
可擴(kuò)展性 | 水平擴(kuò)展服務(wù)端 | 多個(gè)zipkin-Server實(shí)例進(jìn)行異步消費(fèi)mq中的監(jiān)控信息 | collector+web+agent+存儲萎攒,使得能夠水平擴(kuò)展以便支持大規(guī)模服務(wù)器集群遇八。 | OAP(skywalking6.x才有OAP這個(gè)概念,skywalking5.x叫collector)+Web+agent+存儲+zk,使得能夠水平擴(kuò)展以便支持大規(guī)模服務(wù)器集群。 |
數(shù)據(jù)存儲 | Mysql,Hdfs | ES太颤,mysql,Cassandra | Hbase(RowKey精確查找裆悄,SCAN范圍查找,全表掃描),Mysql | ES校辩,H2坑雅,Mysql昨忆,TiDB读规,Sharding-Sphere |
分析粒度 | 代碼級抓督,全局調(diào)用統(tǒng)計(jì),報(bào)警束亏,JVM監(jiān)控 | 接口級铃在,支持traceid查詢 | 方法級,全局調(diào)用統(tǒng)計(jì)枪汪、報(bào)警 | 方法級涌穆,全局調(diào)用統(tǒng)計(jì)、traceid查詢雀久,報(bào)警宿稀,JVM監(jiān)控 |
調(diào)用鏈可視化 | 有 | 有 | 有 | 有 |
報(bào)表 | 豐富 | 少 | 中 | 中 |
調(diào)用鏈應(yīng)用拓?fù)?/td> | 簡單,僅限于服務(wù)與服務(wù)之間 | 簡單赖捌,僅限于服務(wù)與服務(wù)之間 | 好 | 好 |
埋點(diǎn)方式 | 侵入 | 侵入 | 無侵入 | 無侵入 |
Heartbeat支持 | 有 | 無 | 有 | 有 |
Metric支持 | 有 | 無 | 無 | 有 |
是否支持webflux | 否 | 是 | 是 | 是 |
客戶端支持 | Java祝沸、C/C++、Node.js越庇、Python | java | Java,php | Java, C#, PHP, Node.js, Go |
中文支持 | 好 | 無 | 無 | 好 |
社區(qū)支持 | 好 | 好 | 一般 | 好 |
國內(nèi)案例 | 美團(tuán)罩锐、攜程、陸金所等等 | 京東卤唉,阿里定制后不開源 | 暫無 | 阿里涩惑,小米,滴滴桑驱,華為竭恬、當(dāng)當(dāng)?shù)鹊?/td> |
社區(qū)活躍度(截止2020-2) | 12.7k | 12.5k | 9.9k | 12.3k |
社區(qū)活躍度(截止2019-12 | 12.3K | 12.2K | 11.8K | |
社區(qū)活躍度(截止2018-5) | 4.9k | 8.4k | 5.9k | 3.3k |
字節(jié)碼注入 vs API 調(diào)用
Pinpoint 實(shí)現(xiàn)了基于字節(jié)碼注入的 Java Agent 探針,而 Zipkin 的 Brave 框架僅僅提供了應(yīng)用層面的 API熬的,但是細(xì)想問題遠(yuǎn)不那么簡單痊硕。字節(jié)碼注入是一種簡單粗暴的解決方案,理論上來說無論任何方法調(diào)用押框,都可以通過注入代碼的方式實(shí)現(xiàn)攔截岔绸,也就是說沒有實(shí)現(xiàn)不了的,只有不會實(shí)現(xiàn)的橡伞。但 Brave 則不同盒揉,其提供的應(yīng)用層面的 API 還需要框架底層驅(qū)動的支持,才能實(shí)現(xiàn)攔截兑徘。
全鏈路監(jiān)控大數(shù)據(jù)解決方案
全鏈路監(jiān)控特質(zhì)
低侵入性
監(jiān)控系統(tǒng)應(yīng)盡可能減少對業(yè)務(wù)系統(tǒng)的侵入预烙,保持對使用方的透明性,減少開發(fā)人員的負(fù)擔(dān)道媚,降低接入門檻和難度扁掸。對于應(yīng)用的程序員來說翘县,是不需要知道有跟蹤系統(tǒng)這回事的。如果一個(gè)跟蹤系統(tǒng)想生效谴分,就必須需要依賴應(yīng)用的開發(fā)者主動配合锈麸,那么這個(gè)跟蹤系統(tǒng)也太脆弱了,往往由于跟蹤系統(tǒng)在應(yīng)用中植入代碼的bug或疏忽導(dǎo)致應(yīng)用出問題牺蹄,這樣才是無法滿足對跟蹤系統(tǒng)“無所不在的部署”這個(gè)需求忘伞。
低性能影響
由于全鏈路監(jiān)控系統(tǒng)需要對各種應(yīng)用中間件進(jìn)行日志數(shù)據(jù)采集,大多都需要在業(yè)務(wù)系統(tǒng)內(nèi)進(jìn)行“埋點(diǎn)”或放置agent沙兰,一般都是在核心業(yè)務(wù)流程氓奈。在一些高度優(yōu)化過的服務(wù),即使一點(diǎn)點(diǎn)損耗也會很容易察覺到鼎天,而且有可能迫使在線服務(wù)的部署團(tuán)隊(duì)不得不將跟蹤系統(tǒng)關(guān)停舀奶。
因此應(yīng)盡可能降低對業(yè)務(wù)系統(tǒng)造成的性能影響,一般來說斋射,對CPU的耗用低于2%可以作為一個(gè)參考閾值育勺。
靈活全面的接入策略
為了盡可能降低接入成本,應(yīng)該提供靈活的監(jiān)控配置策略罗岖,讓業(yè)務(wù)方?jīng)Q定是否接入涧至,以及收集數(shù)據(jù)的范圍和粒度,并提供對應(yīng)的技術(shù)方案保障監(jiān)控策略生效桑包。
時(shí)效性
實(shí)時(shí)有效的監(jiān)控?cái)?shù)據(jù)展示功能南蓬,幫助相關(guān)人員理解系統(tǒng)行為,為流程哑了、架構(gòu)赘方、代碼優(yōu)化,以及擴(kuò)容縮容垒手、服務(wù)限流降級提供正確客觀的數(shù)據(jù)參考。
可擴(kuò)展性
一個(gè)優(yōu)秀的調(diào)用跟蹤系統(tǒng)必須支持分布式部署倒信,具備良好的可擴(kuò)展性科贬。能夠支持的組件越多當(dāng)然越好”钣疲或者提供便捷的插件開發(fā)API榜掌,對于一些沒有監(jiān)控到的組件,應(yīng)用開發(fā)者也可以根據(jù)需要自行擴(kuò)展乘综。
全鏈路監(jiān)控功能模塊
一般的全鏈路監(jiān)控系統(tǒng)憎账,大致可分為四大功能模塊:
埋點(diǎn)與生成日志
埋點(diǎn)即系統(tǒng)在當(dāng)前節(jié)點(diǎn)的上下文信息,可以分為 客戶端埋點(diǎn)卡辰、服務(wù)端埋點(diǎn)胞皱,以及客戶端和服務(wù)端雙向型埋點(diǎn)邪意。埋點(diǎn)日志通常要包含以下內(nèi)容traceId、spanId反砌、調(diào)用的開始時(shí)間雾鬼,協(xié)議類型、調(diào)用方ip和端口宴树,請求的服務(wù)名策菜、調(diào)用耗時(shí),調(diào)用結(jié)果酒贬,異常信息等又憨,同時(shí)預(yù)留可擴(kuò)展字段,為下一步擴(kuò)展做準(zhǔn)備;
收集和存儲日志
主要支持分布式日志采集的方案锭吨,同時(shí)增加MQ作為緩沖;
每個(gè)機(jī)器上有一個(gè) deamon 做日志收集蠢莺,業(yè)務(wù)進(jìn)程把自己的Trace發(fā)到daemon,daemon把收集Trace往上一級發(fā)送;
多級的collector耐齐,類似pub/sub架構(gòu)浪秘,可以負(fù)載均衡;
對聚合的數(shù)據(jù)進(jìn)行 實(shí)時(shí)分析和離線存儲;
離線分析 需要將同一條調(diào)用鏈的日志匯總在一起;
分析和統(tǒng)計(jì)調(diào)用鏈路數(shù)據(jù),以及時(shí)效性
調(diào)用鏈跟蹤分析:把同一TraceID的Span收集起來埠况,按時(shí)間排序就是timeline耸携。把ParentID串起來就是調(diào)用棧。
拋異吃玻或者超時(shí)夺衍,在日志里打印TraceID。利用TraceID查詢調(diào)用鏈情況喜命,定位問題沟沙。
依賴度量:
- 強(qiáng)依賴:調(diào)用失敗會直接中斷主流程
- 高度依賴:一次鏈路中調(diào)用某個(gè)依賴的幾率高
- 頻繁依賴:一次鏈路調(diào)用同一個(gè)依賴的次數(shù)多
離線分析:按TraceID匯總,通過Span的ID和ParentID還原調(diào)用關(guān)系壁榕,分析鏈路形態(tài)矛紫。
實(shí)時(shí)分析:對單條日志直接分析,不做匯總牌里,重組颊咬。得到當(dāng)前QPS,延遲牡辽。
全鏈路監(jiān)控系統(tǒng)希望達(dá)到的效果
請求鏈路追蹤喳篇,故障快速定位
可以通過調(diào)用鏈結(jié)合業(yè)務(wù)日志快速定位錯(cuò)誤原因。
可視化
記錄各個(gè)階段耗時(shí)态辛,進(jìn)行性能分析麸澜。
依賴優(yōu)化
統(tǒng)計(jì)各個(gè)調(diào)用環(huán)節(jié)的可用性、梳理服務(wù)依賴關(guān)系以及優(yōu)化奏黑。
數(shù)據(jù)分析炊邦,鏈路梳理和優(yōu)化
分析用戶的行為路徑编矾,梳理和優(yōu)化整體調(diào)用鏈路。
本文參考:
(一文搞懂全鏈路監(jiān)控:方案概述與比較)https://cloud.tencent.com/developer/article/1501891
(APM巔峰對決:skywalking P.K. Pinpoint)https://skywalking.apache.org/zh/blog/2019-02-24-skywalking-pk-pinpoint.html
(開源APM之Skywalking和Pinpoint的實(shí)測對比)http://blog.zollty.com/b/archive/apm-comparison-of-skywalking-and-pinpiont.html