如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯
轉眼間,距離Jerry最近一篇文章推送已經過去了一個多月的時間了。
公眾號更新的頻率降低,不是因為Jerry偷懶,而是由於從春節過後,我所在的SAP成都研究院數字創新空間整個團隊,一直在忙一個5月份需要交付的專案上。
Jerry每天的工作量像下面這張圖這樣:
這個專案裡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語句列印變數內容的方式來進行,被寢室的同學鄙視了好久。
於是昨天我繼續採用了這種自己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應用進行遠端除錯。
- 用node --inspect-brk在AWS上以除錯模式啟動應用。
之後控制檯上的輸出表明有一個nodejs程式以WebSocket協議在127.0.0.1:9229這個地址上監聽除錯客戶端的連線。
- 我在我的本地電腦上,用如下命令列將我本地電腦的埠9221對映到AWS除錯程式監聽的9229埠上:
ssh -i C:\Users\i042416.ssh\KOI.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的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2643506/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VS - 打斷點/本地除錯/遠端除錯 問題斷點除錯
- 如何遠端除錯部署在CloudFoundry平臺上的nodejs應用除錯CloudNodeJS
- 如何使錯誤日誌更加方便地排查問題
- vsc 如何除錯遠端python程式碼除錯Python
- vs搭建遠端除錯環境除錯
- VS 遠端除錯 Azure Web App除錯WebAPP
- 記一次線上報錯日誌問題排查
- 排查錯誤日誌
- vscode遠端除錯c++VSCode除錯C++
- 使用 Eclipse 遠端除錯 Java 應用程式Eclipse除錯Java
- Java服務.問題排查.問題復現Java
- 用WinDBG遠端除錯程式除錯
- 遠端除錯在Linux車機中的應用除錯Linux
- 遠端服務不能啟動問題的解決方法
- 使用 Eclipse 遠端除錯 Java 應用程式(mark)Eclipse除錯Java
- windows系統vscode遠端除錯MySQLWindowsVSCode除錯MySql
- chrome遠端除錯按inspect後出現的介面為空白,應如何解決?Chrome除錯
- 阿里雲日誌服務問題反饋流程阿里
- 講一個linux服務啟動報錯問題排查Linux
- udev如何除錯,如何看udev的輸出日誌?udev除錯的坑?dev除錯
- VisualStudio 如何 SSH 遠端除錯 Linux 的 dotnet 應用的啟動除錯Linux
- 日誌服務
- 阿里雲日誌服務sls的典型應用場景阿里
- vscode配置遠端linux系統除錯VSCodeLinux除錯
- Pycharm遠端除錯PyCharm除錯
- 前端遠端除錯前端除錯
- chrome 遠端除錯Chrome除錯
- 日誌與除錯除錯
- 關於如何提高Web服務端併發效率的非同步程式設計技術Web服務端非同步程式設計
- 【Go語言探險】線上奇怪日誌問題的排查Go
- 華為 MATE7 除錯 LOCAT 日誌不輸出問題除錯
- ABP框架—後臺:應用服務ApplicationServices(9)框架APP
- 關於日誌事務的問題
- win10 如何開啟遠端服務_win10如何開啟遠端連線服務Win10
- bbossaop遠端服務介紹-遠端服務呼叫例項
- 【譯】使用 Source Link 提高除錯效率除錯
- 使用VSCode遠端除錯惡意Powershell指令碼VSCode除錯指令碼
- 使用VS2010進行遠端除錯除錯