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 攔截器)在手工方法和自動方法兩者之間屬於自動方法。

 

應用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

5.x Architecture

三層:

agent:探針,用來收集和發送數據到收集器

collector:鏈路數據收集器,數據可以落地ElasticSearch等Storage。

Storage&web:web可視化平臺,用來展示落地的數據

image.png

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

接入應用

部署啓動agent ,程序中簡單配置agentconfig即可。同metrics.namespace

Pinpoint VS Skywalking

Pinpoint Skywalking
優勢
  • 大企業/長時間驗證,穩定性和完成度高
  • 探針收集的數據粒度比較細
  • HBase的數據密度較大,支持PB級別下的數據查詢
  • 代碼設計考慮的擴展性較弱,二次開發難度較大
  • 擁有完整的APM和調用鏈跟蹤功能
優勢
  • 數據容器爲ES,查詢支持的維度較多並且擴展潛力大
  • 項目易讀性和擴展性都比較強
  • 主要的研發人員爲華人並且均比較活躍,能夠進行更加直接的溝通
  • 擁有完整的APM和調用鏈跟蹤功能
劣勢
  • 代碼針對性強,擴展較難
  • 探針的額外消耗較多(探針採集粒度細,大概10%~20%)
  • 項目趨於成熟,而擴展難度較大,目前社區活躍度偏低,基本只進行探針的增加或者升級
  • 缺少自定義指標的設計
劣勢
  • 項目發展非常快,穩定性有待驗證
  • ES數據密度較小,在PB級別可能會有性能壓力

 

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大多采用基於面向切面增強的方式,減少程序侵入性及接入成本。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章