APM-全鏈路追蹤


  

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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM