最近在看分佈式性能監控,調用追蹤功能的系統。看了網上各位大佬的分析,選擇了skywalking。
爲啥選它:適合當前的需求,無侵入,粒度正好知足需求,性能消耗低
一:介紹java
基本信息
SkyWalking:是一個APM(應用程序性能監視器)系統,專門爲微服務,雲原生和基於容器(Docker,Kubernetes,Mesos)的體系結構而設計,包括針對Cloud Native體系結構中的分佈式系統的監視,跟蹤,診斷功能。
其核心功能以下。mysql
性能好:針對單實例5000tps的應用,在全量採集的狀況下,只增長 10% 的CPU開銷
支持多語言探針
支持自動及手動探針:其中手動探針經過OpenTrackingApi、@Trace註解、trackId集成到日誌中。web
2.架構 sql
SkyWalking主要由三大部分組成:Agent(探針),Collector(收集器),Web;數據庫
Agent:做用是使用JavaAgent字節碼加強技術將Agent的代碼織入程序中,完成Agent無代碼侵入地獲取程序內方法的上下文並進行加強和收集信息併發送給Collector;與Collector進行心跳,代表Agent客戶端的存活。
Collector:做用是維護存活的Agent實例,並收集從Agent發送至Collector的數據,進行處理及持久化;
web:做用是將Collector收集的參數進行不一樣維度的展現
二:使用
1:下載SkyWalking後解壓,目錄以下(6.4版本):
agent:探針工具裏面包含可支持的插件,探針的配置等,裏面文件目錄不可改變
config:收集器配置
wabapp:webui配置
2:配置修改
不修改任何配置可直接啓動,默認單節點,如想修改配置或集羣:
application.yml 收集器配置文件修改
collector的集羣我是拷貝了一份skywalking項目,而後修改通訊端口apache
cluster: # 單節點模式 standalone: # zk用於管理collector集羣協做. # zookeeper: # 多個zk鏈接地址用逗號分隔. # hostPort: localhost:2181 # sessionTimeout: 100000 # 分佈式 kv 存儲設施,相似於zk,但沒有zk重型(除了etcd,consul、Nacos等都是相似功能) # etcd: # serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 多個節點用逗號分隔, 如: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 # hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379} core: default: # 混合角色:接收代理數據,1級聚合、2級聚合 # 接收者:接收代理數據,1級聚合點 # 聚合器:2級聚合點 role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator # rest 服務地址和端口 restHost: ${SW_CORE_REST_HOST:localhost} restPort: ${SW_CORE_REST_PORT:12800} restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/} # gRPC 服務地址和端口 gRPCHost: ${SW_CORE_GRPC_HOST:localhost} gRPCPort: ${SW_CORE_GRPC_PORT:11800} downsampling: - Hour - Day - Month # 設置度量數據的超時。超時過時後,度量數據將自動刪除. # 單位分鐘 recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:90} # 單位分鐘 minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:90} # 單位小時 hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:36} # 單位天 dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:45} # 單位月 monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:18} storage: elasticsearch: # elasticsearch 的集羣名稱 nameSpace: ${SW_NAMESPACE:"local-ES"} # elasticsearch 集羣節點的地址及端口 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.2.10:9200} # elasticsearch 的用戶名和密碼 user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} # 設置 elasticsearch 索引分片數量 indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} # 設置 elasticsearch 索引副本數 indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} # 批量處理配置 # 每2000個請求執行一次批量 bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # 每 20mb 刷新一次內存塊 bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # 不管請求的數量如何,每10秒刷新一次堆 flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # 併發請求的數量 concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # elasticsearch 查詢的最大數量 metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} # elasticsearch 查詢段最大數量 segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} mysql: properties: jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://127.0.0.1:3306/skywalking"} dataSource.user: ${SW_DATA_SOURCE_USER:root} dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root} ... #使用mysql時,我是把datasource-settings.properties裏的配置拷貝到這兒。引入的方式遇到問題沒找到沒有解決。 metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
修改\webapp\webapp.ymlwindows
server: #訪問端口 port: 8080 collector: path: /graphql ribbon: ReadTimeout: 10000 # 指向全部後臺的restHost:restPort,若是集羣了,分割 listOfServers: 127.0.0.1:12800,127.0.0.1:12801
\agent\config\agent.config性能優化
# 服務名指定,多服務狀況下經過傳參的方式來指定,後面說 agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # 後臺收集器地址 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800,127.0.0.1:11801}
alarm-settings.yml 告警規則配置文件服務器
#發送告警到指定的服務器地址 webhooks #http://127.0.0.1/notify/ #http://127.0.0.1/go-wechat/
3.啓動
windows下直接啓動bin下startup.bat,可啓動一個collector和一個webui,集羣下模式,我是再啓動拷貝項的oapService.bat。collector和webui也啓動了
啓動項目session
java -javaagent:D:\\project\\apache-skywalking-apm-bin\\agent\\skywalking-agent.jar -Dskywalking.agent.service_name=service-product -jar service-product.jar
-javaagent:#標識後面是一個代理工具
D:\project\apache-skywalking-apm-bin\agent\skywalking-agent.jar :#探針jar的位置
-Dskywalking.agent.service_name:#給參數賦值,傳入啓動的項目名爲:service-product
進入webapp.yml指定的port
三:總結
看到界面內容很豐富,要學習東西仍是挺多的,好比,如何指定監控規則,如何過濾出須要發送到郵件或釘釘的日誌等,這些均可之後續在實際項目中經過需求來作
出現錯誤,必定查看logs文件下日誌,過程當中也遇到了不少問題。因爲當時沒有記錄下來,映像比較深的有:
配置es後,es啓動正常,啓動Collector報錯,日誌提示用要存入數據到es須要指定類型什麼的,大體這樣的
"caused\_by": { "type": "x\_content\_parse\_exception", "reason": "\[5:9\] \[alias\_action\] failed to parse field \[remove\]"
,大概意思是入庫數據格式有誤,mapping沒法解析,用的es7.,說7.不支持,降版本吧,下了6.8,也不支持,換了6.5後能夠了。collector不能自動發現agent的,注意要先啓動collector。若是單節點collector掛了再啓動,就蒐集不到agent了。這個問題還沒搞懂。因此建議作collector集羣