本文涉及源碼都在 這里瞎抛。
Apache Skywalking(Incubator)簡介
Apache Skywalking(Incubator) 專門為微服務(wù)架構(gòu)和云原生架構(gòu)系統(tǒng)而設(shè)計并且支持分布式鏈路追蹤的APM系統(tǒng)璧南。Apache Skywalking(Incubator)通過加載探針的方式收集應用調(diào)用鏈路信息论笔,并對采集的調(diào)用鏈路信息進行分析型奥,生成應用間關(guān)系和服務(wù)間關(guān)系以及服務(wù)指標稠茂。Apache Skywalking (Incubating)目前支持多種語言噪沙,其中包括Java别伏,.Net Core,Node.js和Go語言赔蒲。
目前Skywalking已經(jīng)支持從6個可視化維度剖析分布式系統(tǒng)的運行情況泌神。總覽視圖是應用和組件的全局視圖舞虱,其中包括組件和應用數(shù)量欢际,應用的告警波動,慢服務(wù)列表以及應用吞吐量矾兜;拓撲圖從應用依賴關(guān)系出發(fā)损趋,展現(xiàn)整個應用的拓撲關(guān)系;應用視圖則是從單個應用的角度椅寺,展現(xiàn)應用的上下游關(guān)系浑槽,TopN的服務(wù)和服務(wù)器蒋失,JVM的相關(guān)信息以及對應的主機信息。服務(wù)視圖關(guān)注單個服務(wù)入口的運行情況以及此服務(wù)的上下游依賴關(guān)系桐玻,依賴度篙挽,幫助用戶針對單個服務(wù)的優(yōu)化和監(jiān)控;調(diào)用鏈展現(xiàn)了調(diào)用的單次請求經(jīng)過的所有埋點以及每個埋點的執(zhí)行時長镊靴;告警視圖根據(jù)配置閾值針對應用铣卡、服務(wù)器、服務(wù)進行實時告警偏竟。
英文版文檔:https://github.com/apache/skywalking/blob/master/docs/README.md
中文版文檔:https://skyapm.github.io/document-cn-translation-of-skywalking/
下載并安裝
下載
從 官網(wǎng) 下載合適的壓縮包煮落,如果下載失敗(不知道為啥我下載下來的是個空包)苫耸,可以直接在這個 鏡像網(wǎng)站 下載州邢。.zip
格式是 Windows
版本,.tar.gz
是 Linux
版本, Mac
也用 .tar.gz
褪子。
本次使用的是目前最新穩(wěn)定版
v6.6.0
量淌,而且到時使用Mysql
做數(shù)據(jù)存儲,所以我下載的是這個 壓縮包 嫌褪。
解壓
解壓壓縮包:
tar -zxvf apache-skywalking-apm-6.6.0.tar.gz
大致目錄樹結(jié)構(gòu)如下:
簡單說一下這幾個目錄的作用:
- webapp: UI 前端(
web
監(jiān)控頁面)的jar
包和配置文件呀枢; - oap-libs: 后臺應用的
jar
包,以及它的依賴jar
包笼痛,里邊有一個server-starter-*.jar
就是啟動程序裙秋; - config: 啟動后臺應用程序的配置文件,是使用的各種配置
- bin: 各種啟動腳本缨伊,一般使用腳本
startup.*
來啟動web
頁面 和對應的 后臺應用摘刑;- oapService.*: 默認使用的后臺程序的啟動腳本;(使用的是默認模式啟動刻坊,還支持其他模式枷恕,各模式區(qū)別見 啟動模式)
- oapServiceInit.*: 使用
init
模式啟動;在此模式下谭胚,OAP服務(wù)器啟動以執(zhí)行初始化工作徐块,然后退出 - oapServiceNoInit.*: 使用
no init
模式啟動;在此模式下灾而,OAP服務(wù)器不進行初始化胡控。 - webappService.*: UI 前端的啟動腳本;
- startup.*: 組合腳本旁趟,同時啟動
oapService.*:
昼激、webappService.*
腳本;
- agent:
- skywalking-agent.jar: 代理服務(wù)
jar
包 - config: 代理服務(wù)啟動時使用的配置文件
- plugins: 包含多個插件,代理服務(wù)啟動時會加載改目錄下的所有插件(實際是各種
jar
包) - optional-plugins: 可選插件癣猾,當需要支持某種功能時敛劝,比如
SpringCloud Gateway
,則需要把對應的jar
包拷貝到plugins
目錄下纷宇;
- skywalking-agent.jar: 代理服務(wù)
啟動后端服務(wù)和前端UI
Skywalking
的后端服務(wù)默認使用的數(shù)據(jù)庫是 h2
,而我們需要使用的是 Mysql
蛾方,所以得修改部分配置像捶。該配置文件是目錄 config
下的 application.yml
文件,將 h2
數(shù)據(jù)庫相關(guān)配置注釋掉桩砰,然后 Mysql
部分去掉注釋拓春,并將數(shù)據(jù)庫名、賬號密碼修改一下亚隅。修改完大致如下:
storage:
... 省略部分
# h2:
# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
注:如果沒有創(chuàng)建
skywalking
數(shù)據(jù)庫硼莽,還需要手動創(chuàng)建。
因為 oap-libs
目錄下缺少 mysql
的驅(qū)動程序煮纵,所以還需要下載 mysql-connector-java-*.jar
放到 oap-libs
目錄下懂鸵,這里我使用的版本是 5.1.46
。一般該 jar
包在本地的 maven
倉庫都有行疏,直接拷貝過去即可匆光,一般在目錄 ~/.m2/repository/mysql/mysql-connector-java/5.1.46
下。
$ cd apache-skywalking-apm-bin/bin
# 啟動
$ ./startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
# 查看啟動的服務(wù)
$ jps
17716 RemoteMavenServer
16005 Launcher
4295 OAPServerStartUp
18266 Jps
4301 skywalking-webapp.jar
...
如果看到 OAPServerStartUp
和 skywalking-webapp.jar
酿联,那么代表2個服務(wù)都啟動成功终息。
這時訪問 http://localhost:8080/ 即可看到如下頁面:
至此,Skywalking
的監(jiān)控跟蹤服務(wù)就準備完畢贞让。
跟蹤分布式服務(wù)
從 這里 克隆到本地周崭,本文用到的子項目為 spring-cloud-advance-skywalking
,進入該目錄喳张,可以看到包含如下服務(wù):
- sca-skywalking-discovery:服務(wù)發(fā)現(xiàn)
- sca-skywalking-gateway:網(wǎng)關(guān)
- sca-skywalking-licence:
licence
服務(wù)续镇。里邊部分接口回調(diào)用organization
服務(wù)的接口。 - sca-skywalking-organization:
organization
服務(wù)蹲姐。
啟動服務(wù)
在 安裝Java agent 中磨取,提到了在啟動應用之前,需要配置JVM參數(shù)柴墩,添加 -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar
忙厌。為了方便這里以在 IDEA
中啟動服務(wù)為例:
儀表盤(Dashboard)
啟動4個服務(wù)后,再次訪問 http://localhost:8080/ 江咳,可以看到類似如下:
拓撲圖(Topology)
再看下拓撲圖:
Your_Application_Name: 服務(wù)名
localhost-1: 數(shù)據(jù)庫逢净。因為服務(wù) licence-service
, organization
使用了 H2
數(shù)據(jù)庫
User: 暫時不知道是干啥的,以后知道了再補充(難道是skywalking的用戶服務(wù)?)
那么問題來了爹土,為什么啟動了4個服務(wù)甥雕,這里只有一個 Your_Application_Name
服務(wù)?
其實在 安裝Java agent 中胀茵,有提到需要配置 config/agent.config
中的 agent.service_name
社露。但我們這里需要啟動的服務(wù)有多個,直接配置在文件中肯定不合適琼娘,難道啟動一個服務(wù)改一次峭弟?
我們先來看下 config/agent.config
中的 agent.service_name
配置,如下:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
... 省略前后其他配置
可以看到脱拼,屬性 agent.service_name
的 value
其實是占位符瞒瘸,優(yōu)先使用 SW_AGENT_NAME
的值钞钙,那這個到底是什么呢叹洲?其實是環(huán)境變量,如果啟動時環(huán)境變量 SW_AGENT_NAME
有值的話趴久,那么使用它赌蔑,否則使用默認值 Your_ApplicationName
俯在。
所以這就不難解釋在拓撲圖中看到的只有一個 Your_ApplicationName
,因為所有服務(wù)啟動時惯雳,都使用了同一份 agent.config
配置朝巫,skywalking
認為這4個服務(wù)都是服務(wù)名為 Your_ApplicationName
的4個實例。
所以我們可以在啟動時配置一下環(huán)境變量即可石景。如下:
把4個服務(wù)都配置了 SW_AGENT_NAME
環(huán)境變量后劈猿,重新啟動。
再看下拓撲圖潮孽,會變成下面這樣:
這樣就比較符合我們的預期了揪荣。因為 skywalking
有一定緩存機制,當服務(wù)不可用后往史,不會立即刪除(Your_ApplicationName
)仗颈,等過一段時間后會自動清清除。
請求追蹤
多次訪問 http://localhost:3100/licence/1椎例,然后切到 追蹤 標簽頁挨决,可以看到類似如下:
正常的請求長這樣:
可以看到,一個請求的所有調(diào)用鏈都被記錄下來订歪,包括 Spring MVC
的內(nèi)部轉(zhuǎn)發(fā)脖祈、跨服務(wù)的 http
調(diào)用以及數(shù)據(jù)庫查詢,都完整的記錄下來刷晋,而且也記錄了整個請求以及各個子步驟的耗時盖高。
但是慎陵,有2個問題,第一喻奥,為啥沒有記錄網(wǎng)關(guān)層的調(diào)用鏈席纽?第二,我剛剛其實只請求了幾次撞蚕,為什么會有151頁數(shù)據(jù)润梯?帶著這2個問題,我們繼續(xù)挖掘 Skywalking
的新特性甥厦。
使用 optional-plugins
兼容 SpringCloud Gateway
前面提到仆救,agent
目錄下有 plugins
和 optional-plugins
2個目錄,skywalking-agent.jar
在啟動時會加載 plugins
下的所有插件矫渔,但不會加載 optional-plugins
下的,其實看目錄名就知道了摧莽,可選插件 就是可有可沒有庙洼,需要等需要的時候再加到 plugins
下即可。
我們看到镊辕, optional-plugins
下就有跟 SpringCloud Gateway
相關(guān)的插件油够,那就它了,把它丟到 plugins
目錄下征懈。
但是又有一個問題石咬,為什么 SpringCloud Gateway
這么特殊呢,為啥沒一個類似 apm-spring-cloud-zuul-plugin-6.6.0.jar
的插件呢卖哎?這2個網(wǎng)關(guān)有啥本質(zhì)上的區(qū)別嗎鬼悠?肯定有的啦,一個是同步的亏娜,另一個是異步(底層用了 netty
焕窝,還依賴 spring-webflux
)。另外维贺,我們還注意到另一個插件 apm-spring-webflux-5.x-plugin-6.6.0.jar
它掂,把它也丟到 plugins
目錄下。
最后溯泣,重啟4個服務(wù)虐秋,再訪問 http://localhost:3100/licence/1,可以看到如下:
這樣垃沦,第一個問題就解決了客给。
自定義忽略追蹤部分請求
首先,我們不妨跳到50頁栏尚,如下:
可以看到所有都是跟 eureka
相關(guān)起愈,看到這里只恨,如果你比較熟悉 eureka
的底層邏輯,那么基本就能猜出來啥原因了:EurekaClient
每隔一段時間都會向 EurekaServer
請求續(xù)約抬虽,也可以理解為心跳官觅,還有定時從 EurekaServer
拉取最新的可用的服務(wù)清單。
這種記錄這些請求對我們來說用處不大阐污,而且還會造成大量垃圾數(shù)據(jù)休涤,所以應該避免追蹤,但 Skywalking
并不能自己識別出來笛辟,拿只能我們教它怎么分辨了功氨。
注意到,optional-plugins
中有這樣的插件 apm-trace-ignore-plugin-6.6.0.jar
手幢,把它丟到 plugins
目錄下先捷凄。
加上插件只是讓 Skywalking
擁有忽略某些請求的能力,但還需要我們指定哪些需要忽略围来。下載 配置文件跺涤,然后把它丟到 /agent/config/
目錄下,增加過濾規(guī)則监透。里邊的內(nèi)容如下:
# If the operation name of the first span is matching, this segment should be ignored
# ant path match style
# /path/? Match any single character
# /path/* Match any number of characters
# /path/** Match any number of characters and support multilevel directories
# Multiple path comma separation, like trace.ignore_path=/eureka/**,/consul/**
#trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/eureka/**}
可以看到插件的開發(fā)者已經(jīng)幫我們考慮到 eureka
這種情況了桶错,直接去掉最后一行的注釋即可,當然胀蛮,也可以跟服務(wù)名一樣使用環(huán)境變量配置院刁。另外,eureka-server
因為不是我們的業(yè)務(wù)服務(wù)粪狼,所以可以考慮不對它進行代理退腥,即去掉 JVM
參數(shù)配置。
最后鸳玩,重啟4個服務(wù)阅虫,再訪問 http://localhost:3100/licence/1,可以看到如下:
可以看到清爽很多不跟,沒有太多冗余的請求颓帝。
相關(guān)配置可參考:支持忽略自定義的traceSupport custom trace ignore
相關(guān)鏈接
官網(wǎng):https://skywalking.apache.org/
英文版文檔:https://github.com/apache/skywalking/blob/master/docs/README.md
中文版文檔:https://skyapm.github.io/document-cn-translation-of-skywalking/
配置覆蓋:https://skyapm.github.io/document-cn-translation-of-skywalking/zh/master/setup/service-agent/java-agent/Setting-override.html