SkyWalking簡介
SkyWalking是一款高效的分布式鏈路追蹤框架,對於處理分布式的調用鏈路的問題定位上有很大幫助
有以下特點:
-
性能好
針對單實例5000tps的應用,在全量采集的情況下,只增加 10% 的CPU開銷。 -
支持多語言探針
-
支持自動及手動探針
自動探針:Java支持的中間件、框架與類庫列表
手動探針:OpenTrackingApi、@Trace注解、trackId集成到日志中。
本文基於Skywalking 6.2版本,使用自動探針演示效果,Elasticsearch作存儲,由低版本升級到此版本需要刪除ES的全部索引
Docker啟動的環境變量可以設置很多參數,這里只演示最基本的參數,其實Docker版本只是把服務部署在容器的操作系統中,通過查看鏡像的啟動入口腳本,發現只是將配置文件換傳入的參數是否存在輸出配置文件,與一行一行echo類似。。所以想對Docker版本的SkyWalking進行調整,只需要傳入對應的參數名kv對,這里把參數配置地址貼出https://github.com/apache/skywalking-docker/blob/master/6/6.2/oap/docker-entrypoint.sh
目錄結構
.
├── docker-compose.yml
└── .env
文件說明
docker-compose.yml
Docker-compose配置文件.env
環境變量配置文件
配置文件
docker-compose.yml
version: '3.3'
services:
oap:
image: apache/skywalking-oap-server:6.2.0
container_name: skywalking-oap
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
- SW_STORAGE=elasticsearch #Es的存儲
- SW_STORAGE_ES_CLUSTER_NODES=${ES_NODE} # Es的節點地址,從.env文件中取
- TZ=Asia/Shanghai #設定東八區的城市,防止Oap記錄數據時用0時區
ui:
image: apache/skywalking-ui:6.2.0
container_name: skywalking-ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 18080:8080 #默認8080端口,這里設置18080映射到宿主機,可修改
environment:
collector.ribbon.listOfServers: oap:12800
.env
# set default props for docker-compose.yml
# set ES_Cluster or standalone Elasticsearch node. format is "ip:port"
ES_NODE=10.2.7.70:9204
准備工作
- 進入與docker-compose.yml同級目錄
- 查看
11800
、12800
、18080
這三個端口不能被占用,如果已占用,請自行修改docker-compose.yml
的端口號 - 修改
.env
ES_NODE=10.2.7.70:9204 #這里的ip:port應指向Elasticsearch的協調節點,請盡量不要指向主節點和數據節點
啟動服務端
執行docker-compose up -d
查看前端
瀏覽器訪問宿主機ip:18080
,效果如下圖
此圖為已經使用探針后的表現
Agent自動探針采集數據設置
這里的Agent要與OAP的版本保持一致,這里使用6.2版本
Java只需要在VM options中追加格式為
-javaagent:/path/to/path/skywalking-agent.jar
-Dskywalking.agent.service_name=YOUR_APP_NAME
-Dskywalking.collector.backend_service=OAP_SEVER_HOST:gRPC_PORT
舉例如下:
-javaagent:D:/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=eureka-peer2
-Dskywalking.collector.backend_service=10.2.7.70:11800
- 這里僅舉例agent gRPC方式,Restful請求方式默認使用12800端口,請自行對應
/path/to/path
為agent的jar包位置,啟動進程中會讀取config/agent.conf,我們通過-D添加了參數會覆蓋這些配置,所以一個agent包是可以支持多個服務啟動的
效果圖
問題發現與解決
Q1:
graphql.execution.SimpleDataFetcherExceptionHandler -1061995 [qtp1609086753-159] WARN [] - Exception while fetching data (/latencyS) : IDs can't be null java.lang.RuntimeException: IDs can't be null
A1:
此問題為ui端的問題,無需解決,對SkyWalking后端無影響
包括其它IDs can't be null的問題,均為UI端的問題,影響不大,可以忽略
Q2:
探針已經連接成功了,UI端已經顯示終端/端點有連接數,但是無論怎么請求都沒有調用鏈和請求展示
A2:
請檢查操作系統時區設置,SkyWalking默認會讀取當前操作系統的時區設置,如果使用0時區,基於時間戳方式查詢自然不會查詢到結果,所以設置時區為東八區即可,如果是Docker方式,可以使用 -e TZ=Asia/Shanghai
本文系搭建筆記,拒絕轉載