作者:李智慧,單位:中國(guó)移動(dòng)智慧家庭運(yùn)營(yíng)中心
在微服務(wù)架構(gòu)中,一個(gè)系統(tǒng)可能由幾十上百個(gè)微服務(wù)組成,當(dāng)請(qǐng)求處理過(guò)程中發(fā)生異常時(shí),如何快速定位到產(chǎn)生問(wèn)題的服務(wù)?能否以可視化的方式看到請(qǐng)求經(jīng)過(guò)的鏈路?應(yīng)用性能管理(APM)系統(tǒng)可以幫我們解決這些問(wèn)題。本文詳細(xì)介紹了APM的產(chǎn)生背景,理論基礎(chǔ)和實(shí)現(xiàn)案例,并以Skywalking為例講解了APM的核心功能。
APM簡(jiǎn)介
1.1需求背景
在微服務(wù)大行其道的今天,一個(gè)大型系統(tǒng)可能包含上百個(gè)服務(wù)(甚至更多),隨著服務(wù)數(shù)量的增多,遇到問(wèn)題后定位和分析的時(shí)間成本也相應(yīng)增加。例如遇到系統(tǒng)故障或者性能問(wèn)題,在傳統(tǒng)三層架構(gòu)中,僅僅需要分析有限的幾個(gè)組件,如web服務(wù)器,應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)。但是,如果問(wèn)題發(fā)生在微服務(wù)架構(gòu)中,就需要調(diào)查大量的組件和服務(wù)器。此外,僅僅分析單個(gè)組件很難看到全局,當(dāng)在微服務(wù)架構(gòu)中發(fā)生一個(gè)低可見(jiàn)度的問(wèn)題時(shí),采用傳統(tǒng)分析方式解決問(wèn)題所需的時(shí)間也會(huì)成倍增加。
面對(duì)以上情況, 我們就需要一些可以幫助運(yùn)維開(kāi)發(fā)人員快速理解系統(tǒng)、定位問(wèn)題、監(jiān)控系統(tǒng)性能的工具,這就是所謂的APM(Application Performance Monitoring,應(yīng)用性能管理)。
?什么是APM?
用最簡(jiǎn)單的術(shù)語(yǔ)來(lái)說(shuō),APM是從業(yè)人員用來(lái)確保應(yīng)用程序的一致可用性、性能和響應(yīng)時(shí)間的工具。網(wǎng)站、移動(dòng)應(yīng)用程序和業(yè)務(wù)應(yīng)用程序是監(jiān)控的典型用例。
APM區(qū)別于其他監(jiān)控系統(tǒng)的核心技術(shù)之一是分布式調(diào)用鏈追蹤,借助于這一功能,我們能在監(jiān)控頁(yè)面上看到一個(gè)請(qǐng)求從前端到底層服務(wù)的每一次調(diào)用,以及對(duì)應(yīng)的服務(wù)器地址,接口名,響應(yīng)時(shí)間,是否成功等信息。借助這一功能,當(dāng)一個(gè)請(qǐng)求出現(xiàn)問(wèn)題時(shí),就可以快速發(fā)現(xiàn)產(chǎn)生問(wèn)題的根源。
APM的功能遠(yuǎn)不止于此,在當(dāng)今高度連接的數(shù)字世界中,APM的監(jiān)控范圍已經(jīng)擴(kuò)展到服務(wù)、流程、主機(jī)、日志、網(wǎng)絡(luò),當(dāng)然還有訪問(wèn)這些應(yīng)用程序的最終用戶。
1.2 理論基礎(chǔ)—調(diào)用鏈追蹤的實(shí)現(xiàn)原理
Google的Dapper是最早的APM系統(tǒng),Google利用Dapper系統(tǒng)幫助運(yùn)維人員快速定位問(wèn)題。相關(guān)論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》[1]發(fā)表后,很多公司和組織基于調(diào)用鏈追蹤的原理,設(shè)計(jì)出了各種優(yōu)秀的APM系統(tǒng)。這些APM系統(tǒng)不只包括調(diào)用鏈追蹤,還集成了性能監(jiān)控、日志收集、告警等功能,可以作為一個(gè)獨(dú)立的運(yùn)維監(jiān)控系統(tǒng)來(lái)使用。
在《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》中,闡述了Dapper對(duì)整個(gè)調(diào)用過(guò)程的追蹤過(guò)程:
① 請(qǐng)求到來(lái)生成一個(gè)全局TraceID,通過(guò)TraceID可以串聯(lián)起整個(gè)調(diào)用鏈,一個(gè)TraceID代表一次請(qǐng)求。
② 除了TraceID外,還需要SpanID用于記錄調(diào)用父子關(guān)系。每個(gè)服務(wù)會(huì)記錄下parent id和span id,通過(guò)他們可以組織一次完整調(diào)用鏈的父子關(guān)系。
③ 一個(gè)沒(méi)有parent id的span成為root span,可以看成調(diào)用鏈入口。
④ 所有這些ID可用全局唯一的64位整數(shù)表示;
⑤ 整個(gè)調(diào)用過(guò)程中每個(gè)請(qǐng)求都要透?jìng)鱐raceID和SpanID。
⑥ 每個(gè)服務(wù)將該次請(qǐng)求附帶的TraceID和附帶的SpanID作為parent id記錄下,并且將自己生成的SpanID也記錄下。
⑦ 要查看某次完整的調(diào)用則只要根據(jù)TraceID查出所有調(diào)用記錄,然后通過(guò)parent id和span id組織起整個(gè)調(diào)用父子關(guān)系。
1.3 統(tǒng)一規(guī)范—opentracing
當(dāng)代分布式跟蹤系統(tǒng)(例如,Zipkin, Dapper, HTrace, X-Trace等)的實(shí)現(xiàn)方式各異,他們使用不兼容的API來(lái)實(shí)現(xiàn)各自的應(yīng)用需求。OpenTracing通過(guò)提供平臺(tái)無(wú)關(guān)、廠商無(wú)關(guān)的API,使得開(kāi)發(fā)人員能夠方便的添加或修改追蹤系統(tǒng)的實(shí)現(xiàn)。OpenTracing[2]提供了用于運(yùn)營(yíng)支撐系統(tǒng)的和針對(duì)特定平臺(tái)的輔助程序庫(kù)。
OpenTracing是一個(gè)規(guī)范,它不是一個(gè)數(shù)據(jù)結(jié)構(gòu),能提供的是語(yǔ)義和概念。OpenTracing要涵蓋的是中間的一層,它是要實(shí)現(xiàn)的是一套API的套件。你需要按照OpenTracing的規(guī)范向用戶提供API,實(shí)現(xiàn)把數(shù)據(jù)下送到API的探針或者Tracer的探針。OpenTracing的主旨是在做手動(dòng)埋點(diǎn),程序的開(kāi)發(fā)者要主動(dòng)調(diào)用Tracing的API。
實(shí)現(xiàn)了OpenTracing規(guī)范的APM包括Zipkin,Pinpoint,Skywalking,Jaeger等。
開(kāi)源APM比較
比較知名的開(kāi)源APM包括:Zipkin[3],Pinpoint[4],Jaeger[5],Skywalking[6]等。以下是這些開(kāi)源APM的橫向比較[7]。
圖1 開(kāi)源APM橫向比較
綜合以上分析,Skywalking對(duì)代碼無(wú)侵入,集成成本低,支持trace查詢,監(jiān)控,告警等功能,最重要的是,對(duì)應(yīng)用吞吐量的影響最小,與我們所在項(xiàng)目的需求契合度最高,因此,我們選擇Skywalking進(jìn)行部署和使用。
Skywalking簡(jiǎn)介
Skywalking是一款國(guó)內(nèi)開(kāi)源的應(yīng)用性能監(jiān)控工具,支持對(duì)分布式系統(tǒng)的監(jiān)控、跟蹤和診斷。以下是SkyWalking的一些主要功能和組件:
① 分布式跟蹤:SkyWalking跟蹤流經(jīng)多個(gè)服務(wù)的請(qǐng)求,提供對(duì)事務(wù)路徑的端到端可見(jiàn)性。它捕獲關(guān)于每個(gè)調(diào)用的詳細(xì)信息,包括延遲、錯(cuò)誤和依賴關(guān)系。
② 指標(biāo)分析:SkyWalking收集和分析應(yīng)用指標(biāo),如CPU使用率、內(nèi)存消耗和網(wǎng)絡(luò)流量。它提供了這些指標(biāo)的實(shí)時(shí)監(jiān)控和可視化,幫助識(shí)別性能瓶頸和資源使用模式。
③ 服務(wù)網(wǎng)格支持: SkyWalking集成了流行的服務(wù)網(wǎng)格框架,如Istio和Envoy,允許用戶監(jiān)控和管理部署在服務(wù)網(wǎng)格環(huán)境中的微服務(wù)。
④ 告警和診斷:SkyWalking可以根據(jù)預(yù)定義的閾值或收集數(shù)據(jù)中檢測(cè)到的異常產(chǎn)生告警。它還提供了強(qiáng)大的診斷工具來(lái)幫助解決性能問(wèn)題并分析根本原因。
⑤ 插件生態(tài)系統(tǒng):SkyWalking提供了一個(gè)基于插件的架構(gòu),允許用戶擴(kuò)展其功能并與不同的技術(shù)集成,可支持多種各種數(shù)據(jù)庫(kù)、消息代理和中間件系統(tǒng)。
⑥ 可視化展示:SkyWalking提供了一個(gè)用戶友好的基于web的界面,用于可視化性能數(shù)據(jù)、生成報(bào)告和探索跟蹤細(xì)節(jié)。它提供了一套全面的指示板和圖表來(lái)幫助使用者理解系統(tǒng)行為。
⑦ 可擴(kuò)展性和兼容性:SkyWalking設(shè)計(jì)用于處理大規(guī)模分布式系統(tǒng)。它支持水平可伸縮性,可以跨多個(gè)節(jié)點(diǎn)以分布式方式部署。它與云原生環(huán)境和容器編排平臺(tái)(如Kubernetes)兼容。
Skywalking 總體可以分為四部分(圖2):
① Skywalking Agent:使用Javaagent做字節(jié)碼植入,無(wú)侵入式的收集,并通過(guò)HTTP或者gRPC方式發(fā)送數(shù)據(jù)到Skywalking Collector。
② Skywalking Collector :鏈路數(shù)據(jù)收集器,對(duì)agent傳過(guò)來(lái)的數(shù)據(jù)進(jìn)行整合分析處理并落入相關(guān)的數(shù)據(jù)存儲(chǔ)中。
③ Storage:Skywalking的存儲(chǔ),時(shí)間更迭,sw已經(jīng)開(kāi)發(fā)迭代到了6.x版本,在6.x版本中支持以ElasticSearch、Mysql、TiDB、H2、作為存儲(chǔ)介質(zhì)進(jìn)行數(shù)據(jù)存儲(chǔ)。
④ UI:Web可視化平臺(tái),用來(lái)展示落地的數(shù)據(jù)。
圖2 skywalking整體架構(gòu)
通過(guò)在應(yīng)用程序中集成 SkyWalking Agent,就可以對(duì)接口、服務(wù)、數(shù)據(jù)庫(kù)、MQ等進(jìn)行追蹤,將追蹤結(jié)果通過(guò) HTTP 或 gRPC協(xié)議 發(fā)送到 SkyWalking Collecter,SkyWalking Collecter 經(jīng)過(guò)分析和聚合,將結(jié)果存儲(chǔ)到 Elasticsearch 或? H2等數(shù)據(jù)庫(kù)中,SkyWalking同時(shí)提供了一個(gè) SkyWalking UI 的可視化界面,UI 以 GraphQL + HTTP 方式獲取存儲(chǔ)數(shù)據(jù)進(jìn)行展示。
如果只是為了學(xué)習(xí)體驗(yàn)SkyWalking,不必單獨(dú)安裝每一個(gè)組件,最新版本的Skywalking服務(wù)端支持AllInOne的安裝方式。只需要需要將安裝包解壓然后啟動(dòng),數(shù)據(jù)庫(kù),Collector,UI等服務(wù)端組件就已經(jīng)安裝好了,可以直接登錄UI進(jìn)行體驗(yàn),此時(shí)使用的是H2內(nèi)存數(shù)據(jù)庫(kù),Skywalking重啟后數(shù)據(jù)會(huì)清空。被監(jiān)控的應(yīng)用需要集成skywalking agent,修改agent配置后重啟,以便將采集信息上報(bào)給服務(wù)端。
此外,skywaling的官方網(wǎng)站https://skywalking.apache.org/
還提供了在線體驗(yàn)入口,打開(kāi)網(wǎng)站,在頁(yè)面上點(diǎn)擊“Live demo”->“Go to native UI”,即可進(jìn)入skywalking監(jiān)控頁(yè)面,查看當(dāng)前監(jiān)控的應(yīng)用和日志信息。
目前使用Skywalking的公司包括華為,當(dāng)當(dāng),小米等不下數(shù)十家公司。
Skywalking使用示例
面基于我們自己部署的Skywalking(9.4.0版本),介紹一下Skywalking的主要功能。
4.1 服務(wù)監(jiān)控
進(jìn)入Skywalking首頁(yè),點(diǎn)擊Service面板,呈現(xiàn)如下頁(yè)面。
圖3 Skywalking服務(wù)監(jiān)控-1
在頁(yè)面中可以看到,當(dāng)前系統(tǒng)中有3個(gè)應(yīng)用組件被納入監(jiān)控,分別是ops,business,user。頁(yè)面中展示了每種應(yīng)用的負(fù)載,請(qǐng)求成功率,時(shí)延,和應(yīng)用性能指數(shù)(Apdex)。
點(diǎn)擊某個(gè)服務(wù),可以看到該服務(wù)的各種指標(biāo)的趨勢(shì)圖以及告警信息,如下圖所示。
圖4 Skywalking服務(wù)監(jiān)控-2
Skywalking的告警規(guī)則可在配置文件中進(jìn)行設(shè)置。
4.2 拓?fù)湔故?/strong>
Topology頁(yè)面中,可以看到Skywalking根據(jù)當(dāng)前時(shí)間窗口的請(qǐng)求數(shù)據(jù)繪制的系統(tǒng)拓?fù)鋱D。如果在監(jiān)控時(shí)間段內(nèi)某個(gè)應(yīng)用沒(méi)有請(qǐng)求,則拓?fù)鋱D中不會(huì)顯示該應(yīng)用和其他應(yīng)用之間的調(diào)用關(guān)系。
圖5 Skywalking拓?fù)湔故?/p>
在Topology頁(yè)面中,不僅顯示了被監(jiān)控的服務(wù),還顯示了與這些服務(wù)發(fā)生直接調(diào)用關(guān)系的對(duì)象或組件,例如User,agent::ui,服務(wù)器10.100.201.73:61616等。
4.3 調(diào)用鏈路追蹤
在Trace頁(yè)面中,可以根據(jù)traceid查看一次請(qǐng)求的完整調(diào)用過(guò)程。如下圖所示,在“追蹤ID”輸入框中輸入想要查詢的traceid并點(diǎn)擊搜索,側(cè)欄中會(huì)顯示出該traceid關(guān)聯(lián)的所有請(qǐng)求。點(diǎn)擊其中的一個(gè)請(qǐng)求,會(huì)在右側(cè)顯示請(qǐng)求從前端直到到存儲(chǔ)層的所有調(diào)用步驟、時(shí)延等。進(jìn)一步地,還可以通過(guò)點(diǎn)擊具體的路徑,查看當(dāng)前調(diào)用關(guān)聯(lián)的實(shí)例名,ip,端口,業(yè)務(wù)日志等信息。
圖6 Skywalking調(diào)用鏈追蹤
4.4 日志監(jiān)控
Skywalking支持通過(guò)log4j和logback配置將業(yè)務(wù)日志上報(bào)Skywalking到服務(wù)端,以便在UI中展示,配置方式參考文檔[8][9][10]。配置完成后,可在UI的Log頁(yè)面中看到業(yè)務(wù)日志。如下圖所示,
我們的Java程序通常使用logback或log4j框架打印業(yè)務(wù)日志,如果能夠?qū)⑦@些標(biāo)識(shí)與skywalking的traceid進(jìn)行關(guān)聯(lián),在某條告警日志出現(xiàn)時(shí),就可以根據(jù)其中的traceid找到相應(yīng)的調(diào)用鏈。為此,Skywalking提供了低侵入的集成方式,讓我們可以在業(yè)務(wù)日志中打印traceid。
以log4j框架為例,首先在程序中添加apm-toolkit-log4j-1.x依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-1.x</artifactId>
<version>{project.release.version}</version>
</dependency>
然后修改layout配置
log4j.appender.CONSOLE.layout=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.TraceIdPatternLayout
最后修改日志打印格式
log4j.appender.CONSOLE.layout.ConversionPattern=%d [%T] %-5p %c{1}:%L - %m%n
其中%T即表示在日志中增加traceid字段。
logback的配置方法類似,具體可以參考Skywalking文檔[8][9][10]。
4.5 更多功能
Skywalking提供的功能遠(yuǎn)不止上面演示的這些,想要了解更多功能,請(qǐng)參考官方文檔https://skywalking.apache.org/docs,以及在線演示系統(tǒng)http://demo.skywalking.apache.org/general
如何選擇適合自己的APM?
哪一款A(yù)PM最適合自己?需要根據(jù)自己項(xiàng)目的實(shí)際情況進(jìn)行選擇,以下是選型時(shí)需要考慮的一些因素:
(1)特性和功能
評(píng)估每個(gè)開(kāi)源APM提供的特性和功能。例如,調(diào)用鏈追蹤的粒度、監(jiān)控指標(biāo)、告警功能是否滿足自己的需求;
(2)性能與可擴(kuò)展性
考慮每個(gè)APM的可擴(kuò)展性和性能,是否具有水平可伸縮性,是否具有高效的數(shù)據(jù)存儲(chǔ)和檢索機(jī)制,當(dāng)業(yè)務(wù)增長(zhǎng)時(shí)APM的負(fù)載能力是否滿足需求,等等。
(3)支持的技術(shù)
檢查APM是否支持項(xiàng)目中使用的編程語(yǔ)言、框架和技術(shù)。
(4)與現(xiàn)有監(jiān)控系統(tǒng)的集成
了解APM與現(xiàn)有監(jiān)控和日志系統(tǒng)的集成方式,優(yōu)先選擇可以實(shí)現(xiàn)平滑數(shù)據(jù)對(duì)接,與當(dāng)前系統(tǒng)兼容性好的平臺(tái)。
(5)安裝和使用的便利性
評(píng)估每個(gè)APM的安裝、配置和使用的便利性,用戶界面是否滿足需求,學(xué)習(xí)曲線是否合理,利用現(xiàn)有文檔和資源是否能夠快速入手。
(6)社區(qū)活躍度
一個(gè)活躍的社區(qū)可以為平臺(tái)提供支持、指導(dǎo)和定期更新。
參考文獻(xiàn)
[1]?Sigelman B H , Barroso L A , Burrows M ,et al.Dapper, a Large-Scale Distributed Systems Tracing Infrastructure[J].? 2010.
[2]?OpenTracing Specification Council. The OpenTracing Semantic .Specification[S/OL].http://opentracing.io/documentation/pages/spec.2017-03-19/2023-07-03.
[3]?Zipkin, zipkin官網(wǎng), 2023年3月10日, http://zipkin.io/.
[4]?pinpoint introduction, pinpoint官網(wǎng), 2023年7月3日, https://pinpoint-apm.gitbook.io/pinpoint/.
[5]?jaeger introduction, jaeger官網(wǎng), 2023年7月3日, https://www.jaegertracing.io/docs/.
[6]?SkyWalking 極簡(jiǎn)入門(mén),芋道源碼, 2020年4月19日,?https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/.
[7]?分布式調(diào)用鏈調(diào)研(pinpoint、skywalking、jaeger、zipkin等對(duì)比), CSDN, 2022年2月24日https://blog.csdn.net/muyimo/article/details/123123377.
[8]?application-toolkit-log4j-1.x, skywalking在線文檔, 2023年7月3日, https://skywalking.apache.org/docs/skywalking-java/v8.14.0/en/setup/service-agent/java-agent/application-toolkit-log4j-1.x/.
[9]?application-toolkit-log4j-2.x, skywalking在線文檔, 2023年7月3日, https://skywalking.apache.org/docs/skywalking-java/v8.14.0/en/setup/service-agent/java-agent/application-toolkit-log4j-2.x/.
[10] application-toolkit-logback-1.x, skywalking在線文檔, 2023年7月3日,https://skywalking.apache.org/docs/skywalking-java/v8.14.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/.