全鏈路追蹤目的
微服務背景下
1.故障快速定位
跨語言實現開發中在業務日誌中添加調用鏈ID,可以通過調用鏈結合業務日誌快速定位錯誤信息。
2.各個調用環節的性能分析
分析調用鏈的各個環節耗時,分析系統的性能瓶頸,找到系統的薄弱環節針對性優化
3.數據分析
分析用戶的行爲路徑,經過了哪些服務器上的哪個服務加以應用。
4.調用拓撲圖
Trace系統設計目標
低侵入、低損耗、大範圍部署
基本實現
埋點日誌內容,通過記錄traceId、RPCId、調用的開始時間,調用類型,協議類型,調用方ip和端口,請求的服務名等信息;調用耗時,調用結果,異常信息,消息報文等;
典型應用
非開源:Google的Dapper,淘寶的鷹眼,新浪的Watchman,京東的Hydra
開源:zipkin, pinpoint , skywalking
應用及分析
1.鼻祖:Google Dapper
谷歌tracing論文,關鍵字:低損耗、應用透明的、大範圍部署需求;大規模集羣的跟蹤監控系統;跨應用跨服務器;ops-dev;
應用級透明:把核心跟蹤代碼做的很輕巧,然後把它植入到那些無所不在的公共組件種,比如線程調用、控制流以及RPC庫
實現:爲服務器上每一次你發送和接收動作來收集跟蹤標識符(message identifiers)和時間戳(timestamped events),通過把代碼植入限制在一個很小的通用組件庫,實現監測系統的應用對開發人員的透明。
Dapper的跟蹤模型:
跟蹤樹和span
ABCDE 5個span 組成了userRequest的跟蹤樹。Dapper會記錄span名稱,以及每個span的ID和父ID,以重建在一次追蹤過程中不同span之間的關係。如果一個span沒有父ID被稱爲root span。所有span都掛在一個特定的跟蹤上,也共用一個跟蹤id。所有這些ID用全局唯一的64位整數標示。
一個單獨的span的細節圖:
注意時間戳的正確性處理:由於客戶端和服務器上的時間戳來自不同的主機,我們必須考慮到時間偏差。在我們的分析工具,我們利用了這個事實:RPC客戶端發送一個請求之後,服務器端才能接收到,對於響應也是一樣的(服務器先響應,然後客戶端才能接收到這個響應)。這樣一來,服務器端的RPC就有一個時間戳的一個上限和下限。
注:爲保護Dapper的用戶意外的過分熱衷於日誌的記錄,每一個跟蹤span有一個可配置的總標註量的上限。
Dapper日誌收集管道
span數據寫入(1)本地日誌文件中
然後Dapper的守護進程和收集組件把這些數據從生產環境的主機中拉出來(2)
最終寫到(3)Dapper的Bigtable倉庫中,一次跟蹤被設計成Bigtable中的一行,每一列相當於一個span。
Dapper守護進程在負載測試時的CPU資源使用率
Dapper的數據收集在Google的生產環境中的只佔用了0.01%的網絡資源。
後臺查詢WEB UI
Dapper的“Depot API”或稱作DAPI,對分佈式跟蹤數據一個直接訪問
2.阿里EagleEye
EagleEye (鷹眼)是Google 的分佈式調用跟蹤系統 Dapper 在淘寶的實現(2013)。每次調用分配TraceId、RpcId(dapper中的spanID),放在ThreadLocal的調用上下文上面,調用結束的時候,把TraceId、RpcId打印到訪問日誌。訪問日誌裏面,一般會記錄調用時間、遠端IP地址、結果狀態碼、調用耗時之類,也會記錄與這次調用類型相關的一些信息,如URL、服務名、消息topic等。
優化:通過設置全局採樣開關,用來在運行期控制調用鏈的採樣率(控制打不打日誌)。所謂調用鏈採樣,就是根據TraceId來決定當前的這一次訪問日誌是否輸出
鷹眼sdk寫log ——>storm集羣收集(全量 hdfs;實時hbase)——>鷹眼服務器——>UI
3.Pinpoint
韓國naver, Pinpoint is an APM tool for large-scale distributed systems written in Java / PHP. Inspired by Dapper. Show me demo
Architecture
new release 支持flink處理數據(apache flink:stream vs spark 流式處理來模擬批量處理 )
數據結構:(Span, Trace, 和 TraceId組成)同dapper
Core:字節碼增強
使用字節碼增強技術,不修改代碼就工作。(代碼零侵入,只需要加啓動參數或通過配置文件加載即可)
JAVA字節碼增強(before after 攔截器)在手工方法和自動方法兩者之間屬於自動方法。
應用3步走
1)docker 服務組建一鍵安裝
2)啓動服務,check web UI
3)應用添加配置,一次集成,運行手工. eg. applicationContext-dao-config.xml
<context:component-scan base-package="com.navercorp.pinpoint.web.dao.mysql" /> <!-- SqlsessionFactory setup for MyBatis Database Layer --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- mybatis basic config --> <property name="configLocation" value="classpath:/mybatis-config.xml"/> <!-- typeAliases --> <property name="typeAliasesPackage" value="com.navercorp.pinpoint.web.alarm.vo" /> <!-- setting the location of mapper --> <property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"/> <!-- set "true" in order to catch the errors of declaration of statement more quickly --> <property name="failFast" value="true"/> <property name="plugins"> <list> <!-- use the patch version because of mybatis 3.2's incompatibility--> <bean class="com.navercorp.pinpoint.web.dao.ibatis.BindingLogPlugin32"/> </list> </property> </bean> |
多插件集成
應有盡有:spring全家,mq mw、cache、rpc(dubbo、grpc)、db(hbase、mysql及drivers)……很豐富
4.Skywalking
中國華爲吳晟基於OpenTracking實現的開源項目-2017年加入Apache孵化器,show demo
OpenTracking:OpenTracing爲了解決不同的分佈式追蹤系統 API 不兼容的問題,誕生了 OpenTracing 規範。
Component:
H2:Database Engine
ShardingSphere:Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar
支持多語言多來源多格式數據輸入:java、php、nodejs、go
Architecture
三層:
agent:探針,用來收集和發送數據到收集器
collector:鏈路數據收集器,數據可以落地ElasticSearch等Storage。
Storage&web:web可視化平臺,用來展示落地的數據
Agent埋點實現
字節碼增強:agent java 在類使用之前,增強或修改類的行爲
Byte Buddy:Apache 2.0許可證的開源庫,致力於解決字節碼操作和API的複雜性
public class Agent { public static void premain(String argument, Instrumentation inst) { inst.addTransformer(new ClassFileTransformer() { @Override public byte[] transform( ClassLoader loader, String className, Class<?> classBeingRedefined, // 如果類之前沒有加載的話,值爲null ProtectionDomain protectionDomain, byte[] classFileBuffer) { // 返回改變後的類文件。 } }); } } |
Agent模塊:
- 加載配置信息
- 加載插件
- 加載所需服務
- 使用ByteBuddy增強class
接入應用
部署啓動agent ,程序中簡單配置agentconfig即可。同metrics.namespace
Pinpoint VS Skywalking
Pinpoint | Skywalking |
---|---|
優勢
|
優勢
|
劣勢
|
劣勢
|
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(); } |
6.TODO ONEAPM 優秀產品實現分析(insight全家桶)、騰訊bk-ci、 Prometheus
總結
由上面對主流全鏈路追蹤技術的分析,組件基本都包括一個埋點sdk agent、日誌收集collector、到storage (mysql、es、或bigdata)、最後集成webUI供用戶查看。而sdk大多采用基於面向切面增強的方式,減少程序侵入性及接入成本。