- 1、SkyWalking簡介
- 2、SkyWalking的搭建
- 2.1 部署Elasticsearch
- 2.2 部署SkyWalking-Server
- 2.3 部署SkyWalking-UI
- 3、應用接入
- 3.1 jar包部署方式
- 3.2 dockerfile方式
- 3.3 DockerFile示例
- 4、SkyWalking UI 界面說明
- 4.1 儀表盤
- 4.1.1 APM
- (1)全局維度
- (2)服務維度
- (3)實例維度
- (4)端點維度
- 4.1.2 數據庫
- 4.1.3 Istio、SelfObservability 、WebBrowser
- 4.1.1 APM
- 4.2 拓撲圖
- 4.3 追蹤
- 4.4 性能剖析
- 4.5 日志
- 4.6 告警
- 4.1 儀表盤
- 5、其他相關的配置
- 5.1 數據清理機制
- 5.2 數據存儲和寫入優化(針對ES)
- 5.3 鏈路過長問題
- 6、參考文檔:
隨著微服務架構的流行,一些微服務架構下的問題也會越來越突出,比如一個請求會涉及多個服務,而服務本身可能也會依賴其他服務,整個請求路徑就構成了一個網狀的調用鏈,而在整個調用鏈中一旦某個節點發生異常,整個調用鏈的穩定性就會受到影響。
面對以上情況, 我們就需要一些可以幫助理解系統行為、用于分析性能問題的工具,以便發生故障的時候,能夠快速定位和解決問題,這時候?APM(Application Performance Management應用性能管理)工具就該閃亮登場了。
1、SkyWalking簡介
- 官方網站
- SkyWalking 文檔中文版(社區提供)
- 官方demo網站 (賬號:skywalking 密碼:skywalking)
SkyWalking 它是一款優秀的國產?APM?工具,包括了分布式追蹤、性能指標分析、應用和服務依賴分析等。
SkyWalking架構分為三部分:
? ?- skyWalking-collector:鏈路數據歸集器,相當于Skywalking的服務端
? ?- skyWalking-ui:SkyWalking的web可視化平臺
? ?- skyWalking-agent:探針,與應用容器綁定在一起,啟動時通過javaagent進行JVM級別的AOP,收集和發送數據到歸集器
SkyWalking?的核心是數據分析和度量結果的存儲平臺,通過?HTTP?或?gRPC?方式向?SkyWalking Collecter?提交分析和度量數據,SkyWalking Collecter?對數據進行分析和聚合,存儲到?Elasticsearch、H2、MySQL、TiDB?等。
說明:?SkyWalking?的核心是數據分析和度量結果的存儲平臺,通過?HTTP?或?gRPC?方式向?SkyWalking Collecter?提交分析和度量數據,SkyWalking Collecter?對數據進行分析和聚合,
存儲到?Elasticsearch、H2、MySQL、TiDB?等其一即可,最后我們可以通過?SkyWalking UI?的可視化界面對最終的結果進行查看。Skywalking?支持從多個來源和多種格式收集數據:多種語言的?Skywalking Agent?、Zipkin v1/v2?、Istio?勘測、Envoy?度量等數據格式。
整體架構看似模塊有點多,但在實際上還是比較清晰的,主要就是通過收集各種格式的數據進行存儲,然后展示。
所以搭建?Skywalking?服務我們需要關注的是?SkyWalking Collecter、SkyWalking UI?和 存儲設備,SkyWalking Collecter、SkyWalking UI?官方下載安裝包內已包含,最終我們只需考慮存儲設備即可。
2、SkyWalking的搭建
2.1 部署Elasticsearch
注意:版本與SkyWalking版本對應
?展開源碼
docker run --name elasticsearch -p 9200:9200? -p 9300:9300 \-e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \--restart always \-v /home/docker/elastic/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \-v /home/docker/elastic/elasticsearch/data:/usr/share/elasticsearch/data \-v /home/docker/elastic/elasticsearch/plugins:/usr/share/elasticsearch/plugins \--net network_network \-d elasticsearch:7.17.0
2.2 部署SkyWalking-Server
apache-skywalking-apm-es7-8.3.0.tar.gz 下載地址
- 拉取鏡像
?展開源碼
docker pull apache/skywalking-oap-server:8.3.0-es7
- 運行 skywalking-oap-server 容器? ? ?SW_STORAGE:數據存儲配置,支持H2,MySQL、ES等,這里改為 elasticsearch7
? ? ? ? ? 配置文件路徑:apache-skywalking-apm-bin-es7/config/application.yml
SkyWalking 默認使用12800作為Rest API通信端口,11800為gRPC API端口
?展開源碼
docker run -d --name skywalking-oap \
-e TZ=Asia/Shanghai \
-p 12800:12800 -p 11800:11800 \
--link elasticsearch:elasticsearch \
--net network_network \
-e SW_STORAGE=elasticsearch7 \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:8.3.0-es7
2.3 部署SkyWalking-UI
配置文件路徑:apache-skywalking-apm-bin-es7/webapp/webapp.yml
- 拉取鏡像
?展開源碼
docker pull apache/skywalking-ui:8.3.0
- 運行 skywalking-ui 容器
?展開源碼
docker run -d --name skywalking-ui \
-e TZ=Asia/Shanghai \
-p 8088:8080 \
--link skywalking-oap:skywalking-oap \
--net network_network \
-e SW_OAP_ADDRESS=skywalking-oap:12800 \
apache/skywalking-ui:8.3.0
3、應用接入
注意:agent 中指定服務名(SW_AGENT_NAME),不同的服務用不同的服務名區分。如果服務名相同,相當于是多個實例。
3.1 jar包部署方式
- 將skywalking安裝包下的agent整個目錄(apache-skywalking-apm-bin-es7/agent),拷貝到應用機器所在的目錄,如:/home/docker/
- 在啟動的腳本上添加 skywalking-agent配置:
配置參數 | 描述 |
-javaagent | 配置skywalking-agent.jar位置,確保這個參數在-jar參數之前 |
-DSW_AGENT_NAME | 配置應用名稱,用于區分不用的服務 |
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES | 配置server的服務地址 |
?展開源碼
java -javaagent:/home/docker/agent/skywalking-agent.jar
-DSW_AGENT_NAME=gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-Dserver.port=9999 -Xmx128m -Xms128m -XX:MaxMetaspaceSize=128m
-jar gateway.jar
3.2 dockerfile方式
- 將skywalking安裝包下的agent整個目錄(apache-skywalking-apm-bin-es7/agent),拷貝到應用機器所在的目錄,如:/home/docker/
- docker-compose.yml
docker-compose.yml?展開源碼
? # skywalking-aopskywalking-oap:image: apache/skywalking-oap-server:8.3.0-es7container_name: skywalking-oaplinks:- elasticsearch:elasticsearchrestart: alwaysports:- 11800:11800- 12800:12800environment:TZ: Asia/ShanghaiSW_STORAGE: elasticsearch7SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200JAVA_OPTS: "-Xms512m -Xmx512m"networks:- network# skywalking-uiskywalking-ui:image: apache/skywalking-ui:8.3.0container_name: skywalking-uilinks:- skywalking-oap:skywalking-oaprestart: alwaysports:- 8088:8080environment:TZ: Asia/ShanghaiSW_OAP_ADDRESS: skywalking-oap:12800networks:- network
4、SkyWalking UI 界面說明
4.1 儀表盤
4.1.1 APM
APM 應用性能管理,分為全局維度、服務維度、實例維度、端點維度
(1)全局維度
- Service Load:服務每分鐘請求數
- Slow Services:慢響應服務,服務耗時最長的一次耗時時間
- Un-Health Services(Apdex):服務性能健康指數,0~1
- Slow EndPoints:慢響應的端點
- Global Response Latency:不同百分比的響應延時時間
- Global Heatmap:熱力圖
(2)服務維度
- Service Apdex:服務性能指數
- Service Apdex(折線圖):
- Service Avg Response Time:平均響應時間
- Global Response Time Percentile:百分比的響應時間
- Successful Rate:請求成功率
- Successful Rate(折線圖):不同時間的請求的成功率
- Service Load:每分鐘請求數
- Service Load(折線圖):不同時間的每分鐘請求數
- Service Instances Load:每個服務實例的每分鐘請求數
- Slow Service Instances:服務實例的最大延時
- Service Instances Successful Rate:服務實例的請求成功率
(3)實例維度
- Service Instances Load:服務實例的每分鐘請求數
- Service Instances Successful Rate:服務實例的請求成功率
- Service Instances Latency:服務實例的響應延時
- JVM CPU:占用CPU的百分比
- JVM Memory:內存占用大小
- JVM GC Time:垃圾回收時間,包括Young GC 和 Old GC
- JVM GC Count:垃圾回收次數
- JVM Thread Count:JVM 創建線程數量
- CLR xxx:
(4)端點維度
- EndPoint Load in Current Service:每個端點的每分鐘請求數
- Slow Endpoints in Current Service:每個端點的最慢請求時間
- Successful Rate in Current Service:每個端點的請求成功率
- Endpoint Load:當前端點每個時間段的請求數據
- Endpoint Avg Response Time:端點請求的平均響應時間
- Endpoint Response Time Percentile:當前端點每個時間段的響應時間占比
- Endpoint Successful Rate:當前端點每個時間段的請求成功率
4.1.2 數據庫
展示數據庫的響應時間、響應時間分布、吞吐量、SLA、慢SQL等詳細信息,便于直觀展示數據庫狀態
- Database Avg Response Time:數據庫平均響應時間
- Database Access Successful Rate:數據庫的訪問成功率
- Database Traffic:數據庫每分鐘請求數
- Database Access Latency Percentile:數據庫不同比例的響應時間
- Slow Statements:前N個慢查詢
- All Database Loads:所有數據庫中的每分鐘請求數排名
- Un-Health Databas:所有數據庫的請求成功率排名
4.1.3 Istio、SelfObservability 、WebBrowser
這幾個比較次用,用得不多,不詳細介紹
- Istio:結合Istio,適配容器、采集容器信息
- SelfObservability:監控SkyWalking自身信息
- WebBrowser:8.2.0 版本新增的瀏覽器,提供PV、UV等數據。需結合 Skywalking-Client-js 使用
SkyWalking自監控(SelfObservability)的配置:
修改配置文件apache-skywalking-apm-bin-es7/config/application.yml
修改內容:
Prometheus-fetcher 的selector修改為:default
telemetry的selector修改為:prometheus
SelfObservability:
4.2 拓撲圖
服務之間的調用關系。每條連線的顏色反應了服務之間的調用延遲情況,可以非常直觀的看到服務與服務之間的調用狀態,連線中間的點能點擊,可顯示兩個服務之間鏈路的平均響應時間、吞吐率以及SLA等信息
4.3 追蹤
顯示請求的代碼內部執行情況,一個完整的請求都經過了哪些服務、執行了哪些代碼方法、每個方法的執行時間、執行狀態等詳細信息,快速定位代碼問題
- 左側:端點信息列表(API接口列表),紅色——異常請求;藍色——正常請求
- 右側:請求追蹤列表,請求中連接各端點的先后順序和時間
4.4 性能剖析
- 服務:需要分析的服務
- 端點:鏈路監控中的端點名稱(可以在鏈路追蹤中查看端點信息)
- 監控時間:采集數據的開始時間
- 監控持續時間:采集數據的時間長度
- 起始監控時間:多少毫秒后開始進行采集
- 監控間隔:多少毫秒采集一次
- 最大采樣數:最大采集多少樣本
4.5 日志
參考:微服務鏈路追蹤 Skywalking 生成 Trace ID 以及 logback 日志歸集-CSDN博客
在應用代碼中添加依賴
?展開源碼
<!--skywalking trace工具包-->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>${skywalking.version}</version>
</dependency>
4.6 告警
參考:Skywalking-告警功能實踐_from(endpoint.*).filter(responsecode in [404,500,5-CSDN博客
5、其他相關的配置
5.1 數據清理機制
配置文件路徑:apache-skywalking-apm-bin-es7/config/application.yml
?展開源碼
core:selector: ${SW_CORE:default}default:# 數據清理機制的開關,默認開啟enableDataKeeperExecutor: ${SW_CORE_ENABLE_DATA_KEEPER_EXECUTOR:true}# 數據清理定時器周期,默認5,單位分鐘dataKeeperExecutePeriod: ${SW_CORE_DATA_KEEPER_EXECUTE_PERIOD:5}# 明細記錄數據的有效期,默認3天recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day# 指標數據的有效期,默認7天metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day
5.2 數據存儲和寫入優化(針對ES)
主要是進行bulk 批量寫入調整,buffer 優化等,具體參見《elasticsearch寫入速度優化》
5.3 鏈路過長問題
往往就是循環中調用其他服務 或 循環操作數據庫;或者 定時任務重跑批處理
方案:
1、不加入鏈路追蹤,直接ignore url 配置忽略
2、業務代碼處理,數據庫批量更新操作
6、參考文檔:
【1】Skywalking分布式追蹤與監控(Skywalking分布式追蹤與監控)
【2】破解 Java Agent 探針黑科技?(破解 Java Agent 探針黑科技)
【3】elasticsearch 寫入速度優化 (elasticsearch 寫入速度優化)
【4】SkyWalking 數據清理機制 (SkyWalking 數據清理機制)
【5】開啟Apache SkyWalking的自監控 (開啟Apache SkyWalking的自監控)
【6】Skywalking-告警功能實踐 (Skywalking-告警功能實踐)