APM SkyWalking及服務可觀察性
| 檔案狀態: [ ] 草稿 [√] 正在修改 | 當前版本 | 1.0 |
| 歷史修訂版本 | 1.0; | |
| 作 者 | 杜有龍 | |
| 完成日期 | 2021-09-01 |

一、分布式呼叫鏈路

1、分布式呼叫鏈路簡圖
在分布式架構系統中,幾乎每一個前端請求都會形成一個復雜的分布式服務呼叫鏈路,一個瀏覽器請求完整的呼叫鏈可能如下圖所示,

2、分布式呼叫鏈路特點
- 多行程:分布式架構
- 多團隊:不同的團隊開發
- 多語言:不同的編程語言實作
- 一對多服務:一次請求需要涉及到多個子系統
- 多機房:不同的系統部署在不同的機房
- 多資料中心:不同的系統向不同的資料中心獲取資料
3、呼叫鏈路會帶來什么問題
常見的問題簡圖

遇到上述問題,我們會產生諸多疑問
- 如何快速發現問題?
- 如何找到問題?
- 如何判斷故障影響范圍?
- 如何梳理服務依賴以及依賴的合理性?
- 如何分析鏈路性能問題?
(用戶對搜索的耗時是很敏感的,而任何一個子系統的低效都會導致最終的搜索耗時,)
想要解決分布式系統面臨的上述一些列問題,并且理解分布式系統的行為,
就需要監控那些橫跨了不同的應用、不同的服務器之間的關聯動作,
幫助我們進行系統的持續監控,以便發生問題時,能夠快速定位問題所在,
4、呼叫鏈路監控理論(Dapper)
Dapper,是最早關于呼叫鏈路監控的理論,
2010年Google公開的論文提到了 Dapper,a Large-Scale Distributed Systems Tracing Infrastructure(大規模分布式系統跟蹤基礎設施) ,
該論文可以歸類為三個核心,
4.1、請求呼叫的關注點
關注在請求處理期間各個呼叫的各項性能指標,
- 吞吐量:組件、平臺、物理設備的實時吞吐量,
- 回應時間:包括整體呼叫的回應時間和各個服務的回應時間,
- 錯誤記錄:根據服務回應錯誤資訊統計單位時間例外次數,
4.2、呼叫鏈路監控的目的
| 全鏈路監控從整體維度到區域維度展示各項指標,將跨應用的所有呼叫鏈性能資訊集中展現,可方便度量整體和區域性能,并且方便找到故障產生的源頭,生產上可極大縮短故障排除時間, |
在全鏈路監控工具中,能夠帶給我們什么?
- 故障定位:可以通過呼叫鏈結合業務日志快速定位錯誤資訊
- 部署分析:準確掌握生產一線應用部署情況
- 性能問題定位:找到影響性能的位置,可以做以下三方面的優化
- 依賴優化:梳理各個呼叫環節的可用性,查找服務依賴關系,進行優化
- 鏈路優化:可以得到用戶的行為路徑,對不合理的鏈路進行優化調整
- 關鍵點優化:從呼叫鏈全流程性能角度,識別關鍵呼叫鏈,并進行優化
4.3、呼叫鏈路實作方式:跟蹤樹與span
Dapper技術實作核心思想,
Dapper的核心實作方法是在分布式請求的背景關系中加入span id以及 parent id,用于記錄請求的上下級關系,這個關系用樹形結構來表示,
一次特定跟蹤會產生一個trace id,一次特定跟蹤的所有相關 span 會共享同一個通用的trace id ,

(分布式追蹤示意圖)
| 在 Dapper 跟蹤樹中,樹節點是基本單元,我們稱之為 span,節點之間的連線表示 span 與其父span 之間的關系,雖然節點在整個跟蹤樹中的位置是獨立的,但 span 也是一個簡單的時間戳日志,其中編碼了這個 span 的開始時間、結束時間、RPC 時間資料、以及0或多個應用程式相關的標注, Dapper 為每個 span 記錄了一個可讀的span name、span id和 parent id,這樣就能重建出一次分布式跟蹤程序中不同 span 之間的關系,沒有parent id 的 span被稱為 根span,一次特定跟蹤的所有相關 span 會共享同一個通用的trace id (trace id在圖中沒有繪出),所有這些 ID 可能是唯一的 64 位整數,在一個典型的 Dapper 跟蹤中,我們希望每個 RPC 對應一個 span,每一個組件層對應跟蹤樹上的一個層級, |
二、SkyWalking

