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