天天看點

SpringCloud 分布式鍊路追蹤、分布式日志系統

​​概述​​

​​Zipkin的使用​​

​​搭建zipkin server​​

​​zipkin dependencies​​

​​在服務中添加zipkin的相關配置​​

​​SkyWalking的使用​​

​​部署skywalking web​​

​​部署服務​​

​​應用日志中輸出trace_id​​

​​分布式日志系統ELK​​

​​logstash的安裝部署​​

​​kibana檢視鍊路資料、日志​​

鍊路追蹤的功能

快速定位鍊路故障

便于檢視鍊路調用流程、服務依賴關系

可分析鍊路耗時,針對耗時多的部分使用多線程、異步、緩存等方式進行優化

鍊路id

trace id:唯一辨別一條鍊路行蹤

span id:唯一辨別一個http請求,對應分布式系統中一個環節

一條鍊路對應一個trace id,往往包含多個span id。

常見的APM (Application Performance Management 應用性能分析管理) 工具

ZipKin:twitter開源的元件,輕量、使用簡單,但要侵入應用代碼,功能單一,隻能檢視鍊路調用流程、各階段的耗時情況。

SkyWalking:國人開源的元件,已成為apache孵化的項目,功能豐富強大,不侵入應用代碼,部署稍複雜。如果要結合elk搭建分布式日志系統,還是會侵入應用代碼。

PinPoint:南韓人開源的元件

Cat:大衆點評開源的元件

skywalking對應用性能的影響最小,zipkin對應用性能的影響居中,如果隻是分析鍊路耗時,優先選擇輕量級的zipkin;如果要分析鍊路調用的更多詳細資訊,優先選擇skywalking。

apm工具一般都支援多種資料存儲方式,比如直接存儲在記憶體中、定時清理,持久化到es、mysql、nosql資料庫中。生産環境一般是持久化鍊路資料到es中。

sleuth埋點、收集鍊路資料,zipkin傳輸、展示鍊路資料。

jar包下載下傳位址:​​https://zipkin.io/pages/quickstart.html​​

通路 ip:9411 即可進入zipkin界面。

存儲作為資料源,UI請求資料源擷取資料展示出來。

更多細節參考:​​https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md​​

zipkin、skywalking都是通過ip:port通路界面,如果隻是單機部署,可以直接開放端口通路;如果是叢集部署,用nginx做代理。

如果鍊路資料持久化存儲,不能直接看到鍊路服務之間的調用關系,需要額外引入zipkin dependencies。

jar包下載下傳位址:​​https://search.maven.org/search?q=g:io.zipkin.dependencies​​

也可去maven倉庫下載下傳。

更多細節可參考:​​https://github.com/openzipkin/zipkin-dependencies​​

網關、消費者、提供者都可以作為zipkin client,注冊中心不需要作為zipkin client,就算注冊中心作為zipkin client,也隻是單獨的一條鍊路。

建立時勾選Spring Cloud Tracing -> Zipkin Client,也可以手動添加依賴

注意:采樣率對性能有影響,采樣率越大越影響應用性能,生産環境采樣率設定低些,測試可設定為1。

日志示例

下載下傳位址:​​http://skywalking.apache.org/downloads/​​

SkyWalking APM -> Distribution -> 選擇合适版本的tar下載下傳

vim config/application.yml

如果 skywalking 8.3 修改application.yml後,儲存時一直提示 檔案已變化,無法儲存修改的内容,可以換一個skywalking版本。

vim webapp/webapp.yml

jps看到有OAPServerStartUp、skywalking-webapp.jar2個程序才算啟動成功,并非看到2個successfully就是啟動成功,如果隻有一個程序,一般是 config/application.yml 中的配置不對。kill -9殺死2個程序即停止。

浏覽器通路 skywalking web的 ip:port 即可進入skywalking的界面。

每部署一個服務時,就拷貝一份skywalking的agent目錄。不管是部署注冊中心、網關、還是其它服務,都這麼做。

編輯拷貝得到的agent的config/agent.config

agent的plugins目錄是已啟用的插件,optional-plugins目錄中是可選的插件。

plugins中預設沒有springcloud getway插件,不支援監控springcloud gateway網關服務。

如果目前要部署的服務是springcloud getway網關服務,需要把optional-plugins中的apm-spring-cloud-gateway-2.1.x-plugin-8.2.0.jar拷貝到plugins中。

其它需要插件支援的中間件和架構也是同理操作。

在kibana中檢視鍊路資料時,有trace_id字段,但服務輸出的日志中沒有trace_id。

可以在各個服務中添加如下配置,使應用輸出的日志中包含trace_id,建議加上這些配置。

pom.xml

logback-spring.xml

ELK(ElasticSearch Logstash Kibana),es用于存儲日志,logstash将各節點的日志傳輸到es上,kibana對es中的日志進行檢視、分析統計。

logstash是一個開源的日志收集引擎,可以實作日志的實時傳輸,可以從多個日志源讀取日志,并進行過濾,傳輸到目的地。支援多種日志源,日志源可以是日志檔案、資料庫、統計表等,可讀取系統日志、伺服器日志、應用日志等。

下載下傳位址:​​https://www.elastic.co/cn/downloads/logstash​​

es、logstash、kibana的版本盡量保持一緻。

修改 config/jvm.options 中的堆記憶體設定

config下建立檔案 logstash.conf

input:指定輸入,可包含多個輸入。如果日志流量大,可以将日志傳輸到kafka,從kafka讀取日志輸入。

filter:對日志過濾處理,常見的插件比如 grok 比對得到指定字段,常用來擷取message中的日志列印時間、trace_id。

output:指定輸出,一般為es、file。

三者都可以包含多個元件,logstash的config下有官方提供的配置模闆logstash-sample.conf,可以照着寫。

input、filter、output的插件使用可參考:​​https://www.elastic.co/guide/en/logstash/current/index.html​​

logstash也是java編寫的,可以jps檢視,kill -9終止。

logstash自帶了jdk,在根目錄下有個jdk的目錄,但版本往往很新,一般不用。

logstash很吃資源,可以使用輕量級的 filebeat 代替。

1、Management -> Stack Management -> Kibana -> Advanced Settings 設定預選項。這些預選項很有用,可以指定Date格式、時間段範圍等。

2、在Index Patterns中指定的index比對規則

3、Kibana -> Discover -> 選擇上一步建立的index比對規則 -> 檢視、篩選document

鍊路資料可以根據 trace_id 字段進行篩選;日志可以根據message字段中的trace_id進行篩選,根據timestamp排序。trace_id可以在skywalking的web頁面中複制。

es日志文檔中自帶了@timestamp字段,但這個隻是logstash接受到日志的時間,并非應用列印日志的時間,根據@timestamp排序看到的日志記錄順序往往有一些出入。最好是在logstash的filter中用grok插件從message中擷取時間,檢視日志時先用trace_id篩選,再根據時間排序。

繼續閱讀