1、服務可觀察性
1.1、什么是服務可觀察,為什么要做到可觀察
服務對運維和開發者是透明的,
在發生問題之前或者發生問題時,
我們是可以觀察到服務的運行狀況,
| 隨著容器化編排、私有云等各項技術的持續進化,為分布式服務化提供了技術層面的支持,隨著微服務架構的持續演進,應用和服務數量不斷增加,呼叫關系越來越復雜,無法通過一張靜態的架構圖來描述微服務架構下的系統部署情況,所以,從開發和運維的角度來看,需要對資源保持可觀察性(Observability), 可觀察性要求提供穿越微服務邊界的能力,并對應用資料或平臺資料進行觀測及分析,然后通過高度可視化系統,直觀地將系統當前的狀態展現出來, |
1.2、可觀察層次劃分
從“可觀察”的物件的角度,可以將其歸納為三個層次,
- 基礎設施層
對主機、作業系統進行的指標監控,
基礎設施層的監控和系統健康度觀察大多由平臺提供商直接負責,
- 工具層
編排工具的可觀察性是微服務體系中的重要一環,隨著容器化的不斷推進,對Kubernetes和Mesos等容器編排生態工具的監控也越來越多樣化,另外,由于DevOps體系的發展,相關工具鏈(如Git、SVN、CVCD等)的可觀察性也成為當今的關注焦點,
工具層的解決方基本是由其核心產品以及周邊生態提供的,
- 應用環境層
應用環境層的可觀察性是指對應用自身、應用的服務器、資料庫、訊息佇列、快取等中間件組件進行觀察,
1.3、應用環境層的多維度觀察
應用環境層,可觀察三個核心概念分別為日志(Logging)、指標(Metrics)、追蹤(Tracing),
- 日志(Logging)
描述的是一些不連續的(特性)離散事件,例如,有些業務系統采用ELK(Elasticsearch+Logstash+ Kinaba)或類似技術堆疊的日志收集系統,它們是分布式監控系統的早期形態,借鑒了傳統應用解決問題的方式,是最容易理解的解決方案,
商業化的日志系統Splunk,
- 指標(Metrics)
可累加的,它具有(特性)原子性,每個指標都是一個邏輯計量單元,體現了一段時間之內相關指標的狀態,
例如,每分鐘請求的次數、記憶體的使用情況可以定義為一個曲線圖,
CNCF生態中的 Prometheus監控系統正是基于指標的典型系統,它通過定義和收集不同的指標資料,以及提供基于時間維度的查詢能力,為分布式服務指標提供基礎資料保障,
- 追蹤(Tracing)
在監控領域通常被稱為分布式追蹤,是指在單次請求范圍內處理資訊,任何的資料和元資料資訊都被系結到了系統中的單個事務上,追蹤能力是近幾年技術人員最為關注的需求,由Twitter開源的ZipKin是目前運用最為廣泛的分布式追蹤系統,

