All in one:如何搭建端到端可觀測體系
可觀測的前生今世
Cloud Native
系統(tǒng)的可觀測與故障可分析作為系統(tǒng)運維中重要的衡量標(biāo)準(zhǔn),隨著系統(tǒng)在架構(gòu)、資源單位、資源獲取方式、通信方式演進過程,遇到了巨大挑戰(zhàn)。而這些挑戰(zhàn),也在倒逼著運維相關(guān)技術(shù)發(fā)展。在正式開始今天的內(nèi)容前,我們來講講可觀測的前世今生,縱觀整個運維監(jiān)控發(fā)展歷程,監(jiān)控與可觀測已經(jīng)發(fā)展了近 30 年。
上世紀(jì) 90 年代末,隨著計算從大機(mainframe)逐漸轉(zhuǎn)移到桌面電腦,client-server 架構(gòu)的應(yīng)用開始盛行,大家開始關(guān)注網(wǎng)絡(luò)性能和主機資源。為了更好的監(jiān)控這種 CS 的應(yīng)用,第一代 APM 軟件誕生。運維團隊在這一時期看重與網(wǎng)絡(luò)性能、主機性能,因為此時的應(yīng)用架構(gòu)還非常簡單。此時,我們還稱這些工具為監(jiān)控工具。
監(jiān)控 & APM & 可觀測的認(rèn)知同異
Cloud Native
從上述歷程,我們可以看到從監(jiān)控到 APM 到可觀測是個不斷演進的過程。接下來,我們講講這三者之間的具體關(guān)系。為了更好的講解,這里先引入一個經(jīng)典認(rèn)知模型。對于世界萬物,我們通常會按照“知不知道”(awareness)以及“理不理解”(understanding)兩個維度進行劃分,即“感知”與“理解”。
.
建設(shè)可觀測體系關(guān)鍵要點
Cloud Native
可觀測能力帶來了巨大業(yè)務(wù)價值的同時,也帶來了不小的系統(tǒng)建設(shè)挑戰(zhàn)。這不僅僅是工具或技術(shù)的選型,更是一種運維理念。這其中包括可觀測數(shù)據(jù)的采集、分析以及價值輸出三個部分。
1)全棧覆蓋
基礎(chǔ)層、容器層、上方組建云服務(wù)應(yīng)用,以及用戶終端相應(yīng)可觀測數(shù)據(jù)以及與之對應(yīng)的指標(biāo)、鏈路、事件都需要被采集。
整個業(yè)界都在推進標(biāo)準(zhǔn)統(tǒng)一,首先是指標(biāo)(metrics),Prometheus作為云原生時代的指標(biāo)數(shù)據(jù)標(biāo)準(zhǔn)已經(jīng)形成了共識;鏈路數(shù)據(jù)的標(biāo)準(zhǔn)也隨著 OpenTracing 和 OpenTelemetry 的推行而逐漸占據(jù)主流;在日志領(lǐng)域雖然其數(shù)據(jù)的結(jié)構(gòu)化程度較低難以形成數(shù)據(jù)的標(biāo)準(zhǔn),但在采集存儲和分析側(cè)也涌現(xiàn)了 Fluentd,Loki 等開源新秀;另一方面,Grafana 作為各種可觀測數(shù)據(jù)的展示標(biāo)準(zhǔn)也愈加明朗。
數(shù)據(jù)質(zhì)量作為容易忽視的重要部分,一方面,不同監(jiān)控系統(tǒng)的數(shù)據(jù)源需要進行數(shù)據(jù)標(biāo)準(zhǔn)的定義,確保分析的準(zhǔn)確性。另一方面,同個事件可能導(dǎo)致大量重復(fù)指標(biāo)、告警、日志等。通過過濾、降噪和聚合,把具備分析價值的數(shù)據(jù)進行分析,保證數(shù)據(jù)質(zhì)量的重要組成部分。這也往往是開源工具與商業(yè)化工具差距相對較大的地方。舉個簡單例子,當(dāng)我們采集一條應(yīng)用的調(diào)用鏈路,到底采集多深?調(diào)用鏈路采樣的策略是什么樣的?發(fā)生錯、慢時是不是能夠全部采下來?是不是能夠基于一定規(guī)則對采樣策略進行動態(tài)調(diào)整等等,都決定了可觀測數(shù)據(jù)采集的質(zhì)量。
2
可觀測數(shù)據(jù)分析
1)橫縱關(guān)聯(lián)
在目前的可觀測體系里,應(yīng)用是非常好的分析切入角度。首先,應(yīng)用與應(yīng)用之間是相互關(guān)聯(lián),可以通過調(diào)用鏈關(guān)聯(lián)起來。其中包括微服務(wù)之間是如何調(diào)用,應(yīng)用與云服務(wù)以及三方組件如何調(diào)用,都可以通過鏈路進行關(guān)聯(lián)。同時,應(yīng)用與容器層、資源層也可進行垂直映射。以應(yīng)用為中心,通過橫向縱向形成全局可觀測數(shù)據(jù)關(guān)聯(lián)。當(dāng)出現(xiàn)問題需要進行定位時,能夠從應(yīng)用角度進行統(tǒng)一分析。
2)領(lǐng)域知識
面對海量數(shù)據(jù),如何更快速的發(fā)現(xiàn)問題,更準(zhǔn)確定位問題。除了通過以應(yīng)用為中心的數(shù)據(jù)關(guān)聯(lián),還需要去定位分析問題的領(lǐng)域知識。對于可觀測工具或產(chǎn)品而言,最重要的就是不斷累積最佳排查路徑、常見問題定位、根因的決策鏈路方法,并把相關(guān)經(jīng)驗固化下來。這相當(dāng)于為運維團隊配備經(jīng)驗豐富的運維工程師,去快速發(fā)現(xiàn)問題,定位根因。這個也是不同于傳統(tǒng)的 AIOps 能力。
3
可觀測價值輸出
上面提到可觀測需要覆蓋各個層次,每層都有相應(yīng)可觀測數(shù)據(jù)。但目前可觀測相關(guān)工具非常零散,如何將這些工具產(chǎn)生的數(shù)據(jù)統(tǒng)一展現(xiàn)出來,成了比較大挑戰(zhàn)??捎^測數(shù)據(jù)的統(tǒng)一其實是相對較難的事情,包括格式、編碼規(guī)則、字典值等問題。但數(shù)據(jù)結(jié)果統(tǒng)一呈現(xiàn)是可以做到的,目前主流的解決方案是使用 Grafana,搭建像統(tǒng)一監(jiān)控大盤。
在統(tǒng)一展現(xiàn)以及統(tǒng)一告警之后,如何借助像釘釘、企業(yè)微信等協(xié)作平臺能夠更加高效地進行問題發(fā)現(xiàn)并處理跟蹤的 ChartOps,也逐漸成為剛需。
3)云服務(wù)聯(lián)動
可觀測能力成為云原生的基礎(chǔ)設(shè)施,當(dāng)可觀測平臺在發(fā)現(xiàn)并定位問題之后,需要與各種云服務(wù)快速聯(lián)動,迅速進行擴縮容或負(fù)載均衡,從而更快的解決問題。
04
Prometheus + Grafana 實踐
Cloud Native
得益于云原生開源生態(tài)的蓬勃發(fā)展,我們可以輕而易舉地建設(shè)一套監(jiān)控體系,比如使用 Prometheus + Grafana 搭建基礎(chǔ)監(jiān)控,使用 SkyWalking 或 Jaeger 搭建追蹤系統(tǒng),使用 ELK 或 Loki 搭建日志系統(tǒng)。但對運維團隊而言,不同類型可觀測數(shù)據(jù)分散存儲在不同后端,排查問題仍需在多系統(tǒng)之間跳轉(zhuǎn),效率得不到保證?;谝陨希⒗镌埔矠槠髽I(yè)提供了一站式可觀測平臺 ARMS(應(yīng)用的實時監(jiān)控服務(wù))。ARMS 作為產(chǎn)品家族,包含了不同可觀測場景下的多款產(chǎn)品,比如:
- 針對于基礎(chǔ)架構(gòu)層,Prometheus 監(jiān)控服務(wù)對包括 ECS、VPC、容器在內(nèi)的各類云服務(wù)以及三方中間件進行監(jiān)控。
- 針對應(yīng)用層,基于阿里云自研 Java 探針的應(yīng)用監(jiān)控全面滿足應(yīng)用監(jiān)控需求。相較于開源工具,在數(shù)據(jù)質(zhì)量等方面非常大的提升。并通過鏈路追蹤,即使使用開源 SDK 或探針,也可以將數(shù)據(jù)上報到應(yīng)用監(jiān)控平臺。
- 針對用戶體驗層,通過移動監(jiān)控、前端監(jiān)控、云撥測等模塊,全面覆蓋用戶在不同終端上的體驗與性能。
- 統(tǒng)一告警,對于各層采集的數(shù)據(jù)、告警信息進行統(tǒng)一告警以及根因分析,直接通過Insight呈現(xiàn)發(fā)現(xiàn)結(jié)果。
- 統(tǒng)一界面,不管是ARMS、Prometheus的上報數(shù)據(jù),還是日志服務(wù)、ElasticSearch、MongoDB 等各種數(shù)據(jù)源,都可以通過全托管 Grafana 服務(wù)進行統(tǒng)一的數(shù)據(jù)可觀測數(shù)據(jù)呈現(xiàn),建立統(tǒng)一的監(jiān)控大盤,并與阿里云各種云服務(wù)進行聯(lián)動,提供 CloudOps 能力。
1
數(shù)據(jù)快速接入
預(yù)置數(shù)據(jù)大盤
可以看到,Grafana 雖然幫助大家把各種數(shù)據(jù)看板搭建起來,但看到的依舊是零散大盤。在日常運維過程中,還需要基于業(yè)務(wù)域或基于應(yīng)用創(chuàng)建統(tǒng)一大盤,能夠?qū)⒒A(chǔ)架構(gòu)層、容器層、應(yīng)用層、用戶終端層的數(shù)據(jù)都放到同一個大盤中進行展現(xiàn),從而實現(xiàn)整體監(jiān)控。
全棧統(tǒng)一大盤
常見的 PV、UV 數(shù)據(jù)、JS 錯誤率、首次渲染時間、API 請求成功率、TopN 頁面性能等關(guān)鍵數(shù)據(jù)都會在第一時間呈現(xiàn)。
3)容器層監(jiān)控
各個 Pod 的性能、使用情況,同時也列出這些應(yīng)用上跑的由哪些 department 創(chuàng)建的。這些 deployment 相關(guān)的 Pod 性能信息都呈現(xiàn)在這一塊。
此外,就是相關(guān)的云服務(wù)監(jiān)控,這里以消息隊列 Kafka 舉例,像消息服務(wù)常見的相關(guān)數(shù)據(jù)指標(biāo)如消費量堆積、消費量等數(shù)據(jù)。
針對整個主機節(jié)點,CPU、所運行的 Pod 等數(shù)據(jù)。
這樣子,這張大盤就覆蓋了從用戶體驗層到應(yīng)用層到基礎(chǔ)架構(gòu)容器層的整體性能監(jiān)測情況。更加重要的是整個大盤包含著所有微服務(wù)的相關(guān)數(shù)據(jù)。當(dāng)切某個服務(wù),服務(wù)相關(guān)聯(lián)的性能數(shù)據(jù)都將獨立展現(xiàn)出來。在容器、應(yīng)用、云服務(wù)等不同層面都進行過濾。這里稍微提一下是怎么做到的,當(dāng) Prometheus 監(jiān)控去采集這些云服務(wù)時,會順帶把云服務(wù)上的 tag 都采集下來。通過對 tag 進行打標(biāo),就可以把這些云服務(wù)基于不同業(yè)務(wù)維度或不同應(yīng)用進行區(qū)分。在做我們統(tǒng)一大盤的時候,一定會遇到非常多的數(shù)據(jù)源管理問題。這里我們提供了 globalview 能力,把這個用戶名下所有的 Prometheus 實例都匯聚到一起,統(tǒng)一進行查詢。不管是應(yīng)用層的信息,還是云服務(wù)的信息。