高 巍
(麒麟軟件有限公司,北京 100080)
Apple公司工程師Cindy Sridharan博文“監(jiān)控與可觀察性”(Monitoring and Observability)首次將Observability帶入開發(fā)者的視野。對軟件而言,監(jiān)控(Monitoring)與可觀測性(Observability)是2個不同的概念,監(jiān)控旨在識別系統(tǒng)是否正常運(yùn)行,可觀測性探究運(yùn)行不暢的原因。
監(jiān)視和跟蹤全棧產(chǎn)品,包括:網(wǎng)絡(luò)設(shè)備、服務(wù)器、存儲、操作系統(tǒng)、中間件、數(shù)據(jù)庫、容器和應(yīng)用的狀態(tài),設(shè)置規(guī)則庫,制定性能指標(biāo)、報警閾值,在出現(xiàn)問題后根據(jù)規(guī)則報警啟動處理流程。通過包括操作系統(tǒng)命令、SNMP、SSH、Telnet、IPM、HTTP、JMX和SMI-S等技術(shù)實現(xiàn)從底層基礎(chǔ)設(shè)施到上層應(yīng)用的全棧監(jiān)控,如圖1所示。
圖1 全棧監(jiān)控
如圖2所示,描述了對IT系統(tǒng)理解程度和可收集數(shù)據(jù)之間的關(guān)系,右側(cè)(Known Knowns和Known Unknowns)代表傳統(tǒng)監(jiān)控,稱為確定性的已知和未知,例如,基礎(chǔ)設(shè)施監(jiān)控數(shù)據(jù)(主機(jī)CPU利用率、CPU空閑率、內(nèi)存負(fù)載、進(jìn)程PID、TPS等指標(biāo)),傳統(tǒng)監(jiān)控圍繞這些確定的數(shù)據(jù)進(jìn)行分析。
但是,復(fù)雜狀況下基礎(chǔ)信息是很難描述和衡量的,如圖2所示的左上角(Unknown Knowns),我們稱之為“假設(shè)”,有經(jīng)驗的開發(fā)人員在設(shè)計應(yīng)用時,應(yīng)該對有可能出現(xiàn)的風(fēng)險做針對性性能和功能設(shè)計。“假設(shè)”未必一定發(fā)生,但到出事的時候,設(shè)計失誤就會變成Unknown Unknowns(意外)。所以有經(jīng)驗的開發(fā)人員能通過蛛絲馬跡證實自己的推測,通過不斷分析將Unknown Unknowns的范圍變小,更合理的做法是通過技術(shù)手段描繪系統(tǒng)更全面的狀態(tài)。近幾年發(fā)展趨勢是將系統(tǒng)的可觀測性放在一個更高的位置,監(jiān)控只是可觀測性的一個子集。
圖2 可觀測演進(jìn)
APM(Application Performance Management)致 力于監(jiān)控管理應(yīng)用程序性能和功能,主要通過探針形式采集和測量應(yīng)用程序端性能指標(biāo)。顯然,APM這種方式會占用大量資源(網(wǎng)絡(luò)帶寬、算力)。在實際工作中也可使用撥測技術(shù),撥測技術(shù)源自呼叫中心通信系統(tǒng)的閉環(huán)測試,暨模擬用戶的業(yè)務(wù)操作過程,獲得完成業(yè)務(wù)操作過程的性能、功能和結(jié)果數(shù)據(jù),現(xiàn)在發(fā)展到可以對應(yīng)用接口、業(yè)務(wù)流程等進(jìn)行監(jiān)測。
AIOps(Artificial Intelligence for IT Operations)是指通過人工智能機(jī)器學(xué)習(xí)技術(shù)提升運(yùn)維效率,通過運(yùn)維知識庫、智能算法庫等建設(shè)有效地解決運(yùn)維工作中的人力成本和效率問題。但在復(fù)雜場景下的故障定位、故障診斷、趨勢預(yù)測和場景編排中,智能運(yùn)維技術(shù)在定位預(yù)測方面有待進(jìn)一步提高。
eBPF起源于Linux內(nèi)核,可以運(yùn)行沙箱程序,安全有效地擴(kuò)展內(nèi)核功能,無需更改內(nèi)核源代碼或加載內(nèi)核模塊。eBPF全稱“擴(kuò)展的伯克利數(shù)據(jù)包過濾器(Extended Berkeley Packet Filter)”,是一種數(shù)據(jù)包過濾技術(shù),從BPF(Berkeley Packet Filter)技術(shù)擴(kuò)展而來。BPF提供了一種在內(nèi)核事件和用戶程序事件發(fā)生時安全注入代碼的機(jī)制,這就讓非內(nèi)核開發(fā)人員也可以對內(nèi)核進(jìn)行控制。隨著Linux內(nèi)核的發(fā)展,BPF逐步從最初的數(shù)據(jù)包過濾擴(kuò)展到網(wǎng)絡(luò)、內(nèi)核、安全和跟蹤等,而且其功能特性還在快速發(fā)展。
可觀測性技術(shù)在傳統(tǒng)監(jiān)控基礎(chǔ)上采集更深入和全面的數(shù)據(jù)(排錯、剖析和依賴分析等),構(gòu)建對系統(tǒng)更為深入的認(rèn)知以降低故障平均修復(fù)時間(MTTR),延長系統(tǒng)無故障運(yùn)行時間(MTBF),提升系統(tǒng)可用性和運(yùn)維效率。為了實現(xiàn)更深入和全面的數(shù)據(jù)采集,離不開相關(guān)技術(shù)和標(biāo)準(zhǔn)規(guī)范的發(fā)展。
自Linux 4.19內(nèi)核以來,Linux社區(qū)為eBPF帶來160多個新特性和優(yōu)化改進(jìn),提升了eBPF在跟蹤分析、可觀測性、安全和網(wǎng)絡(luò)加速等場景的應(yīng)用能力。
1)跟蹤和分析:通過附加eBPF程序來跟蹤點位以及內(nèi)核與用戶應(yīng)用探針的能力,允許實現(xiàn)應(yīng)用程序和系統(tǒng)程序本身運(yùn)行時行為的不可預(yù)見條件下的可視性。通過向應(yīng)用程序端和系統(tǒng)端都提供內(nèi)省性,2種視圖能夠被有效地結(jié)合,從而向故障排解系統(tǒng)性能問題提供強(qiáng)大且獨(dú)特的洞察力。高級統(tǒng)計數(shù)據(jù)結(jié)構(gòu)允許以有效方式提取有意義的可視性數(shù)據(jù),而無需像系統(tǒng)普遍采用導(dǎo)出大量采樣數(shù)據(jù)的方式。
2)可觀測性:eBPF不依賴于操作系統(tǒng)公開的靜態(tài)計數(shù)器和計量器,支持自定義指標(biāo)的收集和內(nèi)核聚合,并基于各種可能的來源生成可見性事件。這在一定程度上擴(kuò)展可以實現(xiàn)的可見性深度,并通過僅收集所需的可見性數(shù)據(jù)且在事件源處生成直方圖和類似的數(shù)據(jù)結(jié)構(gòu)而非依賴于樣本的導(dǎo)出來顯著降低整體系統(tǒng)開銷。
3)安全:建立在識別和理解所有系統(tǒng)調(diào)用的基礎(chǔ)上,并將其與所有網(wǎng)絡(luò)操作的數(shù)據(jù)包和套接字級別視圖相結(jié)合,使得安全系統(tǒng)具備革新性的創(chuàng)新方法。eBPF能夠有效地整合可視性、資源可控性,從而在更廣泛的上下文語境中以更佳的控制水準(zhǔn)來創(chuàng)建安全系統(tǒng)操作。
4)網(wǎng)絡(luò)加速:可編程性和效率的結(jié)合使eBPF適合網(wǎng)絡(luò)解決方案的數(shù)據(jù)包處理要求。eBPF的可編程性可添加額外的協(xié)議解析器,JIT編譯器提供接近于本地編譯的內(nèi)核代碼的執(zhí)行性能。
eBPF程序由事件觸發(fā)后執(zhí)行。這些事件包括系統(tǒng)調(diào)用、內(nèi)核跟蹤點、內(nèi)核函數(shù)和用戶態(tài)函數(shù)的調(diào)用退出、網(wǎng)絡(luò)事件等,借助內(nèi)核態(tài)插樁(kprobe)和用戶態(tài)插樁(uprobe)提供可觀測性技術(shù)。本文以eBPF為抓手進(jìn)行可觀測性技術(shù)研究和探索,探索可觀測性體系化演進(jìn)和落地能力(全棧、云原生),助力運(yùn)維技術(shù)融合迭代發(fā)展。
隨著云原生技術(shù)普及,系統(tǒng)迎來新的運(yùn)維問題:微服務(wù)請求導(dǎo)致問題定位難以解決,隨著業(yè)務(wù)不斷擴(kuò)張,僅憑日志或APM性能監(jiān)控很難做到全景觀測和下鉆跟蹤,于是衍生出可觀測性的3大要素,即Logging、Metrics和Tracing。
Logging:日志展現(xiàn)的是應(yīng)用軟件運(yùn)行而產(chǎn)生的事件或者程序在執(zhí)行過程中所產(chǎn)生的一些記錄,可以詳細(xì)解釋系統(tǒng)的運(yùn)行狀態(tài)。
Metrics:指標(biāo)是一種聚合數(shù)值,其存儲空間很小,可以觀察系統(tǒng)的狀態(tài)和趨勢。
Tracing:追蹤面向的是請求,通過請求的上下文信息關(guān)聯(lián)實現(xiàn)分布式請求完整調(diào)用鏈路。
云原生計算基金會(Cloud Native Computing Foundation,以下簡稱CNCF)制定發(fā)布OpenTracing標(biāo)準(zhǔn)來統(tǒng)一鏈路跟蹤中涉及的相關(guān)標(biāo)準(zhǔn)和規(guī)范,Google發(fā)布OpenCensus項目包含Metrics標(biāo)準(zhǔn)及采集Agent、Collector規(guī)范,由于OpenTracing與OpenCensus存在交集,2019年CNCF合并OpenTracing與OpenCensus推出OpenTelemetry項目,旨在建立標(biāo)準(zhǔn)規(guī)范統(tǒng)一Metrics、Logs和Traces3種數(shù)據(jù),核心技術(shù)是產(chǎn)生、收集和處理可觀測性數(shù)據(jù),并支持傳輸?shù)椒治鲕浖?。OpenTelemetry的問世加速了云原生可觀測性技術(shù)和生態(tài)的發(fā)展;2020年9月CNCF發(fā)布可觀測性推薦產(chǎn)品,主要工具 有Prometheus、Grafana、Elastic、Jaeger、OpenTelemetry;可觀測性成為云原生的一項必備要素。
利用eBPF附加到跟蹤點及在內(nèi)核和用戶側(cè)部署探針的能力,提供可視化觀測數(shù)據(jù)?;诓僮飨到y(tǒng)eBPF的可觀測性與數(shù)據(jù)庫、中間件、應(yīng)用系統(tǒng)的可觀測性數(shù)據(jù)關(guān)聯(lián),實現(xiàn)全?;A(chǔ)軟硬件的可觀測、可跟蹤,如圖3所示。
圖3 基于操作系統(tǒng)eBPF的全棧可觀測性
在操作系統(tǒng)層:通過eBPF程序在存儲資源、網(wǎng)絡(luò)資源和主機(jī)資源等內(nèi)部進(jìn)行數(shù)據(jù)采集,包括文件訪問、網(wǎng)絡(luò)負(fù)載、性能事件、CPU負(fù)載、內(nèi)存訪問和系統(tǒng)函數(shù)調(diào)用等;在數(shù)據(jù)庫層:使用PG_STAT_*、DBE_PERF、TOP_SQL、ASP、WDR等工具收集數(shù)據(jù)庫負(fù)載、SQL執(zhí)行效率、會話等信息,并將進(jìn)程、SQL、表、日志文件等與操作系統(tǒng)eBPF信息建立關(guān)聯(lián);最后,通過Prometheus工具進(jìn)行監(jiān)控數(shù)據(jù)采集、處理和導(dǎo)出以實現(xiàn)狀態(tài)可視化。實現(xiàn)從應(yīng)用層發(fā)現(xiàn)問題到數(shù)據(jù)庫、操作系統(tǒng)逐級下鉆分析的全棧可觀測、可跟蹤。
基于eBPF在操作系統(tǒng)內(nèi)核可觀測性優(yōu)勢,與OpenTelemetry結(jié)合建立云原生觀測數(shù)據(jù)收集處理的標(biāo)準(zhǔn)規(guī)范,增強(qiáng)云原生環(huán)境可觀測性能力(圖4)。
OpenTelemetry提供一組標(biāo)準(zhǔn)規(guī)范和工具集,管理可觀測性數(shù)據(jù),主要包括trace、metrics、logs等,規(guī)范可觀測性數(shù)據(jù)的數(shù)據(jù)模型、數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)治理和數(shù)據(jù)導(dǎo)出。主要包括以下3個部分。
1)API:應(yīng)用開發(fā)者會使用OpenTelemetry API對其代碼進(jìn)行插樁,API包含4個部分,即Tracer API、Metrics API、Context API、語義規(guī)范。
2)SDK:是OpenTelemetry API的具體實現(xiàn)。
3)Collector:遵循OpenTelemetry協(xié)議實現(xiàn)數(shù)據(jù)收集、處理和導(dǎo)出到外部系統(tǒng),由Receiver、Processor、Exporter構(gòu)成。
如圖4所示,將eBPF采集數(shù)據(jù)導(dǎo)入OpenTelemetry Collector,步驟如下。
圖4 基于操作系統(tǒng)eBPF的云原生可觀測性
數(shù)據(jù)接收:在kubernetes上eBPF的tracepoint和kprobe/kretprobe,將內(nèi)核采集到的應(yīng)用請求、系統(tǒng)調(diào)用、網(wǎng)絡(luò)傳輸性能等數(shù)據(jù)放到內(nèi)存中,在用戶態(tài)eBPF程序讀取數(shù)據(jù),進(jìn)行預(yù)處理;基于OpenTelemetry規(guī)范實現(xiàn)Receiver,以事件訂閱方式接收采集數(shù)據(jù)。
數(shù)據(jù)處理:基于OpenTelemetry規(guī)范實現(xiàn)Processor,對采集數(shù)據(jù)進(jìn)行協(xié)議解析和指標(biāo)處理評估,實現(xiàn)eBPF采集的內(nèi)核數(shù)據(jù)與kubernetes調(diào)度請求、上下文信息關(guān)聯(lián)。
數(shù)據(jù)導(dǎo)出:基于OpenTelemetry規(guī)范實現(xiàn)Exporter數(shù)據(jù)導(dǎo)出到可觀測平臺進(jìn)行分析。
代碼示意基于eBPF捕獲性能事件,加載到內(nèi)核的eBPF程序代碼段:
整個過程中應(yīng)用系統(tǒng)無需變更或重新編譯Linux內(nèi)核,從而做到無侵入。當(dāng)集群規(guī)模越來越大時,無侵入方式會極大地提升系統(tǒng)性能效率。
可觀測性技術(shù)聚集故障定位、故障診斷、故障預(yù)測和系統(tǒng)運(yùn)行不暢的原因,是從監(jiān)控、應(yīng)用性能管理APM、人工智能運(yùn)維AIOps等技術(shù)中不斷“演化”而來,隨著操作系統(tǒng)eBPF、人工智能機(jī)器學(xué)習(xí)、知識推理等技術(shù)的不斷發(fā)展,可觀測性技術(shù)一定會在信創(chuàng)和云原生等應(yīng)用場景中發(fā)揮更大作用,推動下一代監(jiān)控技術(shù)的發(fā)展。