怎么把CAT客戶端的RootMessageId記錄到每條日志中?
什么是RootMessageId?
為了理解RootMessageId先簡單介紹一下CAT的數據結構設計。CAT客戶端會將所有消息都封裝為一個完整的消息樹(MessageTree),消息樹可能包括Transaction、Event、Heartbeat、Metric等類型的消息。具體如下:
Transaction:適合記錄跨越系統邊界的程序訪問行為,比如遠程調用,數據庫調用,也適合執行時間較長的業務邏輯監控,Transaction用來記錄一段代碼的執行時間和次數
Event:用來記錄一件事發生的次數,比如記錄系統異常,它和transaction相比缺少了時間的統計,開銷比transaction要小
Heartbeat:表示程序內定期產生的統計信息, 如CPU利用率, 內存利用率, 連接池狀態, 系統負載等
Metric:用于記錄業務指標、指標可能包含對一個指標記錄次數、記錄平均值、記錄總和,業務指標最低統計粒度為1分鐘
其中,Transaction類型的消息可作為消息樹節點,而其他消息只可作為消息樹的葉子節點,也就是Transaction是一個可嵌套的遞歸結構。比如:
消息樹的每一節點都有一個屬性messageId,用來唯一表示節點本身,其構成為:{domain}-{ip}-{timestamp}-{自增index}。另外還有兩個屬性,分別是parentMessageId, rootMessageId。parentMessageId表示父節點的messageId;rootMessageId則表示整個消息樹的根節點的messageId。這兩個屬性在之后CAT的調用鏈分析與分布式調用鏈分析中發揮了關鍵作用。
為什么在日志中記錄?
根據RootMessageId可以追蹤某一個請求的整個分布式調用鏈,結合每一條日志快速定位耗費性能的癥結,做針對性的性能優化。更加方便地做性能優化,特別是TP95、TP99等指標。
遇到偶爾發生的bug,是最讓人頭疼的,只有先從日志中找線索,但是在海量的日志中找到出現bug的那一個請求是很困難的。有了上游API提供的RootMessageId,就可以快速過濾出那次請求的所有日志, 更快速更方便地定位線上bug。
在日志的什么地方記錄?
當然是每一句日志上都記錄RootMessageId了。有的同學會說,這日志也記錄的太多了。當發現線上問題無法定位時,你就會狠日志太少了。其實記錄日志不怕多,就怕不全。現在硬盤很便宜了,搞個幾T沒有問題,另外還可以設置日志清理策略。
怎么記錄到日志中?
前面說了那么多,終于到了今天的壓軸大戲了。實現記錄到日志有很多種方式,這里使用的是MDC(Mapped Diagnostic Contexts)。顧名思義,其目的是為了便于我們診斷線上問題而出現的方法工具類,目前我們經常使用的logback和log4j都是支持的。
只需要在每個請求的入口調用MDC.put方法,把rootMessageId賦值進去就可以了,是不是很簡單?示例代碼:
//在Filter里,從header里獲取上下文信息,包括messageId、parentMessageId、rootMessageId CatContext catContext = new CatContext(); catContext.addProperty(Cat.Context.ROOT, request.getHeader(CatConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID)); catContext.addProperty(Cat.Context.PARENT, request.getHeader(CatConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID)); catContext.addProperty(Cat.Context.CHILD, request.getHeader(CatConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID)); if (catContext.getProperty(Cat.Context.ROOT) == null) { //如果調用鏈的頂端,沒有上下文信息,需要生成上下文信息 Cat.logRemoteCallClient(catContext); } else { Cat.logRemoteCallServer(catContext); } MDC.put("traceId", catContext.getProperty(Cat.Context.ROOT));
1
2
3
4
5
6
7
8
9
10
11
12
如果你還不知道怎么集成CAT調用鏈,可以看看之前的《SpringBoot集成CAT調用鏈實例》
然后,在設置日志輸出格式的配置文件里增加[%X{traceId}]。
Logback的xml配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
log4j的properties配置示例:
log4j.rootCategory=INFO,stdout,info,error log4j.rootLooger=warn,stdout,info,error log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p] [%thread] [%X{traceId}] method:%l - %m%n
1
2
3
4
5
Spring
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。