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 攔截器)在手工方法和自動方法兩者之間屬於自動方法。
應有盡有: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模塊:
1.加載配置信息
2.加載插件
3.加載所需服務
4.使用ByteBuddy增強class
5.接入應用
6.部署啟動agent ,程序中簡單配置agentconfig即可。
7.同metrics.namespace