由於公司目前有200多微服務,微服務之間的調用關系錯綜復雜,調用關系人工維護基本不可能實現,需要調研一套全鏈路追蹤方案,初步調研之后選取了skywalking和pinpoint進行對比;選取skywalking和pinpoint對比的原因是:兩者都使用探針(agent)技術進行信息采集,集成到項目內時不用修改業務代碼,避免造成后期難以推進的問題;
以下是進行的一些維度的對比,主要從功能性需求和非功能性需求方面做參考:
功能性需求對比
支持協議語言有
Skywalking: Java、C#, PHP, Node
pinpoint:java,php
UI的對比比較
兩種ui相類似,sw服務信息加載速度會快一些
定制化與擴展性比較
都可自定義plugin,使用探針,都可以進行擴展,據說sk擴展性更好
存儲
Skywalking:支持各種類型存儲,es,mysql,h2
pinpoint:只支持hbase
警告
Skywalking:config/alarm-settings.xml設置警告規則
pinpoint:需要額外引入mysql發送警告
jvm監控
都包含,pinpoint相對更全面一些,從頁面查看比較類似
跟蹤粒度
需要使用對應的插件,可以到方法級,展示sql,每個方法調用的時間
服務監控
skywalking支持的維度有:CPU使用率,SLA,RT,CPM(Call Per Minutes)
Pinpoint支持的維度有:CPU使用率,Open File Descriptor,數據源,活動線程數,RT,TPS。pinpoint更多
過濾追蹤
都是用ant風格,sw有對應的插件,更靈活
性能損耗
sw少於pinpoint所消耗的時間
支持中間件
Skywalking:
1.支持開源web容器
2.RPC框架支持更多
3.mq,多支持rocketMQ
4.不支持mssql和mariadb
5.redis支持Jedis,Redisson,Lettuce
PinPoint:
1.支持幾乎所有web容器,
2.少於sw
4.RDBMS/nosql,好於sw
5.不支持redisson
6.不支持log4j2
非功能性需求對比
skywalking pinpoint
是否需要修改代碼 不需要 不需要
相關文檔 官網文檔比較全,支持中文,apache支持 英文文檔
社區 社區活躍,發起人是中國人 韓國人開發,活躍程度類似
發布方式 使用jar包,start.sh腳本啟動 使用war包,依賴web容器
github start 數 9.1k 8.8k
總結
skywalking對國產軟件的支持好於Pinpoint;
Pinpoint的優勢在於:追蹤數據粒度非常細、功能強大的用戶界面,以及使用HBase作為存儲帶來的海量存儲能力。
skywalking的優勢在於:非常活躍的中文社區,支持多種語言的探針,對國產開源軟件非常全面的支持,以及使用es作為底層存儲帶來的強大的檢索能力,並且skywalking的擴展性以及定制化要更優於Pinpoint
從整體上來講,在進行演示和討論的時候,大家普遍認為,skywalking的界面比較現代化一些,pinpoint的功能更為強大;其他一些方面提出的問題,待近期補充:后邊需要繼續調研的點:
1.對公司現有技術棧,兩種方案的支持情況;
2.擴展性及如何進行擴展,擴展之后可以做哪些內容;
3.采樣率如何配置
4.保存時間
5.采樣的策略
6.agent開發方法
7.數據是否有遵循標准
8.nginx是否支持
另外,再討論的過程中,提到了一些問題,有同事提出是否可以用這個工具定位線上的具體都某一次請求的問題? 答案是否定的,因為全鏈路追蹤的定位是展示整體服務調用的拓撲圖,能夠從宏觀描述服務請求鏈路中哪個環節比較慢,給開發者提供優化程序的一個方向;
對於性能消耗,大家也有一些不同的看法,有的業務方,對於20%的性能損耗是不敏感的,但是對於當前線上已經負載比較高,且經常有線上問題的系統,還需要性能消耗方面的調研;
5.zipkin
java by twitter,collector 收集器、storage 存儲、api 查詢api-ui 界面,jdk8 required
接入應用
1.引入zipkin maven dependency
2.java coding ,before after增強自動攔截,把config配置好即可。
public Brave brave(SpanCollector spanCollector){
Builder builder = new Builder("service2");//指定serviceName
builder.spanCollector(spanCollector);
builder.traceSampler(Sampler.create(1));//采集率
return builder.build();
}