【轉載請註明出處】:http://www.javashuo.com/article/p-kfelrwfm-nq.html前端
SkyWalking 是觀察性分析平臺和應用性能管理系統。提供分佈式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。java
特性:mysql
Skywalking 技術架構
web
整個系統分爲三部分:sql
Skywalking也提供了其餘的一些特性:數據庫
因爲Skywalking並無本身定製的數據容器或者使用多種數據容器增長複雜度,而是主要使用ElasticSearch(固然開源的基本上都是這樣來保持簡潔,例如Pinpoint也只使用了HBase),因此數據容器的特性以及本身數據結構基本上就限制了業務的上限,以ES爲例:apache
整體來講,Skywalking儘可能使用ES在大數據和查詢方面的優點,同時儘可能減小ES數據密度低的劣勢帶來的影響,從目前來看,ES在調用鏈跟蹤方面是不二的數據容器,而在數據指標方面,ES也能中規中矩的完成業務,雖然和時序數據庫相比要弱一些,但在PB級如下的數據支持也不會有太大問題。編程
若是說數據容器決定了上限,那麼數據結構則決定了實際到達的高度。Skywalking的數據結構主要爲:segmentfault
數據維度(ES索引爲skywalking_*_inventory)後端
數據內容
原始數據
二次統計指標
特別記錄
其中數量佔比最大的就是調用鏈跟蹤數據和各類指標,而這些數據都可以經過OAP設置過時時間,以下降歷史數據的對磁盤佔用和查詢效率的影響。
做爲Skywalking的核心數據,調用鏈跟蹤數據(skywalking_segment)基本上奠基了整個系統的基礎,而若是要詳細的瞭解調用鏈跟蹤的話,就不得不提到openTracing。
openTracing基本上是目前開源調用鏈跟蹤系統的一個事實標準,它制定了調用鏈跟蹤的基本流程和基本的數據結構,同時也提供了各個語言的實現。若是用一張圖來表現openTracing,則是以下:
其中:
Trace:一次調用的完整記錄
Span:一次調用中的某個節點/步驟,相似於一層堆棧信息,Trace是由多個Span組成,Span和Span之間也有父子或者並列的關係來標誌這個節點/步驟在整個調用中的位置
以一個Trace爲例:
首先是外部請求調用A,而後A依次同步調用了B和C,而B被調用時會去同步調用D,C被調用的時候會依次同步調用E和F,F被調用的時候會經過異步調用G,G則會異步調用H,最終完成一次調用。
上圖是經過Span之間的依賴關係來表現一個Trace,而在時間線上,則能夠有以下的表達:
固然,若是是同步調用的話,父Span的時間佔用是包括子Span的時間消耗的。
而落地到Skywalking中,咱們以一條skywalking_segment的記錄爲例:
{ "trace_id": "52.70.15530767312125341", "endpoint_name": "Mysql/JDBI/Connection/commit", "latency": 0, "end_time": 1553076731212, "endpoint_id": 96142, "service_instance_id": 52, "version": 2, "start_time": 1553076731212, "data_binary": "CgwKCjRGnPvp5eikyxsSXhD///////////8BGMz62NSZLSDM+tjUmS0wju8FQChQAVgBYCF6DgoHZGIudHlwZRIDc3FsehcKC2RiLmluc3RhbmNlEghyaXNrZGF0YXoOCgxkYi5zdGF0ZW1lbnQYAiA0", "service_id": 2, "time_bucket": 20190320181211, "is_error": 0, "segment_id": "52.70.15530767312125340" }
其中:
這裏能夠看到,目前Skywalking雖然相較於Pinpoint來講查詢的維度要多一些,可是也頗有限,並且除了endPoint,並無和業務有關聯的字段,只能經過時間/服務/實例/接口/成功標誌/耗時來進行非業務相關的查詢,若是後續要加強業務相關的搜索查詢的話,應該還須要增長一些用於保存動態內容(如messageId,orderId等業務關鍵字)的字段用於快速定位
指標數據相對於Tracing則要簡單得多了,通常來講就是指標標誌、時間戳、指標值,而Skywalking中的指標有兩種:一種是採集的原始指標值,例如jvm的各類運行時指標(例如cpu消耗、內存結構、GC信息等);一種是各類二次統計指標(例如tp性能指標、SLA等,固然也有爲了便於查詢的更高時間維度的指標,例如基於分鐘、小時、天、周、月)
例如如下是索引skywalking_endpoint_cpm_hour中的一條記錄,用於標誌一個小時內某個接口的cpm指標:
{ "total": 8900, "service_id": 5, "time_bucket": 2019031816, "service_instance_id": 5, "entity_id": "7", "value": 148 }
各個字段的釋義以下:
agent(apm-sniffer)是Skywalking的Java探針實現,主要負責:
固然,agent還實現了客戶端採樣,不過在APM監控系統裏進行客戶端數據採樣都是沒有靈魂的,因此這裏就再也不贅述了。
首先,agent經過 org.apache.skywalking.apm.agent.core.boot.BootService 實現了總體的插件化,agent啓動會加載全部的BootService實現,並經過 ServiceManager 來管理這些插件的生命週期,採集jvm指標、gRPC鏈接管理、調用鏈數據維護、數據上報OAP這些服務均是經過這種方式擴展。
而後,agent還經過bytebuddy以javaagent的模式,經過字節碼加強的機制來構造AOP環境,再提供PluginDefine的規範方便探針的開發,最終實現非侵入性的數據埋點,採集調用鏈數據。
同agent相似,OAP做爲Skywalking最核心的模塊,也實現了本身的擴展機制,不過在這裏叫作Module,具體能夠參考library-module,在module的機制下,Skywalking實現了本身必須核心組件:
以及一個可選組件:
而前面提到的OAP的高擴展性則體如今核心業務的規範均定義在了core中,若是有須要本身擴展的,只須要本身單獨作本身的實現,而不須要作侵入式的改動,最典型的示例則是官方支持的storage,不只支持單機demo的內存數據庫H2和經典的ES,連目前開源的Tidb均可以接入。
startup.sh
啓動http://localhost:8080/
便可看到面板-javaagent:${agent_home}/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${service_name}
【轉載請註明出處】:http://www.javashuo.com/article/p-kfelrwfm-nq.html