作者:宋小生 - 平安壹錢包中間件資深工程師
Dubbo3 可觀測能力速覽
Apache Dubbo3 在云原生可觀測性方面完成重磅升級,使用 Dubbo3 最新版本,你只需要引入 dubbo-spring-boot-observability-starter 依賴,微服務集群即原生具備以下能力:
能力一:可視化查看集群、單機流量指標與健康狀態
Dubbo 3.2 最新版本支持以應用、單機、單條服務等多種不同粒度觀測運行狀態,包括 qps、rt、線程池、錯誤分類統計等。
能力二:全鏈路追蹤
Dubbo 3.2 最新版本通過內置鏈路過濾器在 RPC 請求中對鏈路數據進行采集,采集之后通過導出器將鏈路數據導出到各大廠商。
https://cn.dubbo.apache.org/zh-cn/overview/tasks/observability/
云原生可觀測性的探索
云原生升級的挑戰
高質量交付的前一部分有 DevOps 保證開發與測試的質量與效率,后有云原生保證運維部署效率與質量,但是大規模快速迭代意味著頻繁變更,變更與系統運行帶來的穩定性問題不能被忽視,比如宕機,網絡與系統異常等,很多未知的問題難以避免,借助可觀測系統來及時感知問題、高效分析異常、快速恢復系統,提前規避已知問題,深度挖掘未知問題,高效提升運維質量,可以看到建設一個完善的可觀測平臺對于發現已知和未知異常,提升系統的穩定性是非常必要的。
Dubbo 可觀測建設目標
Dubbo 作為微服務 RPC 基礎框架直接建設大而全的可觀測系統與定位不符合也不是很現實,但是可以從自身出發提供更多的基礎監控數據來為企業建立可觀測系統提供助力,可觀測性與傳統單維度監控不同,更關注的是數據的關聯性,通過單維度和多維度角度整體觀測和分析問題,首先從流行的三大支柱指標出發,在此基礎之上,Dubbo 提供多維度聚合與非聚合指標幫助用戶快速發現問題與診斷問題,多維指標中進而可以通過應用、主機等標簽信息關聯到鏈路系統,鏈路系統提供了服務請求級別的鏈路性能與異常問題分析功能,Dubbo 通過提供鏈路門面對接各大全鏈路廠商,鏈路分析之后可以通過鏈路數據例如:TraceId,SpanId 自定義數據等來追蹤到詳細日志,詳情日志中 Dubbo 側提供了豐富的專家建議與錯誤碼供開發與運維同學快速診斷與定位問題。
Dubbo 多維度指標體系
Dubbo 多維度指標體系建設中從縱向和橫向兩個角度來看,縱向 Dubbo 側提供簡易接入的門面外觀,然后將系統中采集到的指標存儲在內存指標容器中,接著根據指標類型決定是否進行聚合計算,最后將指標導出到不同的指標系統。從橫向角度來看采集維度也覆蓋到容易出問題的 RPC 請求鏈路,三大中心交互與線程資源使用情況等場景。
Dubbo 多維度指標體系采集哪些指標?
前面介紹了大面上的指標采集,但是 Dubbo 應該采集哪些詳細的指標呢?接下來可以看到 Dubob 采集指標時參考的一些方法論。
根據谷歌 SRE 書:Google 針對大量分布式監控的經驗總結提出 4 個黃金指標(延遲、流量、錯誤以及飽和度)可以在服務級別幫助衡量終端用戶體驗、服務中斷、業務影響等層面的問題。
RED 方法(來自 Tom Wilkie),RED 方法則關注請求、實際工作以及外部視角(即來自服務消費方的視角)包含:速率、錯誤與持續時間。
USE 方法(來自 Brendan Gregg):USE 方法主要著眼于資源內部,包含:利用率、飽和度與錯誤。
Dubbo 多維度指標體系接入-導出到 QOS
多維度指標體系在 3.2 之后的版本已經發布與持續迭代中,對用戶來說只需要引入一個依賴即可:
<dependency><groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-observability-starter</artifactId> <version>3.2.x</version>
</dependency>
依賴引入之后默認情況下一些關鍵指標會默認被打開,只需要在命令行訪問當前服務 22222 服務端口和 metrics 路徑即可獲取到指標數據,其中 22222 端口是 Dubbo 提供的服務質量,健康管理端口可以用過 QOS 配置進行修改。
查詢到的 Dubbo 指標以命名:dubbo_type_action_unit_otherfun 的格式進行展現。
當然也會有用戶直接使用 SpringBoot 管理端口的情況,針對這種場景 Dubbo 側已經做了自動適配直接使用 SpringBoot 導出普羅米修斯格式的指標數據即可,如下配置所示:
在訪問 SpringBoot 管理端口查詢指標數據時就可以看到 SpringBoot 內置的一些指標和 Dubbo 提供的一些指標一起展示給用戶了。
Dubbo 多維度指標體系 Prometheus 查詢
前面直接通過 curl 命令訪問指標服務獲取到的只是瞬時的指標數據,對于指標數據我們往往更需要的是時序化的向量數據,這時候就要借助普羅米修斯來進行在外部采集,存儲 Dubbo 指標,對于傳統應用部署在物理機和虛擬機的服務可以使用靜態,基于文件或者基于自有 CMDB 系統建設的指標發現服務,當然后續也可以使用 Dubbo Admin 為指標系統提供的服務發現服務,對于部署在 K8s 中的系統來說可以直接借助 K8s 支持的服務發現,接入 Prometheus 自動采集配置如下:
普羅米修斯中查詢指標如下所示:
Dubbo 多維度指標體系 Grafana 展示
普羅米修斯側重于采集指標和存儲指標等場景,在展示指標這里相對簡陋,Grafana 提供了豐富的指標面板,使用 Grafana 來建立指標大盤更直觀,也更容易,可以看到下面的圖片中提供了多維度的篩選如應用級、實例級,接口級等場景對服務數據進行查詢。在指標監控大盤中也可以看到基于前面指標方法論的一些維度指標,比如流量、請求數、延遲、錯誤,飽和度等。另外也可以看到一些應用于實例信息比如 Dubbo 版本分布,實例分布等。
Dubbo 鏈路追蹤門面建設
Agent 用戶接入簡單,但是動態修改字節碼的形式來提供支持,風險較大,一個代理層 agent 只做一個 Dubbo 層的鏈路功能似乎有點大材小用,Dubbo 定位為微服務 RPC 框架,做通用的鏈路門面相對更好一些,專業的事情交給專業的人做,Dubbo 通過適配各大全鏈路系統來讓用戶接入更簡單。
Dubbo 鏈路追蹤門面選型
業界比較通用的 OpenTelemetry 鏈路追蹤門面更傾向于標準統一的規范,支持各大廠商,同時也是與 CNCF 孵化的項目,Micrometer 的優勢在于與指標埋點所用依賴來源相同,并且在 SpringBoot3 中也默認集成用戶接入更為方便,另外 Micrometer 定位為可觀測門面與 Dubbo 鏈路系統建設的定位相符,其中也可以通過橋接的形式來橋接 OpenTelemetry。
Micrometer + OpenTelemetry Bridge:
Dubbo 鏈路追蹤結構
Dubbo 通過內置鏈路過濾器在 RPC 請求中對鏈路數據進行采集,采集之后通過導出器將鏈路數據導出到各大廠商。
Dubbo 鏈路追蹤接入
Dubob 鏈路追蹤門面已經發布,需要接入鏈路追蹤系統只需要簡單的引入對應鏈路追蹤的 starter 集成包然后進行單件的配置即可,更詳細的接入手冊可以參考文檔和案例。 [ 1]
在鏈路追蹤配置中可以配置開關,采樣率,導出器等配置。
最后鏈路追蹤系統往往也需要通過鏈路 id 與日志進行關聯來分析更詳細的根因,這個時候就需要提前在日志配置中增加日志 MDC 打印的配置了,如下 traceId 和 spanId 的獲取。
Dubbo 鏈路追蹤 Zipkin
這里是 Dubbo 接入鏈路追蹤 Zipkin 的展示,可以看到一些接口的性能與元數據。
Dubbo 鏈路追蹤 Skywalking
這里是 Dubbo 接入鏈路追蹤 Skywalking 的展示,通過鏈路 id 檢索到的請求級別的鏈路分析。
Dubbo 日志管理
Dubbo 日志管理異常
Dubbo 框架發展多年,功能越來越豐富, 其中包含了與三大中心的交互,客戶端服務端的交互,這種內外部交互的場景更容易出現一些異常,如果遇到問題通過通過觀察日志經常摸不著頭腦,最后通過分析代碼來定位根因又是相對頭疼的事情。
遇到問題不知道原因:
Dubbo 日志管理專家建議
如果仔細觀察 Dubbo3.x 新版本打印出的日志就可以看到日志中會打印一個問題幫助手冊,當發現問題時候復制此鏈接在瀏覽器中打開就可以看到出現異常日志時候的專家建議,比如下圖所示的問題原因排查步驟,隨著 Dubbo 的發展專家建議也會越來越詳細,當讓這個過程要建設的更為完善就需要用戶、開發者一起參與進來,Dubbo 社區非常 Open,鼓勵用戶、開發者一起參與進來進行建設。
Dubbo 可觀測性-穩定性實踐
最后就是圍繞整個可觀測平臺來做穩定性實踐了,穩定性實踐中通過觀測服務健康狀況、排查分析系統問題、最后快速恢復系統。其中觀測系統異常的情況可以通過值班人員主動觀測監控大盤,也可以將異常分析告警,被動接收到告警郵件、IM、短信、電話等來及時發現問題,發現異常時可以借助指標來分析聚合與非聚合的服務信息來定位異常位置,然后通過鏈路追蹤系統找到服務級別的異常進行分析,最后也可以根據鏈路信息找到詳細的日志來分析異常上下文排除根因,排查的過程要借助整個觀測平臺以快速恢復系統為目標通過流量隔離,服務降級等策略恢復系統減少損失,事后可以借助可觀測平臺提供的這些持久化的信息來詳細分析異常與規律來定位根因。
[1] 文檔和案例
https://cn.dubbo.apache.org/zh-cn/overview/tasks/observability/tracing/