Apache SkyWalking
-
- 1、SkyWalking是什麼
- 2、SkyWalking功能
- 3、整體架構
- 4、SkyWalking實戰
-
- 4.1 ElasticSearch搭建
- 4.2 安裝配置SkyWalking
- 5、服務添加至SkyWalking
- 6、SkyWalking UI檢視
1、SkyWalking是什麼
官網位址:http://skywalking.apache.org/
SkyWalking是分布式系統的應用程式性能監視工具,專為微服務、雲原生架構和基于容器(Docker、K8S、Mesos)架構而設計;
SkyWalking是觀察性分析平台和應用性能管理系統。提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案;
2、SkyWalking功能
SkyWalking是一個開源APM系統,包括對Cloud Native體系結構中的分布式系統的監視,跟蹤,診斷功能。 核心功能如下。
- 服務,服務執行個體,端點名額分析
- 根本原因分析
- 服務拓撲圖分析
- 服務,服務執行個體和端點依賴關系分析
- 檢測到慢速服務和端點
- 性能優化
- 分布式跟蹤和上下文傳播
- 資料庫通路名額。 檢測慢速資料庫通路語句(包括SQL語句)。
- 報警
- SkyWalking支援從多種來源和多種格式收集遙測(跟蹤和度量)資料,包括
- SkyWalking格式的Java,.NET Core,NodeJS和PHP自動儀器代理
- SkyWalking格式的手動儀器Go代理。
- Istio遙測格式
- 由Istio控制的服務網格中的Envoy gRPC通路日志服務(ALS)格式
- 特使名額服務格式
- Zipkin v1 / v2格式
- Jaeger gRPC格式
3、整體架構
整個架構,分成上、下、左、右四部分:
考慮到讓描述更簡單,我們舍棄掉 Metric 名額相關,而着重在 Tracing 鍊路相關功能。
- 上部分 Agent :負責從應用中,收集鍊路資訊,發送給 SkyWalking OAP 伺服器。目前支援 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 資料資訊。而我們目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 資料,傳遞給伺服器。
- 下部分 SkyWalking OAP :負責接收 Agent 發送的 Tracing 資料資訊,然後進行分析(Analysis Core) ,存儲到外部存儲器( Storage ),最終提供查詢( Query )功能。
- 右部分 Storage :Tracing 資料存儲。目前支援 ES、MySQL、Sharding Sphere、TiDB、H2 多種存儲器。而我們目前采用的是 ES ,主要考慮是 SkyWalking 開發團隊自己的生産環境采用 ES 為主。
- 左部分 SkyWalking UI :負責提供控台,檢視鍊路等等。
SkyWalking 的中文文檔: https://github.com/SkyAPM/document-cn-translation-of-skywalking
4、SkyWalking實戰
我們實戰搭建一下SkyWalking單機環境
4.1 ElasticSearch搭建
SkyWalking資料持久化支援多種資料源,這裡資料源選擇使用ElasticSearch,版本為V7.4.0。
【注】如果項目中也使用ElasticSearch,不建議SkyWalking與項目使用同一個ElasticSearch。因為SkyWalking會在ES中建立大量索引并且比較消耗記憶體。
ES搭建建議大家使用Docker進行安裝
1、配置參數
sysctl -w vm.max_map_count=262144 &&
grep vm.max_map_count /etc/sysctl.conf
2、下載下傳鏡像
docker pull elasticsearch:7.4.0
3、啟動容器
docker run --name elasticsearch -d \
-v /home/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.4.0
4、配置目錄權限
由于容器目錄映射到主控端目錄,需要給主控端目錄授權。我這裡就省事配置777了。
chmod 777 /home/elk/elasticsearch/data
5、驗證
curl http://127.0.0.1:9200
看到如下結果證明安裝成功
{
"name": "0a50cb561c04",
"cluster_name": "docker-cluster",
"cluster_uuid": "DFu_C31fQwqhzLyTko6wGg",
"version": {
"number": "7.4.0",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "b7e28a7",
"build_date": "2019-04-05T22:55:32.697037Z",
"build_snapshot": false,
"lucene_version": "8.0.0",
"minimum_wire_compatibility_version": "6.7.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
4.2 安裝配置SkyWalking
官方下載下傳位址:http://skywalking.apache.org/downloads/
【注】需要注意版本,我開始使用SkyWalking7.0.0版本,發現無法監控到我的服務,後來我切換到最新 的8.0.1解決了問題。
下載下傳最新版本V8.0.1的Binary Distribution for ElasticSearch 7版本
wget https://mirror.bit.edu.cn/apache/skywalking/8.0.1/apache-skywalking-apm-es7-8.0.1.tar.gz
修改/apache-skywalking-apm-bin-es7/config/application.yml配置檔案中的資料源,預設使用H2,我們切換成ES。
storage:
# 切換資料源
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # The index shards number is for store metrics data rather than basic segment record
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
advanced: ${SW_STORAGE_ES_ADVANCED:""}
elasticsearch7:
# 配置自己安裝ES的nameSpace
nameSpace: ${SW_NAMESPACE:"docker-cluster"}
# 配置ES的連接配接資訊
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.0.4:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
#trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
#user: ${SW_ES_USER:""}
#password: ${SW_ES_PASSWORD:""}
secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # The index shards number is for store metrics data rather than basic segment record
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
advanced: ${SW_STORAGE_ES_ADVANCED:""}
由于SkyWalking UI的預設位址是8080,與很多中間件有沖突,建議大家修改一下
修改apache-skywalking-apm-bin-es7/webapp/webapp.yml
server:
port: 18080
修改agent配置,apache-skywalking-apm-bin-es7/agent/config/agent.config
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.0.4:11800}
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}
**
采樣率修改
agent.sample_n_per_3_secs配置詳解:
在通路量較少時,鍊路全量收集不會對系統帶來多少負擔,同時能夠完整的觀測到系統的運作狀況。但是在通路量較大時,全量的鍊路收集,對鍊路收集的用戶端(應用)、服務端(例如說 SkyWalking OAP Collector)、存儲器(例如說 Elastcsearch)都會帶來較大的性能開銷,甚至會影響應用的正常運作。
是以,在通路量級較大的情況下,我們往往會選擇抽樣采樣,隻選擇收集部分鍊路資訊。SkyWalking Agent 在 agent/config/agent.config 配置檔案中,定義了 agent.sample_n_per_3_secs 配置項,設定每 3 秒可收集的鍊路資料的數量。
啟動SkyWalking
apache-skywalking-apm-bin-es7/bin/startup.sh
通路:http://127.0.0.1:18080 看到下圖内容代表搭建完成。由于還沒有配置服務,因為沒有服務的監控資訊。
5、服務添加至SkyWalking
搭建完成SkyWalking,我們需要将我們的應用服務添加到SkyWalking中。這個也非常簡單。對代碼無任何侵入性。
Idea 配置
如果我們是本地啟動的項目,開發工具使用的IDEA,我們隻需要在如下圖所示地方配置啟動附加資訊即可。
javaagent配置的是agent對應的jar位置。
service_name配置建議使用服務的spring.application.name友善區分。
-javaagent:D:\Develop\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=leimingtech-admin-api
jar啟動配置
我們的應用最終肯定是部署在伺服器上的,因為我們需要在jar啟動的時候配置SkyWalking連接配接資訊。
java -javaagent:/opt/skywalking/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=leimingtech-operation-api -Xms256m -Xmx256m -Xmn250m -jar leimingtech-operation-api.jar
一般生産環境多個服務肯定是部署在不同機器上,這時候可能會有疑問,我是需要在全部機器上都搭建SkyWalking麼?肯定不是的!我們隻需要把SkyWalking中的agent子產品複制到另一台機器即可。
6、SkyWalking UI檢視
啟動完成項目,由于SkyWalking采用懶加載收集模式,我們需要先請求接口才能被SkyWalking監控到。
任意通路一個接口位址。檢視SkyWalking UI。
APM視圖:
拓撲圖
鍊路追蹤
鍊路追蹤-SQL檢視
參考文獻
- http://www.iocoder.cn/SkyWalking/install/
- https://www.jianshu.com/p/a07d05f70eff?from=timeline