如何提升後臺服務應用問題的排查效率?日誌 VS 遠程調試

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

公衆號更新的頻率下降,不是由於Jerry偷懶,而是因爲從春節事後,我所在的SAP成都研究院數字創新空間整個團隊,一直在忙一個5月份須要交付的項目上。node

Jerry天天的工做量像下面這張圖這樣:git

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

離交付日期愈來愈近了,咱們的功能也趕得差很少了。本地測試運行得很好的場景,部署到AWS上運行後出現了一些bug。好比昨天就遇到一個棘手的bug,所以有了今天這篇文章。github

2014年五一節的前一天,當時Jerry還在SAP CRM開發團隊工做,負責處理SAP CRM中間件的一個bug。這個bug和代碼執行時序有關,每執行一次只有40%的概率能重現,花了我整整一天(8個小時)的時間調試。由於重現bug的場景太複雜,須要調試的ABAP代碼量太大,因此讓我印象深入。那個bug處理完以後,我也對本身花了8小時才搞定該bug的效率很不滿意,所以寫了一篇博客總結此次排錯的經驗教訓:chrome

My Tips about how to handle complex and tricky issues編程

https://blogs.sap.com/2014/05...ubuntu

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

2001年,在結束了一年的計算機專業基礎課學習後,Jerry開始了Unix環境下C語言編程的學習。當時我對gdb這種以命令提示行方式進行的調試風格很不適應,大多數時候的排錯採用的仍是在代碼裏添加printf語句打印變量內容的方式來進行,被寢室的同窗鄙視了很久。瀏覽器

因而昨天我繼續採用了這種本身18年前就曾經用過的排錯方式:

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

2. 執行會出現bug的用戶操做

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

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

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

雖然最後用這種辦法,成功排除了後臺出錯的可能性,使咱們得以把精力花在前臺代碼的審查上,可是像我一個同事評價的,「這種方式太不環保了」,而且我本身也以爲,效率過低了

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

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

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

等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這個地址上監聽調試客戶端的鏈接。

2. 我在個人本地電腦上,用以下命令行將我本地電腦的端口9221映射到AWS調試進程監聽的9229端口上:

ssh -i C:Usersi042416.sshKOI.pem -L 9221:localhost:9229 ubuntu@ec2-us-east-2.compute.amazonaws.com

如今,本地電腦上Chrome瀏覽器地址欄chrome://inspect裏指定監聽地址爲localhost:9221, 

經過第二步創建的SSH tunnel,

我就能夠用本地電腦鏈接到AWS上的nodejs應用並進行調試了。

如今終於能夠在Chrome開發者工具裏進行愉快的調試了:

由於我平時本地作nodejs開發和調試時,更喜歡用Visual Studio Code,因此下一步我準備試試用Visual Studio Code進行遠程調試。

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

Jerry試着在本身的Visual Studio Code擴展安裝欄裏搜索了一下,這個擴展還真的能夠下載。不過擴展裏出現的"楊超越",Jerry又孤陋寡聞了,諮詢了老婆後才知道她是誰。

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

最後,祝各位程序猿/程序媛們天天即便沒有程序員鼓勵師的陪伴,仍然能夠愉快地編程。感謝閱讀。

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

相關文章
相關標籤/搜索