怎么把CAT客戶端的RootMessageId記錄到每條日志中?

      網友投稿 700 2025-04-01

      什么是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配置示例:

      怎么把CAT客戶端的RootMessageId記錄到每條日志中?

      [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%X{traceId}] [%-5level] [%-40.36logger{40}:%-4.4line] - %msg%n

      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小時內刪除侵權內容。

      上一篇:如何在wps表格中輸入日期時間(wps表格日期怎么設置)
      下一篇:wps怎么保存云文檔
      相關文章
      亚洲AV无码国产精品麻豆天美| 亚洲国产精品精华液| 精品亚洲福利一区二区| 亚洲高清无在码在线电影不卡 | 色噜噜亚洲精品中文字幕| 国产亚洲精品AAAA片APP| 亚洲精品无码aⅴ中文字幕蜜桃| 亚洲免费福利在线视频| ass亚洲**毛茸茸pics| 亚洲另类春色校园小说| 亚洲国产精品综合久久20| 中文字幕在线观看亚洲视频| 91丁香亚洲综合社区| 亚洲人成网站色在线观看| 亚洲中文字幕无码中文字| 亚洲爆乳成av人在线视菜奈实| 亚洲国产一区二区三区在线观看| 亚洲成av人无码亚洲成av人| 亚洲av永久无码精品网址| 精品国产日韩亚洲一区在线| 亚洲av再在线观看| 国产成人久久精品亚洲小说| 亚洲国产激情一区二区三区| 亚洲日韩人妻第一页| 在线观看亚洲av每日更新| 久久亚洲精品中文字幕三区| 亚洲av色福利天堂| 亚洲手机中文字幕| 亚洲一区二区无码偷拍| 成人亚洲国产精品久久| 亚洲午夜无码AV毛片久久| 亚洲色偷偷偷鲁综合| 亚洲国产综合专区在线电影| 久久亚洲精品无码aⅴ大香| 亚洲国产成人精品无码一区二区| 2020年亚洲天天爽天天噜| 亚洲人成未满十八禁网站| 国产大陆亚洲精品国产| 亚洲综合区小说区激情区| 亚洲国产成人高清在线观看 | 亚洲AV成人精品一区二区三区 |