基于追蹤到的數據流信息,進行數據鏈路分析。這包括確定數據鏈路中的瓶頸、延遲、錯誤和數據丟失等問題。通過分析數據鏈路,可以找出導致問題的環節,并提供相應的優化和改進建議。
在全鏈路消息跟蹤中,數據流的跟蹤和解析是一個關鍵步驟,數據流的跟蹤通常通過在系統中埋點或攔截關鍵節點的方式實現。當消息經過這些節點時,會記錄相關的信息,如消息的內容、時間戳、發送者和接收者等。這些信息可以被捕獲和存儲,用于后續的分析和追蹤。
目前我們設計模式中有三種方式來進行鏈路數據的跟蹤。
基于日志的實現方法是消息全鏈路跟蹤的一種常見方式。它通過在每個服務或組件中記錄相關的日志信息來實現消息的跟蹤和監控。下面是基于日志的實現方法的流程:


基于日志的實現方法相對簡單且易于擴展,因為它借助于已經存在的日志記錄機制和工具。然而,它也存在一些限制,如日志量的增加、日志傳遞的開銷和跨服務邊界的上下文傳遞等挑戰。因此,在實際應用中,通常需要結合其他技術和方法,如注入式跟蹤和集成式跟蹤系統,來實現更全面和高效的消息全鏈路跟蹤。
基于注入的實現方法是消息全鏈路跟蹤的另一種常見方式。它通過在消息傳遞路徑上的每個服務或組件中插入代碼來實現消息的跟蹤和監控。下面是基于注入的實現方法的流程:

基于注入的實現方法具有較高的靈活性和精確度,因為它可以直接在代碼中插入跟蹤邏輯。然而,它也需要在每個服務或組件中進行修改和注入代碼,對現有代碼的侵入性較大。此外,注入的實現方法可能需要更多的開發工作和技術支持,以確保正確的跟蹤邏輯和數據收集。
從前面兩種實現方式來看,對于現有系統代碼的侵入性相對都比較強,對于已經運營的生產系統來說不是最友好的方式,且定制化高,不易于擴展和維護。因此,就有了第三種實現方法——基于AOP的實現消息記錄。
AOP通過將橫切的信息收集點從業務邏輯中抽象出來,使得信息收集點的實現可以集中在一個地方,提高了代碼的模塊化和可維護性,減少代碼冗余。其次,AOP使得信息收集點的配置和管理更加集中化,可以更方便地管理和修改信息收集點的實現。
基于AOP的實現方法,當然也有它特有的實現步驟:

通過基于AOP的實現方法,可以在關鍵的方法調用或消息傳遞上插入跟蹤邏輯,實現消息全鏈路跟蹤。這種方法具有較強的靈活性和可擴展性,可以適用于分布式系統。
在實現全鏈路消息跟蹤時,存儲和索引跟蹤數據是關鍵的一步。存儲和索引跟蹤數據可以幫助實現對消息的快速檢索、分析和查詢,從而支持故障排查、性能優化和系統監控等任務。以下是采用的數據存儲方式:
數據庫存儲:每個消息可以作為一個記錄,包含相關的字段(例如鏈路追蹤標識符、時間戳、消息唯一標識、傳遞路徑等)。使用數據庫的查詢功能可以對跟蹤數據進行靈活的檢索和分析。
搜索引擎跟蹤:為了支持快速的數據檢索和查詢,以及報文數據的模糊搜索,可以使用搜索引擎支持復雜數據的查詢。我們使用Elasticsearch作為消息詳細信息的存儲引擎,和數據庫存儲結合,通過建立索引來加速對跟蹤數據的查詢。索引可以基于消息的關鍵字段(如鏈路追蹤標識符、時間戳)進行構建,以便快速地定位和訪問跟蹤數據。
數據存儲除了中間件的選型,還需要將數據存儲的過程和業務系統做成解耦,避免降低業務系統正常功能的性能情況。
下圖是存儲數據的過程:

首先通過埋點采集到數據后,可以將消息以【索引+全量的消息數據】的結構序列化存儲到Redis緩存中;
第二步同步把重要索引類信息封裝成消息體投入到消息隊列中;
然后在消息存儲應用中消費消息隊列的消息,根據消息中的索引從Redis中獲取實際的數據,寫入到數據庫以及Elastic Search中,完成鏈路消息的持久化。
可視化跟蹤數據是實現全鏈路消息跟蹤的關鍵一步,它可以幫助開發人員和運維人員更直觀地理解和分析消息傳遞的流程和性能。
跟蹤數據流程圖:使用流程圖工具(如Graphviz、Mermaid、AntV G6)可以繪制跟蹤數據的流程圖,展示消息在系統中的傳遞路徑和中間節點的處理過程。
時間軸和日志視圖:通過在時間軸上展示跟蹤數據的時間戳和事件順序,可以更清晰地了解消息的傳遞順序和時間間隔。日志視圖可以展示每個消息的詳細信息,包括消息內容、上下文和處理日志等。
拓撲圖和依賴關系圖:使用拓撲圖工具(如D3.js、Neo4j)可以繪制跟蹤數據的拓撲圖,展示服務之間的關系和依賴。