觀察韋恩圖,可以發現上面介紹的三個概念并不是相互獨立的,往往會有一定的重疊,比如skyworking可以進行日志采集,
復雜和完善的監控系統一般是跨越多個維度的,
充分理解這三個概念,能夠更好的定位目前市場上各種開源和商業監控工具或系統,理解它們的核心優勢,
2、SkyWorking介紹
SkyWorking由中國人吳晟于2015年創建,早期是一個單純的分布式追蹤系統,目前已發展為一個全功能、多語言、支持多種應用場景的APM系統,
2017年12月8日,Apache軟體基金會范訓器專案管理委員會 ASF IPMC宣布“SkyWalking全票通過,進入Apache范訓器”,
Skywalking的定位是apm,不僅提供了自動分布式追蹤,還可以通過手動埋探針的方式去處理我們的一些特殊需求,同時它還支持了很多中間件和jvm監控,這是目前一些分布式追蹤技術未能解決的問題,
比如zipkin技術,不能解決kafka等一些中間件和jvm的監控功能,也不支持自定義去追蹤自己想要了解的鏈路資訊,
在這些方面skywalking做的比較好,通過探針的方式來進行監控做到代碼0侵入性,而性能開銷極小,
2.1、Apache官網解釋
SkyWalking: an APM(application performance monitor) system, especially designed for microservices, cloud native and container-based (Docker, Kubernetes, Mesos) architectures.
一種APM(應用程式性能監視器)系統,專為微服務,云原生和基于容器(Docker,Kubernetes,Mesos)架構而設計,
| 什么是APM? 在分布式系統中, 我們就需要一些可以幫助理解系統行為、用于分析性能問題的工具,以便發生故障的時候,能夠快速定位和解決問題,這就是所謂的APM(application performance monitor) , |

2.2、Skyworking主要特性
The core features are following.
- Distributed tracing
- Service, service instance, endpoint metrics analysis
- Root cause analysis. Code on the runtime analysis
- Service topology map analysis
- Service, service instance and endpoint dependency analysis
- Slow services and endpoints detected
- Database metrics monitoring
- Alarm
- Browser performance monitoring
- Infrastructure(VM, network, disk etc.) monitoring
- Metrics, traces, and logs
2.3、Skyworking對遙測資料來源支持
SkyWalking supports to collect telemetry (metrics, traces, and logs) data from multiple sources and multiple formats, including
- Java, .NET Core, NodeJS, PHP, and Python auto agents.
- Go and C++ SDKs.
- Browser agent.
- Service Mesh Observability.
- Metrics system, including Prometheus.
- Logs.
- Zipkin v1/v2 trace.(No Analysis)
3、SkyWorking優點
- 支持多語言探針監控,
- 支持自動及手動探針,
自動探針:在使用程序中,完全是0代碼,無侵入,無需修改程式源代碼;
手動探針:它支持手動探針去追蹤業務方法OpenTrackingApi、@Trace注解、trackId集成到日志中,
- 多種后端存盤:ElasticSearch,Mysql,TiDB, H2,采用elasticsearch做資料存盤,能夠達到實時搜索、穩定、可靠
- 現代化Web UI,提供了良好的可視化管理界面,包括應用、實體、服務性能指標分析、拓撲圖、分布式追蹤、性能預警,
- 日志集成
- 應用、實體和服務的告警
4、SkyWalking架構
4.1、架構圖


