別再背鍋了!這個小技巧統計第三方介面耗時很安逸

程式設計師濟癲發表於2022-12-16

前言

之前我有寫過一篇記錄生產環境事故的文章,獲得了不少好評。

後續,我們團隊有做過一些討論,為了支撐運營維護,搭建了更好的日誌平臺Granfa+Loki,也引入了SkyWalking做鏈路追蹤。

但過程中也遇到了一些問題,我會在下面講述出來,然後將這個簡單的小技巧分享出來,希望對大家有所幫助。

如果暫時沒時間看,可以先收藏起來,等閒下來慢慢看,以後如果遇到類似的情況說不定能直接翻出來照搬。


困難

前面說了,我們團隊有搭建日誌平臺和鏈路追蹤,但實際上也帶來一些困難,大體如下:

1)、對於中小企業來說,這樣的平臺搭建起來對資源有一定要求(要錢),專案維護期也經常會出現資源緊張的情況,增加了維護成本,因為成本不是控制在你手上,是老闆手上;

2)、對於團隊成員來說,要有一定能力熟悉和使用這樣的平臺,掌握一些常用的命令,而中小企業人員流動還挺頻繁,並不是每個入職的成員都能上手,這無形中加大了人力成本;

3)、線上上排查問題過程中,方便了許多,但也麻煩了許多,方便是因為有平臺能直接定位了,麻煩是因為平臺越來越多,有成員反應地址太多有點暈了()。

綜上所述,考慮到我們公司的規模和經濟能力,最終我們團隊還是決定用最簡單的辦法來定位介面耗時的問題,也就是SpringAOP對第三方介面做切面來完成耗時統計。


效果

先把最終線上上呈現的效果展示出來,大家能一目瞭然。

我們專案使用的是微服務+K8s,下圖是Granfa+Loki搭建的收集k8s日誌的平臺,透過關鍵字進行搜尋就能直接定位到呼叫第三方介面耗時的情況。

20.jpg


模擬場景

我們來模擬一下場景,實現AOP切面統計第三方介面的耗時。

1、模擬使用者建檔

實體類

11.jpg

用map來模擬存放使用者、獲取使用者、刪除使用者。

12.jpg

2、模擬第三方介面

這裡就是簡單的用執行緒睡眠來模擬呼叫第三方介面的耗時,假裝幾個介面分別耗費了這麼多時間。

13.jpg

3、service服務

14.jpg

4、controller服務

15.jpg

5、測試一下介面

介面1.jpg

介面2.jpg

介面3.jpg

OK,沒有問題。

6、AOP切面

引入依賴

16.jpg

編寫切面類,這裡簡單說明一下,主要明確幾點。

1)、Pointcut切面要指向第三方介面呼叫的類,也就是本篇場景中的RemoteClient;

2)、使用環繞切面,其中方法名是之後線上檢索日誌定位的關鍵字;

3)、計時直接使用StopWatch即可,省得引入其他依賴;

4)、StopWatch的start和stop方法包裹的jointPoint.proceed()就是第三方介面的執行操作,這樣StopWatch就可以統計出該方法的耗時;

5)、最後列印日誌也挺重要,可以參考我這樣,把類名.方法()都列印出來便於以後檢索,同時耗時最好用ms單位,這樣一目瞭然。

17.jpg

7、效果

我們手動執行模擬場景中的幾個介面後,來觀察日誌列印的情況。

可以看到,方法對應的耗時都統計出來了。

18.jpg

這樣,最終k8s的日誌也會像這樣被日誌平臺收集起來,我們最終只需要透過關鍵字檢索就能一次定位到所有第三方介面的耗時情況。

最後,我把我們某一次生產環境定位到的第三方介面超時的日誌展示出來給大家看看,正是這樣的統計幫助我們定位到了其他廠家的介面問題,之前他們一直都是說我們的問題,靠這個截圖才讓他們低頭認罪,之後他們就修復了這個問題。

這是在Granfa中我們根據類名.方法名直接定位第三方介面的命令

19.jpg

這是檢索到的某一段時間內他們介面一直超時的統計,也是最後發給他們的證據。

example.png


總結

最後,我把這種方式的好處再總結一遍,如果和我所在公司情況類似的同行可以參考下。

1)、節約了維護成本,不需要額外搭建什麼鏈路追蹤等用來定位的中介軟體或基礎設施,很多中小企業其實用不上,大體還是習慣透過日誌來定位問題,一個鏈路追蹤的平臺搭建簡單,但是使用過程中我們明顯發現會造成資源緊張,也要進行定期的維護,這個成本會在日積月累中逐漸變多;

2)、團隊成員不需要再額外學習多餘的技能,尤其是這種快節奏的網際網路行業團隊,人員變更挺頻繁,每次都要培訓和指導是一件比較耗費心力的事情,往往一個人掌握了沒多久他又跳槽了,對於公司而言又要重來;

3)、平臺變複雜不是好事,光是環境地址就能積累幾個Excel,規模不大的團隊還是傾向於最簡單的方式來處理問題,綜合考慮之下,人力完全可以替代平臺(老闆們其實就喜歡這樣的員工)。

另外稍微提一點,這種方式既可以應用於單體架構,也可以應用於分散式架構,但對於分散式架構要注意一點,第三方服務最好能獨立出來,這樣你使用AOP切面就完美適配了,否則你需要每個服務都引入一遍。


附言

原始碼會在評論區分享出來,有興趣的可以去下載來自己試試,裡面還有我整理的logback配置,有彩色日誌的配置,還有每個配置很詳細的註釋,AOP部分的程式碼就是線上執行了半年多的程式碼,可以直接拿去使用,只需要修改一下你的切面指向及類名方法名的日誌列印即可。



原創文章純手打,一個一個字敲出來的,鍵盤上全是血,如果覺得有幫助麻煩點個推薦吧~

本人致力於分享工作中的經驗及趣事,喜歡的話可以進主頁關注一下哦~

相關文章