如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

i042416發表於2019-05-06

轉眼間,距離Jerry最近一篇文章推送已經過去了一個多月的時間了。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

公眾號更新的頻率降低,不是因為Jerry偷懶,而是由於從春節過後,我所在的SAP成都研究院數字創新空間整個團隊,一直在忙一個5月份需要交付的專案上。

Jerry每天的工作量像下面這張圖這樣:

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

這個專案裡Jerry負責的是後臺開發工作,我用nodejs開發了若干微服務,每個微服務實現一個特定的業務邏輯。這些微服務由Jerry另外開發的一個編排器(Orchestra)統一排程。整套後臺實現部署在亞馬遜雲平臺(Amazon Web Service,以下簡稱AWS)上。

離交付日期越來越近了,我們的功能也趕得差不多了。本地測試執行得很好的場景,部署到AWS上執行後出現了一些bug。比如昨天就遇到一個棘手的bug,因此有了今天這篇文章。

2014年五一節的前一天,當時Jerry還在SAP CRM開發團隊工作,負責處理SAP CRM中介軟體的一個bug。這個bug和程式碼執行時序有關,每執行一次只有40%的機率能重現,花了我整整一天(8個小時)的時間除錯。因為重現bug的場景太複雜,需要除錯的ABAP程式碼量太大,所以讓我印象深刻。那個bug處理完之後,我也對自己花了8小時才搞定該bug的效率很不滿意,因此寫了一篇部落格總結這次排錯的經驗教訓:

My Tips about how to handle complex and tricky issues

https://blogs.sap.com/2014/05/01/my-tips-about-how-to-handle-complex-and-tricky-issues/

回到昨天我遇到的在AWS上出現的bug,根據問題的表象,一開始我和負責前端開發的同事,連這個問題出在前端還是後端都沒辦法判斷。當微服務部署在本地並進行測試時一切正常,只有部署在AWS上進行整合測試時才會暴露,而執行在AWS上的nodejs應用,我昨天還不知道如何除錯,因此只好採用我大二剛學C語言程式設計時用過的最笨的排查辦法:打日誌。

2001年,在結束了一年的計算機專業基礎課學習後,Jerry開始了Unix環境下C語言程式設計的學習。當時我對gdb這種以命令提示行方式進行的除錯風格很不適應,大多數時候的排錯採用的還是在程式碼裡新增printf語句列印變數內容的方式來進行,被寢室的同學鄙視了好久。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

於是昨天我繼續採用了這種自己18年前就曾經用過的排錯方式:

1. 在可能引起bug的相關程式碼處逐一加上日誌輸出語句

2. 執行會出現bug的使用者操作

3. 閱讀AWS上生成的日誌語句

上述三個步驟是一個不斷迭代的過程。最開始我加了若干日誌輸出語句,執行操作後閱讀生成的日誌,發現沒有任何異常。於是不斷地增加新的日誌列印程式碼,最後導致了執行一次操作,會生成1200行的日誌輸出。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

我和負責前端開發的同事兩人坐在顯示器前,一行行檢查這海量的日誌輸出。由於問題是使用者第二次操作後才會暴露,每次操作會生成不同的會話,我們被迫不斷的上下滑動螢幕來比較這兩次會話的uuid和相關的WebSocket uuid等變數。Jerry很快發現,眼睛一眨不眨地盯著顯示器逐條檢查日誌,時間一長眼睛就痛得受不了。無奈之下,只得把這些日誌用印表機列印出來,用不同顏色的筆標註出兩個會話對應的各種變數,在紙上來回比對。於是就有了下面這些紙張:

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

雖然最後用這種辦法,成功排除了後臺出錯的可能性,使我們得以把精力花在前臺程式碼的審查上,但是像我一個同事評價的,“ 這種方式太不環保了 ”,並且我自己也覺得, 效率太低了

後來好幾位熱心的同事告訴Jerry,就算執行在SAP Cloud Platform或者AWS這些雲平臺上的nodejs應用,也是可以單步除錯的,Jerry Google了一下,發現遠端除錯確實很簡單,就兩條命令而已。

Jerry用我們創新空間團隊另外一位同事Haytham開發並部署在AWS上的一個nodejs應用為例來嘗試如何在我的本地電腦上對其進行除錯。

Haytham雖然是一個大四本科生,但是已經在SAP成都研究院Jerry所在團隊實習將近十個月的時間了,最近三個月一直在SAP德國總部參與一個專案的開發。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

等Haytham回到成都後,會將自己這十個月的工作感悟,從一個SAP新人的視角給大家分享出來,敬請期待。

Haytham之前寫過的文章:

SAP成都研究院許聚龍:Hello, Coresystems!

Haytham寫的這個nodejs應用實際上是Github Webhook的一部分。我們在本地進行微服務nodejs開發,本地git客戶端推送程式碼到遠端github倉庫。然後需要在AWS上手動git pull把最新的程式碼拉下來,再用一個開源工具pm2進行微服務部署。Haytham寫的這個nodejs應用,能實現本地git推送完畢後一切後續流程的 完全自動化 ,節省了我們大量的部署時間。

下面就來對Haytham這個執行在AWS上的nodejs應用進行遠端除錯。

  1. 用node --inspect-brk在AWS上以除錯模式啟動應用。

之後控制檯上的輸出表明有一個nodejs程式以WebSocket協議在127.0.0.1:9229這個地址上監聽除錯客戶端的連線。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
  1. 我在我的本地電腦上,用如下命令列將我本地電腦的埠9221對映到AWS除錯程式監聽的9229埠上:

ssh -i C:\Users\i042416.ssh\KOI.pem -L 9221:localhost:9229  ubuntu@ec2-us-east-2.compute.amazonaws.com

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

現在,本地電腦上Chrome瀏覽器位址列 chrome://inspect 裡指定監聽地址為localhost:9221,

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

通過第二步建立的SSH tunnel,

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

我就可以用本地電腦連線到AWS上的nodejs應用並進行除錯了。

現在終於可以在Chrome開發者工具裡進行愉快的除錯了:

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

因為我平時本地做nodejs開發和除錯時,更喜歡用Visual Studio Code,所以下一步我準備試試用Visual Studio Code進行遠端除錯。

說到Visual Studio Code,Jerry突然想起今天在網上看到的一個關於這個IDE的有意思的擴充套件,名為"超越鼓勵師"。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

Jerry試著在自己的Visual Studio Code擴充套件安裝欄裡搜尋了一下,這個擴充套件還真的可以下載。不過擴充套件裡出現的"楊超越",Jerry又孤陋寡聞了,諮詢了老婆後才知道她是誰。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

至於實際效果如何,Jerry不做評價,歡迎Visual Studio Code愛好者自行下載體驗。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

最後,祝各位程式猿/程式媛們每天即使沒有程式設計師鼓勵師的陪伴,仍然可以愉快地程式設計。感謝閱讀。

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2643506/,如需轉載,請註明出處,否則將追究法律責任。

相關文章