天天看點

十分鐘快速搭建 SkyWalking 服務

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、整體架構

十分鐘快速搭建 SkyWalking 服務

整個架構,分成上、下、左、右四部分:

考慮到讓描述更簡單,我們舍棄掉 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單機環境

十分鐘快速搭建 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 看到下圖内容代表搭建完成。由于還沒有配置服務,因為沒有服務的監控資訊。

十分鐘快速搭建 SkyWalking 服務

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
           
十分鐘快速搭建 SkyWalking 服務

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視圖:

十分鐘快速搭建 SkyWalking 服務

拓撲圖

十分鐘快速搭建 SkyWalking 服務

鍊路追蹤

十分鐘快速搭建 SkyWalking 服務

鍊路追蹤-SQL檢視

十分鐘快速搭建 SkyWalking 服務

參考文獻

  • http://www.iocoder.cn/SkyWalking/install/
  • https://www.jianshu.com/p/a07d05f70eff?from=timeline