說明:
上面的架構圖看似模塊繁多,但在實際使用時我們并不需要關注太多的實作方式,
HTTP、gRPC 、GraphQL 這些都是其內部架構使用到的技術,我們只需安裝 SkyWalking Collecter、Elasticsearch 或 H2,然后在需要追蹤的服務內配置少量的代碼(Java 專案通過修改 JVM 引數即可),最后通過 SkyWalking UI 查看結果,
4.2、三大組件
4.2.1概述
SkyWalking總體架構分為三部分
- skywalking-agent:探針,用來收集和發送資料到歸集器,
- skywalking-collector:鏈路資料歸集器,資料可以落地ElasticSearch,單機也可以落地H2,不推薦,H2僅作為臨時演示用,
- skywalking-web:web可視化平臺,用來展示落地的資料,
4.2.2關系
4.2.2.1、部署組件
- ES:其中資料存盤建議使用elasticsearch
- agent:探針,獲取應用資訊
- collector:主要為收集agent發送過來的資料,和為web提供介面服務
- web:主要提供UI監控服務
4.2.2.2、關系說明
通過在應用程式中添加 SkyWalking Agent,就可以將介面、服務、資料庫、MQ等進行追蹤,將追蹤結果通過 HTTP 或 gRPC 發送到 SkyWalking Collecter,
SkyWalking Collecter 經過分析和聚合,將結果存盤到 Elasticsearch 或 H2,
SkyWalking 同時提供了一個 SkyWalking UI 的可視化界面,UI 以 GraphQL + HTTP 方式獲取存盤資料進行展示,
三、分布式追蹤系統對比
1、常見技術
市場常見呼叫鏈技術:Zipkin,Pinpoint,SkyWalking,CAT,
2、技術特點
2.1、Zipkin
是Twitter開源的呼叫鏈分析工具,目前基于springcloud sleuth得到了廣泛的使用,特點是輕量,使用部署簡單,起步最早,社區體系最為完備,支持語言最為豐富,
但是功能較簡單,支持技術堆疊spring-cloud,
2.2、Pinpoint
是韓國人開源的基于位元組碼注入的呼叫鏈分析,以及應用監控分析工具,使用java撰寫,
特點是支持多種插件,UI功能強大,接入端無代碼侵入,
使用java探針位元組碼增加技術,實作對整個應用的監控,對應用零侵入,
2.3、SkyWalking
是中國開源的基于位元組碼注入的呼叫鏈分析以及應用監控分析工具,
2015年由個人吳晟(華為開發者)開源 , 2017年加入Apache范訓器,2018年加入Apache頂級范訓專案,
特點是支持多種插件,UI功能較強,接入端無代碼侵入,
其核心是個分布式追蹤系統,使用java探針位元組碼增加技術,實作對整個應用的監控,對應用零侵入,
2.4、CAT
是大眾點評開源的基于編碼和配置的呼叫鏈分析,應用監控分析,日志采集,監控報警等一系列的監控平臺工具,
集成方案是通過代碼埋點的方式來實作監控,比如: 攔截器,注解,過濾器等, 對代碼的侵入性很大,集成成本較高,風險較大,
3、特性對比
3.1實作方式
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 實作方式 | 攔截請求,發送(HTTP,mq)資料至zipkin服務 | java探針,位元組碼增強 | java探針,位元組碼增強 | 代碼埋點(攔截器,注解,過濾器等) |
3.2接入方式
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 接入方式 | 引入配置 | javaagent位元組碼 | javaagent位元組碼 | 代碼侵入 |
| OpenTracing | √ | × | √ | × |
3.3通信方式
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| agent到collector通信 | http,MQ | thrift | gRPC | http/tcp |
3.4常見特性
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 顆粒度 | 介面級 | 方法級 | 方法級 | 代碼級 |
| 全域呼叫統計 | × | √ | √ | √ |
| traceid查詢 | √ | × | √ | × |
| 報警 | × | √ | √ | √ |
| JVM監控 | × | × | √ | √ |
3.5資料存盤
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 資料存盤 | ES,mysql, Cassandra,記憶體 | Hbase | ES,H2,mysql, TiDB | mysql,hdfs |
3.6 UI展示
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 健壯度 | ** | **** | **** | ***** |
3.7社區活躍度
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| github STAR | 8.4k->14.6k | 5.9k->11.6k | 3.3k->17.5k | 4.9k-15.8k |
3.8缺點
| 類別 | Zipkin | Pinpoint | SkyWalking | CAT |
| 缺點 | 默認使用的http請求向zipkin上報資訊,耗性能; 跟sleuth結合可以使用rabbitMQ的方式異步來做,增加了復雜度,需要引入rabbitMQ ; 資料分析比較簡單, | 不支持查詢單個呼叫鏈, 對外表現的是整個應用的呼叫生態; 二次開發難度較高, | 3.2版本之前BUG較多 ;版本升級架構變化較大, | 代碼侵入性較強,需要埋點; 檔案比較混亂,檔案與發布版本的符合性較低; 需要依賴大眾點評私服, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/377001.html
標籤:其他
上一篇:windows 中 elasticsearch 7.15.2 和 插件 詳細 下載和安裝(解決elasticsearch.exceptions.ConnectionError)
下一篇:[ElasticSearch系列五] Spring Data Elasticsearch 物體類注解說明【專攻系】
