著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
設計架構
jpOwl客戶端是java語言編寫而成,要求作到API簡單、高可靠性能、不管在任何場景下客戶端都不能影響各業務服務的性能。旨在爲各業務線提供豐富的埋點功能與數據採集。java
在收集數據方面使用ThreadLocal,爲每個使用該變量的線程都提供一個變量值的副本,是Java中一種較爲特殊的線程綁定機制,是每個線程均可以獨立地改變本身的副本,而不會和其它線程的副本衝突。git
如圖,執行業務邏輯的時候,就會把這次請求對應的監控存放於ThreadContext中,ThreadContext實際上是一個監控樹的結構。最後業務線程執行結束時,將監控對象
異步存入一個內存隊列中,jpOwl有個消費線程將隊列內的數據
異步發送到第三方存儲引擎。
場景需求
- 監控粒度可控制做用在接口上,方法上,乃至代碼塊上
- 異步方式運行,即便失敗也不影響業務流程
- 提供註解式與編程式的使用方式
- 日誌級別可根據響應時間,失敗次數,數據大小決定升降
- 可添加自定義觸發器,觸發特定功能
- 監控產生的日誌內容可動態指定記錄前綴名
- 支持內存,本地文件,mongodb,elastic search等輸出源
- 支持在線修改調整日誌記錄級別
- 支持監控數據延遲上報或觸發,便於聚合業務數據統計記錄
支持以秒級,分鐘級監控異常失敗次數,方法接口執行次數。根據指標配置告警策略,如釘釘,郵件,短信等方式。業務可根據須要設置日誌前綴與延遲上報,在內存隊列或觸發器進行業務指標計算公式的預計算,對個性化業務指標進行監控告警或數據記錄至其餘數據源,由echart等圖表工具展現。github
性能設計
序列化和通訊是整個客戶端包括服務端性能裏面很關鍵的一個環節mongodb
- 異步序列化,jpOwl序列化協議protobuf序列化協議
- 異步通訊,jpOwl通訊是基於Netty來實現的NIO的數據傳輸
- 異步化IO傳輸的操做
- 異步數據採集,基於NIO管道記錄日誌
- 基於內存級別的數據緩衝,可指定緩存隊列大小
- 可指定內存隊列安全機制,當隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌
價值與優點
價值數據庫
- 減小故障發現時間
- 下降故障定位成本
- 輔助應用程序優化
- 監控數據是全量統計,jpOwl支持預計算數據
- 鏈路數據是採樣計算
優點編程
- 實時處理:信息的價值會隨時間銳減,因此收集信息須要迅速
- 全量數據:全量採集指標數據,便於深度分析故障案例
- 故障容忍:故障不影響業務正常運轉、對業務透明
- 高吞吐:海量監控數據的收集,須要高吞吐能力作保證
業務模型監控
jpOwl主要支持如下四種監控模型:緩存
- Transaction 適合記錄跨越系統邊界的程序訪問行爲,好比遠程調用,數據庫調用,也適合執行時間較長的業務邏輯監控,Transaction用來記錄一段代碼的執行時間和次數。
- Event 用來記錄一件事發生的次數,好比記錄系統異常,它和transaction相比缺乏了時間的統計,開銷比transaction要小。
- Heartbeat 表示程序內按期產生的統計信息, 如CPU利用率, 內存利用率, 鏈接池狀態, 系統負載等。
- Metric 用於記錄業務指標、指標可能包含對一個指標記錄次數、記錄平均值、記錄總和,業務指標最低統計粒度爲1分鐘。
消息樹
jpOwl監控系統將每次URL、Service的請求內部執行狀況都封裝爲一個完整的消息樹、消息樹可能包括Transaction
、Event
、Heartbeat
、Metric
等信息。 完整的消息樹 安全
可視化消息樹
分佈式消息樹【一臺機器調用另一臺機器】
項目地址:github.com/jiangeeq/jp…架構

