SkyWalking是什么?
SkyWalking是一個可觀測性分析平台和應用性能管理系統,提供分布式跟蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案,並支持多種開發語言。
官網:http://skywalking.apache.org/
特點:
-
性能好
針對單實例5000tps的應用,在全量采集的情況下,只增加 10% 的CPU開銷。詳細評測見《skywalking agent performance test》。 - 無代碼嵌入,支持眾多中間件
-
支持多語言探針
-
支持自動及手動探針
自動探針:Java支持的中間件、框架與類庫列表
手動探針:OpenTrackingApi、@Trace注解、trackId集成到日志中。
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 已啟動。

我們可以分別啟動 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/apache/skywalking/blob/v8.0.1/docs/en/setup/backend/backend-alarm.md
- 動態規則
skywalking可以設置動態規則,可以配合nacos或者Zookeeper實現。