前言
首先有必要說明一下為什么使用skywalking泳挥。
我對(duì)zipkin
忿偷、cat
和skywalking
這幾個(gè)較為主流的監(jiān)控產(chǎn)品做了一些調(diào)研和對(duì)比,其中zipkin
是我項(xiàng)目中之前已經(jīng)在使用的,我也寫過一些相關(guān)的文章深员,而cat
僅是通過資料收集并沒有實(shí)際的使用负蠕,可能會(huì)與實(shí)際情況有一定偏差蛙埂,整理以后情況匯總?cè)缦卤恚?/p>
項(xiàng)目 | Cat | Zipkin | Skywalking |
---|---|---|---|
調(diào)用鏈可視化 | 有 | 有 | 有 |
聚合報(bào)表 | 非常豐富 | 少 | 較豐富 |
服務(wù)依賴圖 | 簡(jiǎn)單 | 簡(jiǎn)單 | 好 |
埋點(diǎn)方式 | 侵入式 | 侵入式 | 非侵入,字節(jié)碼增強(qiáng) |
VM監(jiān)控指標(biāo) | 好 | 無 | 有 |
支持語言 | java/.net | 豐富 | java/.net/Nodejs/php/go |
存儲(chǔ)機(jī)制 | mysql(報(bào)表)遮糖、本地文件/HDFS(調(diào)用鏈) | 內(nèi)存绣的、es、mysql等 | H2欲账、es |
社區(qū)支持 | 主要在國(guó)內(nèi) | 國(guó)外主流 | Apache支持 |
使用案例 | 美團(tuán)屡江、攜程、陸金所 | 京東赛不、阿里定制后不開源 | 華為惩嘉、小米、當(dāng)當(dāng)踢故、微眾銀行 |
APM | 是 | 否 | 是 |
開發(fā)基礎(chǔ) | eBay cal | Google Dapper | Google Dapper |
是否支持webflux | 否 | 是 | 是 |
Github stars(2019.12) | 12.3K | 12.2K | 11.8K |
然后根據(jù)上表說一下為什么我選擇用Skywalking
來替換掉已經(jīng)在用的zipkin
文黎,主要理由有以下幾點(diǎn):
- 我的微服務(wù)體系選用的服務(wù)網(wǎng)關(guān)是spring-cloud-gateway,是基于webflux實(shí)現(xiàn)的殿较,很多監(jiān)控并不支持耸峭,比如我司使用的商業(yè)化監(jiān)控產(chǎn)品-聽云,從資料來看
cat
也不支持淋纲; - 我想要監(jiān)控接口級(jí)別的指標(biāo)劳闹,如吞吐量、p99等洽瞬,這些是目前
zipkin
不足的地方本涕,而Skywalking
這方面做得不錯(cuò); - Skywalking是非侵入式的伙窃,通過-javaagent機(jī)制運(yùn)行時(shí)注入菩颖,即使以后更換監(jiān)控方案也不需要對(duì)代碼大動(dòng)干戈。
Skywalking架構(gòu)
我使用的是最新版6.5.0对供,該版本下Skywalking主要分為oap位他、webapp和agent三部分,oap和webapp分別用于匯總數(shù)據(jù)和展示产场,這兩塊共同組成了Skywalking的平臺(tái)鹅髓;agent是探針,部署在需要收集數(shù)據(jù)的應(yīng)用服務(wù)器上京景,并將數(shù)據(jù)同步到Skywalking的平臺(tái)窿冯。
oap配置
在github的Skywalking項(xiàng)目中下載最新版安裝包apache-skywalking-apm-6.5.0.tar.gz
tar -zxvf apache-skywalking-apm-6.5.0.tar.gz
在服務(wù)器上解壓該安裝包,并進(jìn)入config文件夾确徙,對(duì)application.yml
進(jìn)行設(shè)置醒串,主要設(shè)置如下幾個(gè)部分
cluster:
standalone:
我為了試用部署的單機(jī)模式执桌,所以使用默認(rèn)的standalon
,集群部署的話還支持zookeeper
芜赌、consul
仰挣、etcd
、nacos
等缠沈。
core:
default:
# Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
# Receiver: Receive agent data, Level 1 aggregate
# Aggregator: Level 2 aggregate
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
restHost: ${SW_CORE_REST_HOST:0.0.0.0}
restPort: ${SW_CORE_REST_PORT:12800}
restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
這里的restPort
和gRPCPort
分別代表通過rest方式和graphql方式訪問的端口膘壶,沒有特殊需求建議按默認(rèn)配置。
storage:
elasticsearch:
nameSpace: ${SW_NAMESPACE:""} #會(huì)相應(yīng)修改es中存儲(chǔ)的索引的前綴
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.28.51.150:9200} #es訪問地址
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} #支持http和https
# trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
# trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
user: ${SW_ES_USER:"elastic"}
password: ${SW_ES_PASSWORD:"XXXXX"}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# Those data TTL settings will override the same settings in core module.
recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
# 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}
存儲(chǔ)可以支持es洲愤,H2和mysql颓芭,官方比較推薦的是es,所以我也根據(jù)自己的es進(jìn)行了配置柬赐。需要說明的是這里只支持6.3.2 ~ 7.0.0 (excluded)版本的es亡问,使用7.x.x版本的es需要另外下載apache-skywalking-bin-es7.tar.gz
包。
另外肛宋,為了性能考慮州藕,官方建議在es的elasticsearch.yml
配置中增加以下內(nèi)容
thread_pool.index.queue_size: 1000 #只適用于ElasticSearch 6
thread_pool.write.queue_size: 1000 #適用于ElasticSearch 6 and 7
index.max_result_window: 1000000 #trace頁面出錯(cuò)時(shí)記得設(shè)置
webapp配置
webapp的配置文件在/webapp/webapp.yml
中
server:
port: 8080 #訪問頁面使用的端口
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 127.0.0.1:12800
這里默認(rèn)使用graphql
方式訪問oap的數(shù)據(jù)收集端口,因此監(jiān)聽的是12800端口悼吱,并且因?yàn)槲野裲ap和webapp部署在同一臺(tái)服務(wù)器上慎框,地址默認(rèn)就使用了127.0.0.1。
平臺(tái)啟動(dòng)
在/bin
目錄下已經(jīng)有了完備的腳本后添,可以通過startup .sh
同時(shí)啟動(dòng)oap和webapp進(jìn)程笨枯,該腳本實(shí)際做的事情也就是調(diào)用同目錄下的oapService.sh
和webappService.sh
腳本,腳本內(nèi)容如下所示遇西。因此如果我們考慮分開部署這兩個(gè)進(jìn)程的話可以單獨(dú)調(diào)用對(duì)應(yīng)的腳本來運(yùn)行馅精。
#!/usr/bin/env sh
PRG="$0"
PRGDIR=`dirname "$PRG"`
OAP_EXE=oapService.sh
WEBAPP_EXE=webappService.sh
"$PRGDIR"/"$OAP_EXE"
"$PRGDIR"/"$WEBAPP_EXE"
agent的使用
agent的使用需要將/agent
整個(gè)目錄拷貝到對(duì)應(yīng)需要監(jiān)控的服務(wù)器上,并修改/agent/config
下的agent.config
配置
# 不同的namespace會(huì)導(dǎo)致調(diào)用鏈路追蹤中斷
agent.namespace=${SW_AGENT_NAMESPACE:hmall}
# 頁面上展示的service的名稱粱檀,也可以通過-Dskywalking.agent.service_name=xxx指定
agent.service_name=${SW_AGENT_NAME:gateway}
# 平臺(tái)的調(diào)用地址洲敢,也可以通過-Dskywalking.collector.backend_service=127.0.0.1:80指定
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.28.51.141:11800}
# 忽略指定后綴的請(qǐng)求收集
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
# 每3秒的采樣率,負(fù)數(shù)代表100%
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
需要重點(diǎn)關(guān)注的配置如上所示茄蚯,修改完成后在啟動(dòng)java進(jìn)程時(shí)增加-javaagent:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar
以加載agent压彭。
插件使用
默認(rèn)情況agent是不支持對(duì)spring-cloud-gateway
的監(jiān)控的,需要插件的支持渗常。我們要將optional-plugins
下的插件apm-spring-cloud-gateway-2.x-plugin-6.5.0.jar
拷貝到plugins
下壮不,使agent可以加載到該插件,其他一些需要額外插件支持的中間件和框架也是同理操作皱碘。
總結(jié)
部署完成以后效果如圖询一,基本可以滿足我的指標(biāo)監(jiān)控需求,值得一提的是如果配置一切正常卻沒有數(shù)據(jù)顯示的話,一定要檢查右下角的時(shí)間軸對(duì)不對(duì)健蕊,不要問我是怎么知道的菱阵。。缩功。
目前的部署和使用還是基于虛擬機(jī)的晴及,由于我的項(xiàng)目在生產(chǎn)環(huán)境已經(jīng)上容器了,后續(xù)應(yīng)用到線上前會(huì)研究一下如何在容器中部署和使用skywalking
以及如何和注冊(cè)中心結(jié)合達(dá)到高可用掂之。當(dāng)然抗俄,告警規(guī)則的配置也需要琢磨一下。