調用鏈與日誌關聯的探索式查詢
- 2019 年 10 月 21 日
- 筆記
一、Observability
Observability是一個最近幾年開始在監控社區流行的術語。本文將Observability視為一種理念,一種監控的超集,包括監控、日誌聚合、分佈式跟蹤,可以實時更深入地觀察系統。本文將就其中的日誌聚合、分佈式跟蹤及具體應用中結合使用進行展開說明。
二、日誌與調用鏈的探索式查詢
微服務、雲和容器化架構的出現,改變了我們構建系統的方式。應用程序是分佈式的,而且瞬息萬變。加之底層的基礎設施和網絡服務愈加健壯,日常系統運維的大部分工作將來自應用程序層或者是不同應用程序之間的複雜交互調用。
對於複雜的跨系統調用,一次請求可能需要後台幾台或上百台節點的支持。此時具體到一次請求已經很難通過人力確認其處理的完整流程,此時最能反映每次請求處理過程的應該是分佈式追蹤(下文簡稱調用鏈)。
調用鏈是從一次具體請求的全局角度看待問題,當細粒具體到一個節點時,應用系統自身打印的日誌最能說明當前節點處理邏輯。
下面通過一張簡圖來說明調用鏈和日誌聚合做的事情:
調用鏈的作用是將一次請求所經過的所有節點和關鍵操作進行記錄並匯總展示出來,就像圖中綠色箭頭,能夠提供一個全局的視角去看待一次請求。
日誌聚合的作用是將所有節點和系統產生的日誌進行匯總整理,並提供給用戶一個有效並友好的查詢能力。
但是我們在具體使用過程中往往是這樣的:
從調用鏈進來以後發現了一個問題,然後切換到日誌聚合去根據特定屬性查詢對應的日誌信息,通過排查日誌信息發現還需要再次去查詢與之關聯的調用鏈信息……如此往返多次。
日誌與調用鏈的探索式查詢對於這種經典場景提供了一種新的閉環處理問題模式:
從調用鏈入口進入,可以根據調用鏈關聯到具體應用的與當前調用鏈相關的日誌,根據日誌也可以關聯到具體一條調用鏈;從日誌入口進入,可以根據日誌關聯到與當前日誌相關的具體一條調用鏈,根據一條調用鏈又可以關聯到與當前調用鏈相關聯的日誌。而且兩種模式可以相互切換。
三、舉個栗子
用戶小明通過日誌聚合搜索發現有A系統一段日誌有異常信息,此時他可以通過此條日誌關聯找出對應的調用過程a。通過觀察a這條調用鏈小明發現,是由於a上的節點a[2]超時導致。此時小明可以從調用鏈關聯到與節點a[2]相關的日誌內容從而確定問題所在(具體效果見下文)。
四、整體架構設計
4.1 數據抓取:
應用集群中的機器上部署的agent用於數據收集和上送,探針內嵌在容器(tomcat等)用於為應用畫像和收集應用信息
4.2 數據傳輸:
agent將處理過後的日誌通過mq上送到監控服務器
4.3 數據處理及存儲:
監控服務器將採集上來的數據進行處理並將其存入ES,方便用戶通過特定特徵快速定位
4.4 數據展示:
將數據進行可視化展示,並提供方便的可視化自定義查詢服務
五、具體實現
在介紹調用鏈和日誌聚合具體實現之前需要明確的幾個概念:
5.1 中間件劫持技術
通過在中間件啟動時動態將我們自己的代碼行為植入到中間件的各種行為中的技術。比如在tomcat啟動時動態在tomcat處理請求的開始位置添加代碼劫持,則能夠實現在tomcat執行處理請求邏輯之前進行服務調用畫像等功能。更多能力和實現方式可以參考:http://chuansong.me/n/603660351655
5.2 traceId
通過中間件劫持技術在服務調用最前端產生且能夠唯一確定一條調用鏈的id。
主要實現邏輯:
- 在應用容器啟動時,使用中間件劫持技術在服務調用入口和應用日誌寫文件入口位置添加劫持點
- 在發生服務調用時生成調用鏈元數據和上下文
- 當應用寫日誌時通過寫文件入口劫持點獲取當前調用的調用鏈上下文,將traceId與應用日誌一同寫入應用日誌文件
- 日誌歸集將生成的日誌文件聚合整理上送到監控服務器
- 監控服務器將收集到的日誌信息,進行處理並存入es
- web頁面將存儲在es中的數據進行展示
核心邏輯如下圖:
六、調用鏈和日誌聚合實現
調用鏈部分分為:模型設計、服務端信息收集(輕/重)、方法級信息收集(輕/重)、客戶端信息收集(輕/重)、調用鏈協議設計(輕/重)、調用鏈上下文傳遞、調用信息記錄及傳遞、調用數據統計處理幾個關鍵過程。關鍵技術為中間件劫持增強框架、調用模型設計和調用鏈上下文傳遞。
應用日誌部分分為:日誌歸集,日誌內容處理傳輸,服務端日誌處理及存儲等幾個關鍵步驟。關鍵技術為:服務畫像技術、日誌歸集。
七、效果展示
7.1 調用鏈入口
通過特定條件搜素出關心的具體一次調用過程,點擊進入調用的詳細過程界面。
點擊右側的關聯按鈕可快速定位到與之相關聯日誌。
7.2 日誌入口
通過特定特徵(圖中為按照Hello關鍵字進行搜索)搜索出符合條件的日誌。
通過點擊具體日誌即可進入對應的調用過程。
參考資料
更多詳情:https://uavorg.github.io/documents/uavdoc_architecture/moniorframework/diao-yong-lian-shu-ju-sheng-cheng.html
下載UAVStack的源碼(https://github.com/uavorg)
下載AllInOne開發演示版(https://uavorg.github.io/main/)
作者:李崇
來源:宜信技術學院