使用 SpringCloud(Gateway) + Skywalking + Mysql 做分布式跟蹤

本文涉及源碼都在 這里瞎抛。

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 CoreNode.jsGo語言赔蒲。

目前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.gzLinux 版本, Mac 也用 .tar.gz 褪子。

本次使用的是目前最新穩(wěn)定版 v6.6.0量淌,而且到時使用 Mysql 做數(shù)據(jù)存儲,所以我下載的是這個 壓縮包 嫌褪。

解壓

解壓壓縮包:

tar -zxvf apache-skywalking-apm-6.6.0.tar.gz

大致目錄樹結(jié)構(gòu)如下:


解壓后的目錄結(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 目錄下纷宇;

啟動后端服務(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
...

如果看到 OAPServerStartUpskywalking-webapp.jar酿联,那么代表2個服務(wù)都啟動成功终息。

這時訪問 http://localhost:8080/ 即可看到如下頁面:

監(jiān)控頁面

至此,Skywalking 的監(jiān)控跟蹤服務(wù)就準備完畢贞让。

跟蹤分布式服務(wù)

這里 克隆到本地周崭,本文用到的子項目為 spring-cloud-advance-skywalking,進入該目錄喳张,可以看到包含如下服務(wù):

目錄結(jié)構(gòu)

  • 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ù)為例:

edit configurations

add jvm params

儀表盤(Dashboard)

啟動4個服務(wù)后,再次訪問 http://localhost:8080/ 江咳,可以看到類似如下:

dashboard

拓撲圖(Topology)

再看下拓撲圖:


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_namevalue 其實是占位符瞒瘸,優(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)境變量即可石景。如下:


add env variables

把4個服務(wù)都配置了 SW_AGENT_NAME 環(huán)境變量后劈猿,重新啟動。

再看下拓撲圖潮孽,會變成下面這樣:


topology

這樣就比較符合我們的預期了揪荣。因為 skywalking 有一定緩存機制,當服務(wù)不可用后往史,不會立即刪除(Your_ApplicationName)仗颈,等過一段時間后會自動清清除。

請求追蹤

多次訪問 http://localhost:3100/licence/1椎例,然后切到 追蹤 標簽頁挨决,可以看到類似如下:

trace with failed request

正常的請求長這樣:
trace

可以看到,一個請求的所有調(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 目錄下有 pluginsoptional-plugins 2個目錄,skywalking-agent.jar 在啟動時會加載 plugins 下的所有插件矫渔,但不會加載 optional-plugins 下的,其實看目錄名就知道了摧莽,可選插件 就是可有可沒有庙洼,需要等需要的時候再加到 plugins 下即可。

我們看到镊辕, optional-plugins 下就有跟 SpringCloud Gateway 相關(guān)的插件油够,那就它了,把它丟到 plugins 目錄下征懈。

image.png

但是又有一個問題石咬,為什么 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,可以看到如下:

trace with springcloud gateway

這樣垃沦,第一個問題就解決了客给。

自定義忽略追蹤部分請求

首先,我們不妨跳到50頁栏尚,如下:


image.png

可以看到所有都是跟 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,可以看到如下:

ignore path

可以看到清爽很多不跟,沒有太多冗余的請求颓帝。

相關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窝革,隨后出現(xiàn)的幾起案子购城,更是在濱河造成了極大的恐慌,老刑警劉巖虐译,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪板,死亡現(xiàn)場離奇詭異,居然都是意外死亡漆诽,警方通過查閱死者的電腦和手機侮攀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門锣枝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兰英,你說我怎么就攤上這事撇叁。” “怎么了畦贸?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵陨闹,是天一觀的道長。 經(jīng)常有香客問我薄坏,道長趋厉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任胶坠,我火速辦了婚禮君账,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沈善。我一直安慰自己杈绸,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布矮瘟。 她就那樣靜靜地躺著,像睡著了一般塑娇。 火紅的嫁衣襯著肌膚如雪澈侠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天埋酬,我揣著相機與錄音哨啃,去河邊找鬼。 笑死写妥,一個胖子當著我的面吹牛拳球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播珍特,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼祝峻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扎筒?” 一聲冷哼從身側(cè)響起莱找,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗜桌,沒想到半個月后奥溺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡骨宠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年浮定,在試婚紗的時候發(fā)現(xiàn)自己被綠了相满。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡桦卒,死狀恐怖立美,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸盔,我是刑警寧澤悯辙,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站迎吵,受9級特大地震影響躲撰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜击费,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一拢蛋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔫巩,春花似錦谆棱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坪郭,卻和暖如春个从,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪沃。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工嗦锐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沪曙。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓奕污,卻偏偏與公主長得像,于是被迫代替她去往敵國和親液走。 傳聞我的和親對象是個殘疾皇子碳默,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容