天天看點

調用鍊SkyWalking和APM工具選型思考前提

調用鍊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天清理一次。

3. 告警規則配置

最後總結

繼續閱讀