分佈式追蹤與監控:Skywalking 介紹
一、APM 介紹
APM(Application Performance Management)應用性能管理,通過各種探針採集並上報數據,收集關鍵指標,同時搭配數據展示以實現對應用程序性能管理和故障管理的系統化解決方案。
目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking,這裏主要介紹 SkyWalking ,它是一款優秀的國產 APM 工具,包括了分佈式追蹤、性能指標分析、應用和服務依賴分析等。
Zabbix、Premetheus、open-falcon 等監控系統主要關注服務器硬件指標與系統服務運行狀態等,而 APM 系統則更重視程序內部執行過程指標和服務之間鏈路調用情況的監控,APM 更有利於深入代碼找到請求響應 “慢” 的根本問題,與 Zabbix 之類的監控是互補關係。
二、分佈式鏈路追蹤
下圖是常見的微服務的框架,4 個實例,2 個 MySQL、1 個 Redis。實際上它有兩次完全不同的請求進來:有一次的一個請求會訪問 Redis,再去訪問 MySQL;另外一個可能走到另外的服務上,然後直接去 MySQL。整個分佈式追蹤的目的是什麼?是爲了讓我們最終在頁面上、UI 上、和數據上能夠復現這個過程。我們要拿到整個完整的鏈路,包括精確的響應時間,訪問的方法、訪問的 circle,訪問的 Redis 的 key 等,這些是我們在做分佈式追蹤的時候需要展現的一個完整的信息。
三、Apache Skywalking(Incubator) 簡介
分佈式系統的應用程序性能監視工具,專爲微服務、雲原生架構和基於容器(Docker、K8s、Mesos)架構而設計。
Apache Skywalking(Incubator) 專門爲微服務架構和雲原生架構系統而設計並且支持分佈式鏈路追蹤的 APM 系統。Apache Skywalking(Incubator) 通過加載 探針 - 非侵入式 的方式收集應用調用鏈路信息,並對採集的調用鏈路信息進行分析,生成應用間關係和服務間關係以及服務指標。Apache Skywalking (Incubating) 目前支持多種語言,其中包括 Java,.Net Core,Node.js 和 Go 語言。另外社區還發展出了一個叫 OpenTracing 的組織,旨在推進調用鏈監控的一些規範和標準工作。
Skywalking 支持從 6 個可視化維度剖析分佈式系統的運行情況。
-
總覽視圖 (Global view) 是應用和組件的全局視圖,其中包括組件和應用數量,應用的告警波動,慢服務列表以及應用吞吐量;
-
拓撲圖 (topology view) 從應用依賴關係出發,展現整個應用的拓撲關係;
-
應用視圖從單個應用的角度,展現應用的上下游關係,TopN 的服務和服務器,JVM 的相關信息以及對應的主機信息。
-
服務視圖關注單個服務入口的運行情況以及此服務的上下游依賴關係,依賴度,幫助用戶針對單個服務的優化和監控;
-
追蹤 (trace) 展現了調用的單次請求經過的所有埋點以及每個埋點的執行時長;
-
告警視圖 (alarm) 根據配置閾值針對應用、服務器、服務進行實時告警。
四、SkyWalking 原理架構圖
五、SkyWalking 核心模塊
SkyWalking 採用組件式開發,易於擴展,主要組件作用如下:
1. Skywalking Agent:鏈路數據採集 tracing(調用鏈數據)和 metric(指標)信息並上報,上報通過 HTTP 或者 gRPC 方式發送數據到 Skywalking Collector。
2. Skywalking Collector :鏈路數據收集器,對 agent 傳過來的 tracing 和 metric 數據進行整合分析通過 Analysis Core 模塊處理並落入相關的數據存儲中,同時會通過 Query Core 模塊進行二次統計和監控告警。
3. Storage:Skywalking 的存儲,支持以 ElasticSearch、Mysql、TiDB、H2 等主流存儲作爲存儲介質進行數據存儲, H2 僅作爲臨時演示單機用。
4. SkyWalking UI:Web 可視化平臺,用來展示落地的數據,目前官方採納了 RocketBot 作爲 SkyWalking 的主 UI。
本文通過 Docker 容器安裝 Skywalking,並示例整合 apisix 網關、Spring Boot 微服務項目進行 APM(Application Performance Management) 應用性能管理,檢測從接口網關到微服務實例、再到數據庫、緩存等存儲層之間的鏈路追蹤。
六、SkyWalking 服務端安裝
安裝環境:
操作系統:CentOS7,配置爲 4 核 8G
Docker 版本:Docker version 19.03.12, build 48a66213fe
安裝工具:docker-compose,版本:docker-compose version 1.26.2, build eefe0d31
skywalking 版本:8.1.0
elasticsearch 版本:7.5.0
1、創建目錄
mkdir -p /data/ent/skywalking
cd /data/ent/skywalking
2、編寫 docker-compose.yml
vim docker-compose.yml
#添加以下內容
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
container_name: elasticsearch
restart: always
ports:
- 9200:9200
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
skywalking-oap:
image: apache/skywalking-oap-server:8.1.0-es7
container_name: skywalking-oap
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
healthcheck:
test: ["CMD-SHELL", "/skywalking/bin/swctl"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
skywalking-ui:
image: apache/skywalking-ui:8.1.0
container_name: skywalking-ui
depends_on:
- skywalking-oap
links:
- skywalking-oap
restart: always
ports:
- 28080:8080
environment:
TZ: Asia/Shanghai
SW_OAP_ADDRESS: skywalking-oap:12800
3、啓動服務
#啓動(docker和docker-compose的安裝不再詳介紹)
docker-compose up -d
4、開放端口
firewall-cmd --zone=public --add-port=11800/tcp --permanent
firewall-cmd --zone=public --add-port=12800/tcp --permanent
firewall-cmd --zone=public --add-port=28080/tcp --permanent
firewall-cmd --reload
5、訪問 skywalking ui 後臺,訪問地址爲:http:// 服務器 ip:28080
七、Skywalking Agent 安裝
以 java agent 爲例,下載 skywalking 項目,地址:https://www.apache.org/dyn/closer.cgi/skywalking/8.1.0/apache-skywalking-apm-es7-8.1.0.tar.gz
解壓下載後的文件,將 agent 文件夾複製至 java 項目下,執行 java 項目時,使用 javaagent 開啓 skywalking agent
java -javaagent:agent/skywalking-agent.jar=agent.service_name=sab-service,collector.backend_service=192.168.35.226:11800 -jar sab-manager.war --spring.profiles.active=local_dev
其中,agent.service_name爲要註冊到skywalking的服務名稱,collector.backend_service爲skywalking grpc註冊地址。
啓動無報錯,在 skywalking ui 後臺可查看服務是否已註冊成功到 skywalking。
八、Skywalking UI 管理後臺介紹
1、首頁
-
儀表盤:查看被監控服務的運行狀態
-
拓撲圖:以拓撲圖的方式展現服務直接的關係,並以此爲入口查看相關信息
-
追蹤:以接口列表的方式展現,追蹤接口內部調用過程
-
性能剖析:單獨端點進行採樣分析,並可查看堆棧信息
-
告警:觸發告警的告警列表,包括實例,請求超時等。
-
自動刷新:自動刷新當前數據內容
2、儀表盤
查看全局服務基本性能指標
-
第一欄:不同內容主題的監控面板,應用 / 數據庫 / 容器等
-
第二欄:操作,包括編輯 / 導出當前數據 / 導入展示數據 / 不同服務端點篩選展示
-
第三欄:不同緯度展示,服務 / 實例 / 端點
2.1、參數說明
2.1.1 Global 全局維度
-
第一欄:Global、Server、Instance、Endpoint 不同展示面板,可以調整內部內容
-
Services load:服務每分鐘請求數
-
Slow Services:慢響應服務,單位 ms
-
Un-Health services(Apdex):Apdex 性能指標,1 爲滿分。
-
Global Response Latency:百分比響應延時,不同百分比的延時時間,單位 ms
-
Global Heatmap:服務響應時間熱力分佈圖,根據時間段內不同響應時間的數量顯示顏色深度
-
底部欄:展示數據的時間區間,點擊可以調整。
2.1.2 Service 實例維度
-
Service Apdex(數字): 當前服務的評分
-
Service Apdex(折線圖):不同時間的 Apdex 評分
-
Successful Rate(數字):請求成功率
-
Successful Rate(折線圖):不同時間的請求成功率
-
Servce Load(數字):每分鐘請求數
-
Servce Load(折線圖):不同時間的每分鐘請求數
-
Service Avg Response Times:平均響應延時,單位 ms
-
Global Response Time Percentile:百分比響應延時
-
Servce Instances Load:每個服務實例的每分鐘請求數
-
Show Service Instance:每個服務實例的最大延時
-
Service Instance Successful Rate:每個服務實例的請求成功率
2.1.3 Instance 實例維度
-
Service Instance Load:當前實例的每分鐘請求數
-
Service Instance Successful Rate:當前實例的請求成功率
-
Service Instance Latency:當前實例的響應延時
-
JVM CPU:jvm 佔用 CPU 的百分比
-
JVM Memory(Java Service):JVM 內存佔用大小,單位 MB
-
JVM GC Time:JVM 垃圾回收時間,包含 YGC 和 OGC
-
JVM GC Count:JVM 垃圾回收次數,包含 YGC 和 OGC
-
JVM Thread Count(Java Service):JVM 生成的線程數
-
CLR XX:類似 JVM 虛擬機參數
2.1.4 Endpoint 端點維度
-
Endpoint Load in Current Service:每個端點的每分鐘請求數
-
Slow Endpoints in Current Service:每個端點的最慢請求時間,單位 ms
-
Successful Rate in Current Service:每個端點的請求成功率
-
Endpoint Load:當前端點每個時間段的請求數據
-
Endpoint Avg Response Time:當前端點每個時間段的請求行響應時間
-
Endpoint Response Time Percentile:當前端點每個時間段的響應時間佔比
-
Endpoint Successful Rate:當前端點每個時間段的請求成功率
3、拓撲圖
SkyWalking 能夠根據獲取的數據自動繪製服務之間的調用關係圖,並能識別常見的服務顯示在圖標上。每條連線的顏色反應了服務之間的調用延遲情況,可以非常直觀的看到服務與服務之間的調用狀態,連線中間的點能點擊,可顯示兩個服務之間鏈路的平均響應時間、吞吐率以及 SLA 等信息。
-
1:選擇不同的服務關聯拓撲
-
2:查看單個服務相關內容
-
3:服務間連接情況
-
4:分組展示服務拓撲
4、追蹤
顯示請求的響應內部執行情況,一個完整的請求都經過了哪些服務、執行了哪些代碼方法、每個方法的執行時間、執行狀態等詳細信息,快速定位代碼問題。
可通過選擇服務、實例、狀態和端點名稱來搜索調用鏈路,
可以點擊標記紅色的端點,查看異常信息
5、性能剖析
新建需要分析的端點,在左側列表顯示任務及對應的採樣請求,右側顯示端點鏈路及每個端點的堆棧信息。
6、告警
不同維度告警列表,可分爲服務、端點和實例。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/mNfZ2LrfUBySHrr8vvOOfA