分布式服務調用鏈路追蹤——Skywalking


 

SkyWalking是什么?

SkyWalking是一個可觀測性分析平台和應用性能管理系統,提供分布式跟蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案,並支持多種開發語言。

官網:http://skywalking.apache.org/

特點:

 

SkyWalking 架構

說明:

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 官方下載安裝包內已包含,最終我們只需考慮存儲設備即可。

 

安裝部署

  • 下載

SkyWalking支持單機與集群部署(默認standalone),並支持多種數據存儲(默認H2),如mysql,Elasticsearch,Elasticsearch7等。

本文以SkyWalking8.4.0並使用Elasticsearch來存儲數據進行講解,ElasticSearch搭建請參考我的另外一篇文章。

SkyWalking下載地址:http://skywalking.apache.org/downloads/

由於要使用Elasticsearch,下載的時候請注意選擇:

根據不同版本,點擊tar后選擇一個地址即可開始下載:

相關操作命令如下:

mkdir -p /opt/soft/skywalking
cd /opt/soft/skywalking
wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/8.4.0/apache-skywalking-apm-es7-8.4.0.tar.gz
tar -xvf apache-skywalking-apm-es7-8.4.0.tar.gz
cd apache-skywalking-apm-bin-es7/
  • 配置

1.web訪問端口 8080 -> 18080 (本機8080已被其它服務占用)

vim /opt/soft/skywalking/apache-skywalking-apm-bin-es7/webapp/webapp.yml
#將server.port: 8080 改為18080

2.修改使用Elasticsearch(默認使用h2)

注意:nameSpace要和Elasticsearch集群的cluster_name一致.

  • 啟動

在啟動 SkyWalking 之前,確保 Elasticsearch 已啟動。

SkyWalking 的啟動包括兩部分,一個是 SkyWalking Collector(oapService) ,一個是 SkyWalking UI(webappService),SkyWalking 解壓后的 bin 目錄:

我們可以分別啟動 oapService 和 webappService,也可以通過 startup 一次性全部啟動。

/opt/soft/skywalking/apache-skywalking-apm-bin-es7/bin/startup.sh

確認應用啟動成功端口正常監聽:

如果出錯可以查看日志並根據錯誤類型進行處理:

  • 驗證

啟動成功后,打開瀏覽器進行查看。ip地址:38080

注:一開始是沒數據的,待項目集成后再刷新頁面就可以看到數據了。

 

項目集成

1. 將skywalking主目錄下的agent目錄,拷貝到各服務所在機器上用作探針:

scp -r /opt/soft/skywalking/apache-skywalking-apm-bin-es7/agent chengjs@192.168.100.12:/opt/skywalking/

2. 修改 agent/config/agent.config 配置文件,也可以通過命令行參數指定。

主要是配置服務名稱和后端服務地址:

# 服務名稱
agent.service_name=${SW_AGENT_NAME:user-center}
# 采集信息的服務地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.12:11800}

當然,也可以在啟動的時候通過環境變量來設置,例如:

-Dskywalking.agent.service_name=masl
-Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800
#skywalking.agent.service_name 服務名稱
#skywalking.collector.backend_service 采集信息的服務地址 agent.config配置了就可以不用指定

3. 最后,在服務啟動的時候用相關命令行參數來指定探針:

  • Linux Tomcat

修改 tomcat/bin/catalina.sh,在首行加入如下信息:

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/skywalking/agent/skywalking-agent.jar"; export CATALINA_OPTS
  • JAR file

在啟動你的應用程序的命令行中添加 -javaagent 參數. 並確保在-jar參數之前添加它. 例如:

java -javaagent:/opt/skywalking/agent/skywalking-agent.jar -jar yourApp.jar

java -javaagent:/opt/skywalking/agent/skywalking-agent.jar 
     -Dskywalking.agent.service_name=masl
     -Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800 
     -jar yourApp.jar
  • IDEA
-javaagent:D:\soft\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=172.16.10.63:11800

4. 訪問應用中服務后訪問skywalking UI界面查看相應信息:

 

其它

  • 日志輸出TraceId

1. pom添加依賴項:

<!--打印skywalking的TraceId到日志-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.4.0</version>
</dependency>

2. logback日志layout使用 org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout,通過%tid輸出trace-id%tid必須小寫):

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>
                    %black(%d{ISO8601}) [%tid] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
                </Pattern>
            </layout>
        </encoder>
    </appender>

3. 訪問相關請求,輸出日志如下:

  • 將方法加入鏈路跟蹤

業務代碼中未被跟蹤的方法,如果需要跟蹤,則:

1. pom添加依賴項:

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.4.0</version>
</dependency>

