本篇文章記錄了作者在0到1學習SkyWalking的過程,記錄了對SkyWalking的部署,學習,使用Bug解決等等過程
一、什么是SkyWalking
官方文檔:
Apache SkyWalkinghttps://skywalking.apache.org/
SkyWalking 是一個開源的分布式追蹤、性能監控和診斷平臺,特別適合用于管理微服務、云原生以及容器化(如 Kubernetes 和 Docker)架構下的性能問題。它通過提供全面的功能集來幫助用戶有效地監控和優化他們的應用程序和服務。以下是 SkyWalking 的核心特性和組成部分:
1、核心特性
- 追蹤(Tracing):SkyWalking 能夠對分布式系統中的請求進行全鏈路追蹤,記錄請求從進入系統到離開系統的整個流程,包括每個服務的響應時間、調用路徑和異常信息。
- 指標(Metrics):除了追蹤之外,SkyWalking 還可以監控各種關鍵性能指標(KPIs),例如CPU使用率、內存消耗、請求響應時間等,幫助了解系統運行狀態。
- 日志(Logs)和告警(Alert):集成日志管理和告警機制,確保在出現異常情況時能夠及時通知相關人員。
- 支持多種語言和框架:支持Java、.Net、Node.js、Python等多種編程語言,并能與主流的服務網格(如Istio)及中間件(如Kafka、Redis、MySQL)無縫集成。
2、組成部分
- Agent:部署在應用服務中,負責收集性能數據(如tracing和metric數據)并發送給SkyWalking OAP服務器。
- OAP(Observability Analysis Platform)服務器:是SkyWalking的核心,負責接收來自Agent的數據,分析這些數據,并將結果存儲起來供查詢使用。
- UI界面:提供了基于Web的控制臺,使得開發人員和運維人員能夠方便地查看服務調用鏈、性能數據、告警信息等。
- Storage:支持多種存儲后端(如Elasticsearch、MySQL、H2等),用于持久化處理后的數據,以便后續的查詢、分析和報告生成。
通過上述組件的協同工作,SkyWalking為用戶提供了一個強大的工具集,以實現從應用程序到基礎設施的全棧可觀測性,從而顯著提升復雜場景下的系統穩定性和可維護性。特別是在高并發、復雜的微服務架構下,SkyWalking的鏈路追蹤功能對于故障排查、性能瓶頸識別、服務依賴關系分析等方面顯得尤為重要。
3、應用場景
- 性能優化:通過追蹤請求在各個服務中的執行時間、延遲等信息,幫助識別性能瓶頸。例如,可以發現是數據庫查詢還是網絡延遲導致了響應時間過長。
- 故障診斷:當分布式系統中出現錯誤時,鏈路追蹤可以幫助快速定位問題的根源,了解錯誤是在哪個服務或哪個環節發生的。
- 服務依賴關系分析:展示不同服務之間的調用關系,幫助團隊理解服務間的依賴性,從而優化服務架構,減少不必要的復雜性和冗余。
- 系統監控:不僅限于故障排查,鏈路追蹤還能夠實時監控系統的運行狀態,如各服務的響應時間、調用頻率和錯誤率,及時發現異常并采取措施。
4、為什么鏈路追蹤對分布式系統至關重要?
在分布式系統中,服務的數量和復雜性往往使得問題的定位變得非常困難。以下是鏈路追蹤至關重要的幾個原因:
- 跨服務請求的可視化:鏈路追蹤提供了一個統一的視角來觀察跨多個服務的請求流動情況,這在傳統的單機應用中是相對簡單的任務,但在微服務架構中卻變得極為復雜。
- 準確的問題定位:在分布式環境中,一個用戶請求可能會經過多個服務,每個服務都可能成為潛在的故障點。鏈路追蹤能夠幫助準確定位到具體的故障服務或操作,而不是盲目地檢查所有可能的地方。
- 性能瓶頸的識別:通過對請求處理時間和路徑的詳細記錄,鏈路追蹤能夠幫助識別出哪些服務或操作是最耗時的,從而有針對性地進行優化。
- 服務間依賴的理解:隨著服務數量的增長,理解服務間的相互依賴變得越來越困難。鏈路追蹤能夠清晰地展示這些依賴關系,有助于優化整個系統的架構設計。
- 提升系統的可維護性和穩定性:通過及時發現問題、優化性能瓶頸以及更好地理解服務間的依賴,鏈路追蹤有助于提高系統的整體穩定性和可維護性,尤其是在高并發和復雜的業務場景下尤為重要。
二、部署SkyWalking OAP和SkyWalking UI
這里提供兩種部署方式,一個是解壓壓縮包啟動其Java服務部署,一個是Docker部署。
這邊建議docker部署,因為比較便捷,部署和關閉服務都比較方便
但是第一種的話,定制化靈活性更高一些
1、部署其內置Java服務
1.下載SkyWalking APM 壓縮包
手動下載
Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/
鏈接下載
https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gz
2.解壓壓縮包
隨便上傳到服務器某個路徑,自己找得到就行
cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-apm-10.2.0.tar.gz
查看bin目錄下的文件
cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
一般來說linux啟動應用的都是
./startup.sh
3.修改配置文件
修改webapp配置
進入webapp目錄下修改端口
http://IP+:12800
修改skywalking服務配置
進入config目錄下修改一些配置
觀察到服務注冊這里,默認走的單機模式,下面還有zookeeper、nacos等注冊中心,加入需要切換調整上面配置即可,這里我選的默認。
假設你需要使用nacos作為配置中心,可以按下述描述進行修改配置
cluster:selector: ${SW_CLUSTER:nacos} # 設置為 nacosnacos:serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 注冊的服務名稱hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} # Nacos 地址namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} # Nacos 命名空間contextPath: ${SW_CLUSTER_NACOS_CONTEXT_PATH:""} # Nacos 上下文路徑(可選)username: ${SW_CLUSTER_NACOS_USERNAME:""} # Nacos 用戶名(如果啟用了認證)password: ${SW_CLUSTER_NACOS_PASSWORD:""} # Nacos 密碼(如果啟用了認證)accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""} # Nacos 訪問密鑰(可選)secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""} # Nacos 秘鑰(可選)internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""} # 內部通信主機(可選)internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1} # 內部通信端口(可選)
配置存儲數據庫:
這里的解釋我用AI給大家解釋一下:
默認是這個banyandb,但是實際上我們使用ES比較多,關于如何使用ES進行配置如下:
如果想要學習怎么docker部署ES,可以看我下面的博客:
Springboot中使用Elasticsearch(部署+使用+講解 最完整)_spring boot elasticsearch-CSDN博客文章瀏覽閱讀8k次,點贊34次,收藏72次。最完整最詳細的springboot中使用es,在前面有服務器部署es相關的東西,在后面有使用java的實戰,對于實戰的方法使用結合官網深度去研究和講解。在這篇文章前面是實戰,后面是具體講解~~~如果只想實戰就只看一和二,深入了解就繼續看,在未來還會繼續更新對這個實戰,還有es技術的更新,幾萬字大長文。_spring boot elasticsearchhttps://blog.csdn.net/qq_73440769/article/details/141477177?spm=1001.2014.3001.5502修改 SkyWalking 配置文件:
storage:selector: ${SW_STORAGE:elasticsearch} # 設置為 elasticsearchelasticsearch:namespace: ${SW_NAMESPACE:""} # 命名空間(可選)clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # Elasticsearch 地址protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} # 協議,默認為 httpconnectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000} # 連接超時時間(毫秒)socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000} # 套接字超時時間(毫秒)responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000} # 響應超時時間(毫秒)numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0} # HTTP 客戶端線程數(默認為 0)user: ${SW_ES_USER:""} # 用戶名(如果啟用了認證)password: ${SW_ES_PASSWORD:""} # 密碼(如果啟用了認證)dayStep: ${SW_STORAGE_DAY_STEP:1} # 每個索引的時間跨度(天)indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # 每個索引的分片數indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 每個索引的副本數
?查看ES狀態是否正常:
ES部署的服務器IP+:9200
4.啟動SkyWalking OAP和UI
開放端口
在一開始我只開啟IPv4的端口的時候是沒問題的,但是后來重啟服務器發現報了下面的錯誤
2025-03-31 14:18:11,350 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - verboseExceptions: rate-limit=10 (default)
2025-03-31 14:18:11,521 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - useEpoll: true (default)
2025-03-31 14:18:11,560 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - annotatedServiceExceptionVerbosity: unhandled (default)
2025-03-31 14:18:12,394 - com.linecorp.armeria.common.Flags - 635 [main] INFO [] - Using Tls engine: OpenSSL BoringSSL, 0x1010107f
2025-03-31 14:18:12,551 - com.linecorp.armeria.common.util.SystemInfo - 525 [main] INFO [] - IPv6: disabled (no IPv6 network interface)
找了很久bug后,我思索我也沒開IPv6啊,唯一想到的就是自己監控的服務器部署了小程序,小程序使用的可能是IPv6,索性不繼續找配置文件的bug了,向困難低頭,我就多開個IPv6的端口,結果問題真就解決了:
?配置java環境
建議先配置環境再啟動
如果啟動出現:
下面提供兩種配置方式,選擇一個即可,建議第二個,如果已經配置了全局java環境可以忽略這一步。
(1)修改配置文件,指定jdk目錄
替換這兩個為你jdk的目錄
(2)配置Java的home位置
添加這些配置,根據你的jdk位置為準
export JAVA_HOME=/www/server/java/jdk-17.0.8/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
如果不配置會出現這兩個錯誤
啟動后可以查看日志文件:
?參考如下AI解釋:
啟動服務
cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
./startup.sh
查看日志:
查看有無報錯,沒有報錯就是啟動成功
訪問:IP+:8902
5.如何關閉服務
個人覺得,應該也可以寫個stop.sh進行自己關閉,不過需要自己去編寫配置文件
分別關掉這兩個進程,注意PID根據實際的選擇
sudo lsof -i :8902
sudo lsof -i :12800
kill -9 +PID
2、docker部署
1. 創建Docker網絡(便于容器間通信)
docker network create skywalking-net
2. 部署SkyWalking OAP Server
docker run -d --name skywalking-oap \--network skywalking-net \--restart always \-e SW_STORAGE=elasticsearch \-e SW_STORAGE_ES_CLUSTER_NODES=IP:9200 \-p 11800:11800 \-p 12800:12800 \apache/skywalking-oap-server:10.2.0
建議部署完oap后過一會再部署ui,因為如果oap沒完全啟動的話,ui也會因為連不上oap報錯,直到oap完全啟動后ui才正常
3. 部署SkyWalking UI
docker run -d --name skywalking-ui \--link skywalking-oap \--network skywalking-net \--restart always \-e SW_OAP_ADDRESS=http://skywalking-oap:12800 \-p 10800:8080 \apache/skywalking-ui:10.2.0
?記得開啟上面這些端口,還有注意下面部署UI的地方有個-link連接別漏了
如果希望自定義oap的內存,不希望他啟動占用內存太大,可以參考下面的指令:
docker run -d --name skywalking-oap \--network skywalking-net \--restart always \-e SW_STORAGE=elasticsearch \-e SW_STORAGE_ES_CLUSTER_NODES=IP:9200 \-e JAVA_OPTS="-Xms512m -Xmx1g" \-p 11800:11800 \-p 12800:12800 \apache/skywalking-oap-server:10.2.0
4.驗證部署
-
訪問UI:
http://服務器IP:10800
-
檢查OAP日志:
docker logs -f skywalking-oap
docker logs -f skywalking-ui
到這里基本上就結束了,后續有些注意事項
5.注意
-
確保ES服務已啟用且網絡可達
-
如果ES有認證,需添加以下環境變量:
-e SW_ES_USER=用戶名 \
-e SW_ES_PASSWORD=密碼 \
-
默認使用ES索引分片數1、副本數1,如需調整可添加:
-e SW_STORAGE_ES_INDEX_SHARDS_NUMBER=分片數 \
-e SW_STORAGE_ES_INDEX_REPLICAS_NUMBER=副本數 \
6.怎么停止
docker stop skywalking-oap skywalking-ui
docker rm skywalking-oap skywalking-ui
docker network rm skywalking-net
分別的意思是:停止容器運行,刪除容器,刪除容器的網絡
7.怎么啟動容器
docker start skywalking-oap skywalking-ui
docker restart skywalking-oap skywalking-ui
分別是啟動和重啟
三、Skywalking-agent代理Java服務
1、下載Skywalking-agent
Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/
2、下載后解壓進服務器
cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-java-agent-9.4.0.tgz
3、修改代理配置?agent.config
可以通過ctrl+F定位到這兩個配置:
agent.service_name
collector.backend_service
修改服務名稱
?我會起有具體意義的名稱
4、準備java服務
這個就是我自己的jar服務,進行配置代理檢測
nohup /www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar \> /www/wwwroot/quick_pickup_java/app.log 2>&1 &
或者在啟動命令中添加:
/www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar
AI解釋:
5、啟動Java服務
啟動服務后出現:
至此完成部署。
四、UI使用教程
大家可以查看官方中文文檔的這個UI介紹,我覺得這里講的很詳細:
https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.mdhttps://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.md
這里我主要講幾點:
1、常規服務-服務
儀表盤
主要關心這四點:節點成功率,平均響應時間,加載時間,整體服務性能,根據上面幾個指標去鏈路追蹤。
拓跋結構
這里展示你的系統的總體拓跋結構
鏈路
其實你會發現在儀表盤那邊也可以進入具體每個接口的鏈路追蹤
2、常規服務-虛擬數據庫
點擊即可進行具體的鏈路追蹤
2、常規服務-虛擬緩存
4、常規服務-虛擬消息隊列
5、SkyWalking自監控
上面可以看出,SkyWalking很強勢的將你的服務鏈路到的具體服務都鏈路分析出來
五、SpingBoot代碼中自定義追蹤
1、為什么
比如說我要追蹤這個接口:
這里我就可以進行一個鏈路的追蹤,可以看到這個接口的一些鏈路信息,但是我如果想要看到這個方法里面的一些具體的信息,結果可以看到
發現系統中是默認不會鏈路追蹤代碼里面的一些業務信息,所以這里就需要我們在后端代碼中加一些配置信息進行自定義追蹤接口的信息。
2、引入依賴
大家可以去選擇自己喜歡的版本:
https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0
<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.4.0</version>
</dependency>
?
3、選擇鏈路的接口
4、部署服務器觀察
出現我們剛剛定義的鏈路名稱,不過點擊可以發現
5、對查看鏈路的內容添加注解和 API進行增強
@Trace(operationName="user-store-getByClassification")@Tags({@Tag(key = "classificationId", value = "arg[0]") // 動態獲取 classificationId})@Overridepublic List<StoreVO> selectByClassification(Long classificationId) {String key = RedisConstant.STORE_CLASSIFICATION_ + classificationId;try {// 查詢 Redis 中是否存在店鋪數據List<StoreVO> storeVOList = (List<StoreVO>) redisTemplate.opsForValue().get(key);if (storeVOList != null && !storeVOList.isEmpty()) {log.info("從 Redis 中獲取店鋪數據");ActiveSpan.tag("result", "Redis hit"); // 記錄 Redis 命中return storeVOList;}// 查詢數據庫storeVOList = iStoreService.getByClassification(classificationId);if (storeVOList == null || storeVOList.isEmpty()) {// 防止緩存穿透List<StoreVO> cacheThoughtStoreVOList = getCacheThoughtStoreVOList();redisTemplate.opsForValue().set(key, cacheThoughtStoreVOList, 5L, TimeUnit.MINUTES);ActiveSpan.tag("result", "Cache penetration prevention"); // 記錄緩存穿透return cacheThoughtStoreVOList;}// 將查詢結果存儲到 Redis 中redisTemplate.opsForValue().set(key, storeVOList);ActiveSpan.tag("result", "DB query success"); // 記錄數據庫查詢成功return storeVOList;} catch (Exception e) {// 記錄錯誤信息到鏈路中ActiveSpan.error(e); // 記錄異常ActiveSpan.tag("error", e.getMessage()); // 自定義錯誤標簽log.error("查詢店鋪數據失敗,分類ID: {}, 錯誤信息: {}", classificationId, e.getMessage(), e);throw new StoreException("根據店鋪類型分類id查詢店鋪接口出錯");}}
6、關鍵點解析
1. @Trace
注解
@Trace(operationName = "user-store-getByClassification")
定義了鏈路操作名稱。- 這會使該方法成為一個獨立的 Trace 節點,SkyWalking 會自動記錄該方法的執行時間。
2. @Tags
和 @Tag
注解
- 使用
@Tags
和@Tag
注解可以動態地將方法參數或返回值綁定到鏈路中。 - 在這個例子中:
@Tag(key = "classificationId", value = "arg[0]")
動態獲取方法的第一個參數(即classificationId
)。
3. ActiveSpan
API
ActiveSpan
是 SkyWalking 提供的一個工具類,用于在運行時動態向鏈路中添加標簽或記錄錯誤。- 常用方法:
ActiveSpan.tag(String key, String value)
:添加自定義標簽。ActiveSpan.error(Throwable throwable)
:記錄異常信息。ActiveSpan.error()
:標記當前 Span 為錯誤狀態。
4. 記錄 Redis 和數據庫查詢結果
- 使用
ActiveSpan.tag("result", "xxx")
記錄 Redis 命中、緩存穿透、數據庫查詢成功等信息。 - 這些標簽可以幫助你在 SkyWalking UI 中快速定位問題。
5. 異常處理
- 捕獲異常后,調用
ActiveSpan.error(e)
和ActiveSpan.tag("error", e.getMessage())
將錯誤信息記錄到鏈路中。 - 同時,打印日志以便進一步排查問題。
7、線上測試
說到這個線上測試,其實還是我錯誤的在一個未攔截用戶線程的接口里面用線程TreadLocal去獲取用戶ID用來測試自己寫的SkyWalkinh能不能輸出日志,在上面案例可以看到我用到的用戶的ID來放在下面這個地方:
線上事故鏈路如下:
修改完成后,發現這些具體的屬性都有了:
六、參考
參考這些大佬的文章:
分布式監控Skywalking安裝及使用教程(保姆級教程)-CSDN博客文章瀏覽閱讀8.9k次,點贊47次,收藏91次。本文主要講解分布式鏈路追蹤監控系統Skywalking的安裝及使用教程,從0到1,圖文并茂的保姆級教程。SkyWalking是一款用于分布式系統跟蹤和性能監控的開源工具。它可以幫助開發人員了解分布式系統中不同組件之間的調用關系和性能指標,從而進行故障排查和性能優化。它支持多種語言和框架,包括Java、.NET、Node.js等。它通過在應用程序中插入代理或使用特定的SDK來收集跟蹤數據,并將這些數據發送到SkyWalking服務器進行分析和展示。分布式跟蹤。_skywalking安裝https://blog.csdn.net/chang_mao/article/details/135998660?spm=1001.2014.3001.5502
【第二十二篇】商城系統-Skywalking鏈路追蹤【商城系統完結篇】-騰訊云開發者社區-騰訊云??Skywalking是由國內開源愛好者吳晟開源并提交到Apache孵化器的產品,它同時吸收了Zipkin /Pinpoint /CAT 的設計思路。特點是:支持多種插件,UI功能較強,支持非侵入式埋點。目前使用廠商最多,版本更新較快。https://cloud.tencent.com/developer/article/2135248?policyId=1003
SkyWalking入門搭建【apache-skywalking-apm-10.0.0】_skywalking10.0.0版本部署-CSDN博客文章瀏覽閱讀3.4k次,點贊27次,收藏38次。SkyWalking在Java中使用的是字節方式植入,是完全無代碼侵入的VM options 添加,就是剛剛上面下的 java-agentEnvironment variables 添加,指定 SkyWalking的地址效果圖操作步驟(idea 2023,其它版本百度操作)配置好后,啟動服務會看到下面的日志,就說明 java-agent.jar 讀取到了隨機訪問幾下服務的接口,再去刷新SkyWalking 控制臺,就可以看到了。_skywalking10.0.0版本部署https://blog.csdn.net/Tomwildboar/article/details/140589444
還有通義,DeepSeek,ChatGPT,文心一言幾位大神。