調用鍊SkyWalking和APM工具選型思考
- 前提
-
- 選型
-
- 1. 內建方式的考慮
- 2. 存儲方式修改為Mysql
- 3. 告警規則配置
- 最後總結
前提
項目用的是SpringCloud全家桶,是以剛開始在調研調用鍊工具的時候,選擇了zipkin,SpringSleuth内部就內建了zipkin,在集中到項目中使用了一段時間之後,發現功能太弱了,如apm、告警等,如果要增加功能,需要自己去定制。後面我們又增加了admin來監控微服務的狀态,還有之前的durid可以檢視sql的整體性能,随着業務增加,線上用sharding-jdbc作了分庫分表,durid插件失效,無奈,需要一個新的調用鍊工具,同僚能滿足apm和告警的功能。
選型
在網上找了一些對比的幾個工具,一般比較常用的有Zipkin,Pinpoint,CAT,SkyWalking,Jaeger
其中Zipkin已經內建過,功能比較簡單,需要定制開發,Jaeger由Zipkin發展而來,也是代碼侵入式的,簡單比較如下:
類别 | Zipkin | Jaeger | Pinpoint | SkyWalking | CAT |
---|---|---|---|---|---|
實作方式 | 攔截請求,發送(HTTP,mq)資料至zipkin服務 | 攔截請求,發送(HTTP,mq)資料至z服務 | java探針,位元組碼增強 | java探針,位元組碼增強 | 代碼埋點(攔截器,注解,過濾器等) |
頁面UI | ** | *** | ***** | **** | ***** |
資料存儲 | ES,mysql,Cassandra,記憶體 | ES,mysql,Cassandra,記憶體 | Hbase | ES,H2,mysql | mysql,hdfs |
SkyWalking在UI和內建方式上比較有優勢,還可以開發插件針對不同的端,ShardingSphere裡可以支援SkyWalking(有ShardingSphere插件)。
1. 內建方式的考慮
SkyWalking有agent,collector,UI,其中agent需要通過javaagent在服務啟動的時候加進去,collect和UI支援叢集部署,完全是非侵入式的。
agent的部署配置,官方裡支援4種方式,https://skyapm.github.io/document-cn-translation-of-skywalking/zh/master/setup/service-agent/java-agent/Setting-override.html
系統屬性,agent選項,系統環境變量,配置檔案,配置可有覆寫,
agent選項 > 系統屬性(-D) > 系統環境變量 > 配置檔案
SkyWalking在收集資料時需要區分不同來源的service_name,如果一個台機器部署有多個服務,用一個agent的時候用配置檔案顯然不同滿足需求,如果複制多個agent用戶端,其實完全沒必要,維護替換成本更高,好的方式應該是用一個agent,然後各個微服務用各自的配置。
這樣來看,agent選項算是最佳的方式了:
示例:
-javaagent:/path/to/skywalking-agent.jar=agent.application_code=31200,logging.level=debug
每個服務可以在啟動指令加上agent選項。
我們的微服務是用SpringBoot的jar方式啟動的,有自己的啟動指令,還有專門的腳本,通過yaml.sh工具擷取服務名,可以實作動态的加載。
YamlParse__parse() {
local prefix=$2
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
sed -ne "s|^\($s\):|\1|" \
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
awk -F$fs '{
indent = length($1)/2;
vname[indent] = $2;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length($3) > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
}
}'
}
start.sh中加入變量
application.yml中有如下參數:
spring:
application:
name: boot-platform-server
最後在啟動指令中加入:
# java agent must be /injoy/server/apache-skywalking-apm-bin/agent
if [ -d "/injoy/server/apache-skywalking-apm-bin/agent" ]
then
export JAVA_OPTS="$JAVA_OPTS -javaagent:/injoy/server/apache-skywalking-apm-bin/agent/skywalking-agent.jar=agent.service_name=$APPLICATION_NAME,logging.level=info"
fi
這樣就可以動态去實作了,約定大于配置,如果伺服器上沒有agent目錄,可以不用加載,同時可以修改目錄檔案,更加靈活。
2. 存儲方式修改為Mysql
修改配置檔案application.yml的storage配置項
storage:
# elasticsearch:
# nameSpace: ${SW_NAMESPACE:""}
# clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
# user: ${SW_ES_USER:""}
# password: ${SW_ES_PASSWORD:""}
# 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:2000} # Execute the bulk every 2000 requests
# bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb
# 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
# metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
# segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
# h2:
# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
mysql:
metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
然後需要修改datasource-settings.properties配置檔案,增加db配置
jdbcUrl=jdbc:mysql://xx.xx.xx.xx:3306/swtest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
dataSource.user=root
dataSource.password=iflytek
dataSource.cachePrepStmts=true
dataSource.prepStmtCacheSize=250
dataSource.prepStmtCacheSqlLimit=2048
dataSource.useServerPrepStmts=true
dataSource.useLocalSessionState=true
dataSource.rewriteBatchedStatements=true
dataSource.cacheResultSetMetadata=true
dataSource.cacheServerConfiguration=true
dataSource.elideSetAutoCommits=true
dataSource.maintainTimeStats=false
值得注意的是,由于監控資料很多,mysql的資料量增加的非常快,如果是線上環境需要1-3天清理一次。