2. 在方法上添加@Trace注解:

SkyWalking通過AOP實現跟蹤,靜態方法添加@Trace無效,只能用於實例方法;
  • Span中添加自定義Tag

鏈路跟蹤只記錄方法名,不記錄參數值,可通過代碼添加,在當前span上添加tag(必須是被SkyWalking跟蹤的方法):

ActiveSpan.tag("account", account);
ActiveSpan.tag("userId", String.valueOf(userId));

鏈路跟蹤中即查看tag名稱和值:

  • 記錄SQL語句參數值

agent\config\agent.config文件中將plugin.mysql.trace_sql_parameters設為true

  • 自動收集日志

1、skywalking8.4.0版本開始才支持收集日志功能,同時pom需引用以下依賴(version對應skywalking的版本):

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.4.0</version>
</dependency>

2、配置應用中的logback-spring.xml 文件:

<appender name="skywalking-grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"></appender>

同時要開啟日志,且你要輸出日志到文件中,grpc是利用本地日志去上傳的:

<root level="info">
    <appender-ref ref="skywalking-grpc-log" />
</root>

3、打開你的agent/config/agent.config配置文件,添加如下配置信息,注意skywalking的log通信用的grpc:

# 指定要向其報告日志數據的grpc服務器的主機
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:172.16.10.63}
# 指定要向其報告日志數據的grpc服務器的端口 plugin.toolkit.log.grpc.reporter.server_port
=${SW_GRPC_LOG_SERVER_PORT:11800}
# 指定grpc客戶端要報告的日志數據的最大大小 plugin.toolkit.log.grpc.reporter.max_message_size
=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
# 客戶端向上游發送數據時將超時多長時間。單位是秒 plugin.toolkit.log.grpc.reporter.upstream_timeout
=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

注:gRPC報告程序可以將收集到的日志轉發到SkyWalking OAP服務器或SkyWalking Satellite衛星。

4、然后就可以在你的UI界面上看到:

 

功能介紹

這里先着重介紹下 SkyWalking 中最重要的三個概念:

  • 服務(Service) : 表示對請求提供相同行為的一系列或一組工作負載。在使用 Agent 或 SDK 的時候,你可以定義服務的名字。如果不定義的話,SkyWalking 將會使用應用名稱上定義的名字。
  • 服務實例(Service Instance) : 上述的一組工作負載中的每一個工作負載稱為一個實例。就像 Kubernetes 中的 pods 一樣, 服務實例未必就是操作系統上的一個進程。但當你在使用 Agent 的時候, 一個服務實例實際就是操作系統上的一個真實進程。
  • 端點(Endpoint) : 對於特定服務所接收的請求路徑, 如 HTTP 的 URI 路徑和 gRPC 服務的類名 + 方法簽名。

 

儀表盤

  • 儀表盤布局

 skywalking儀表盤分為服務、端點、實例的性能監控。大致結構如下(展示的圖表可以自定義):

  • 服務視角

服務視角有以下的監控數據,可以自定義監視數據圖表的展示:

  • 實例視角

實例儀表盤分析了JVM相關的圖表和請求響應相關的圖表,可以直觀的看到請求或者服務占用等情況。

  • 端點視角

端點儀表盤展示了每個端點的請求響應情況以及延時情況。在端點可以看到影響性能的端點名稱等。

拓補圖

拓補圖可以看到整個微服務的相互作用關系,可以看到整個調用鏈的大致結構,以及服務的類型。方便開發者理解整個系統的架構。

拓補圖可以大致的看出某個服務的運行情況,也可以點擊服務相關內容查看詳細信息。在每個調用鏈上也展示了請求數和延時情況等信息,方便查看者對服務情況大體的了解。

拓補圖內容如下:

追蹤

skywalking鏈路追蹤可以收集整個服務的調用鏈,以及調用情況,執行情況,和參數等。

藍色為調用成功的鏈路,點擊列表可展示鏈路具體的調用信息,查看耗時,參數,執行情況等,方便對鏈路進行分析。

性能分析

skywalking的性能分析,在根據服務名稱、端點名稱,以及相應的規則建立了任務列表后,在調用了此任務列表的端點后。skywalking會自動記錄,剖析當前端口,生成剖析結果,具體流程如圖:

skywalking告警

  • 配置

skywalking告警的配置文件如圖:

 在skywalking目錄的config目錄下的alarm-setings.yml文件中進行配置:

  •  配置規則

具體規格參考:

中文文檔:https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/setup/backend/backend-alarm.md

英文文檔:https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/backend/backend-alarm.md

  • 動態規則

skywalking可以設置動態規則,可以配合nacos或者Zookeeper實現。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM