1. 程式人生 > >如何提高後臺服務應用問題的排查效率?日誌 VS 遠端除錯

如何提高後臺服務應用問題的排查效率?日誌 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應用進行遠端除錯。

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

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

2. 我在我的本地電腦上,用如下命令列將我本地電腦的埠9221對映到AWS除錯程序監聽的9229埠上:

ssh -i C:\Users\i042416.ssh\KOI.pem -L 9221:localhost:9229 [email protected]

現在,本地電腦上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的原創文章,請關注公眾號"汪子熙":

相關推薦

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

https 根據 電腦 增加 brk hand github red wechat 轉眼間,距離Jerry最近一篇文章推送已經過去了一個多月的時間了。 公眾號更新的頻率降低,不是因為Jerry偷懶,而是由於從春節過後,我所在的SAP成都研究院數字創新空間整個團隊,一直在忙

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

轉眼間,距離Jerry最近一篇文章推送已經過去了一個多月的時間了。 公眾號更新的頻率降低,不是因為Jerry偷懶,而是由於從春節

關於如何提高Web服務端併發效率的非同步程式設計技術

  最近我研究技術的一個重點是java的多執行緒開發,在我早期學習java的時候,很多書上把java的多執行緒開發標榜為簡單易用,這個簡單易用是以C語言作為參照的,不過我也沒有使用過C語言開發過多執行緒,我只知道我學習java多執行緒開發是很難的,直到現在寫這篇文章的時候,雖然我對java多執行緒裡的AP

微信公眾號開發之回覆圖文訊息(被動) 微信公眾號開發之VS遠端除錯

目錄 (一)微信公眾號開發之VS遠端除錯 (二)微信公眾號開發之基礎梳理 (三)微信公眾號開發之自動訊息回覆和自定義選單 (四)微信公眾號開發之網頁授權獲取使用者基本資訊 (五)微信公眾號開發之網頁中及時獲取當前使用者Openid及注意事項 (六)微信公眾號開發之掃碼支付 (七)微信公眾號開發之

VS遠端除錯連線失敗

錯誤現象: 無法連線到名為“[email protected]”的“Microsoft Visual Studio 遠端除錯監視器”。目標計算機上的Visual Studio 遠端偵錯程式無法重新連線到此計算機。身份驗證失敗。請參見“幫助”。 錯誤介面截圖:

vs遠端除錯

本機A, 遠端機B (均關閉防火牆) 1. 複製程式demo.exe和demo.pdb到機器B 2.複製A上的  C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger\

應用程序的日誌通過rsyslog推送到syslog服務

syslog rsyslog centos5系列系統自帶為syslog1.4.1centos6系列自帶rsyslog版本為5.8.10centos7系列自帶rsyslog版本為7.4.7目前最新版rsyslog為8.27.0,rsyslog從8.5.0後對imfile模塊進行重構,文件名中可以支持通配

rsync後臺服務方式(daemon)、linux日誌

例如 核心 lin messages 免密 開機啟動 網絡 全部 輸入 一:rsync後臺服務方式(daemon) 可以理解為,在遠程主機上建立一個rsync服務器,在服務器上配置好rsync的各種應用,然後本機作為rsync的一個客戶端去連接遠程的rsync服務器。先配置

Arthas實踐--使用redefine排查應用奇怪的日誌來源

背景 隨著應用越來越複雜,依賴越來越多,日誌系統越來越混亂,有時會出現一些奇怪的日誌,比如: [] [] [] No credential found 那麼怎樣排查這些奇怪的日誌從哪裡打印出來的呢?因為搞不清楚是什麼logger打印出來的,所以想定位就比較頭疼。 下面介

後臺服務的形式啟動nodejs應用

all 執行 star eve 命令 npm 其他 解決 rev 問題 運行一個nodejs服務,退出終端之後,服務就停止運行。 node app.js 即便采用 node server.js & 或 nohup node server.js >/de

使用Logstash multiline 收集PHP、tomcat等應用服務多行堆疊日誌

很多時候應用程式出錯是都是丟擲一堆 堆疊資訊(即在日誌檔案輸出多行),此時logstash可以使用multiline的外掛收集日誌時需要把錯誤堆疊資訊收集為一個記錄。multiline字面意思是多行,顧名思義就是對多行日誌進行處理。 multiline配置與用法 i

Android之後臺服務判斷本應用Activity是否處於棧頂

在Android開發中,我們經常想知道是否自己的服務處於後臺執行中,因為在後臺執行的伺服器優先順序會降低,也就極有可能會被系統給回收掉,有什麼好辦法呢?Google推薦我們將服務執行到前臺,如何知道服務是否處於後臺執行呢?可以通過獲取堆疊資訊中棧頂的Activity是否為本

酒店也能應用RPA? 提高酒店服務質量的關鍵

酒店管理系統 管理系統 最新 部門 分鐘 競爭 執行 情況下 方式 酒店也能應用RPA?酒店RPA:提高酒店服務質量的關鍵 成功的酒店不僅依靠優越的地理位置,良好的經營狀況,還要得益於客戶的滿意程度。為了優化相關流程為客人提供的良好的服務水平,酒店需要建立一種專註於保持員工

應用MySQL讀寫分離以提高MySQL服務器的讀寫性能

基於用戶 gin ini repos host back admin all ransac   讀寫分離是借助MySQL中間件 ProxySQL 實現的  ProxySQL 有兩個版本:官方版和percona版,percona版是基於

21個極大提高開發效率VS Code快捷鍵

摘要: 高效使用VS Code! 作者:前端小智 原文:21 個VSCode 快捷鍵,讓程式碼更快,更有趣 Fundebug經

nodejs 後臺服務啟動

forever 解決方案 聊天室 服務器 谷歌 最近一個項目微信小程序,需要寫個小型的後端程序處理聊天通訊記錄保存,主要是功能是組建群聊天室,所以用node寫了個websocket服務...但是終端連接到服務器,運行 node server.js, 退出終端之後,服務就停止運行了。

問題解決系列: 後臺服務流量控制- 控制訪問別的服務的速度

發送 template 個人 exce 保護 rms 這一 ole 每分鐘 互聯網的後臺提倡大系統小做,微服務化。所以後臺服務之間相互依賴,我依賴別人的,別人也依賴我的,這很正常。但是後臺服務講穩定性。只有一切可控,才能談穩定性。為了不沖垮下遊的服務,我們有兩種做法:一種是

iOS開發中上傳JSON字符串到後臺服務

在之前的開發中一般上傳給後臺服務器的各個字段的內容都是一些字符串,而最近在一個項目中卻需要上傳一個JSON字符串,由於之前沒上傳過JSON字符串所以感覺挺新鮮,於是上網查了相關知識,並在這裏記錄一下。 在上傳JSON字符串之前上海證券通首先需要獲取JSON字符串,JSON字符串其實也是由OC中的某個對

提高代碼編碼的效率,習慣非常重要!

到你 打印 代碼調試 功能點 文件 程序實現 幹凈 4.2 等等 提高代碼編碼的效率,習慣非常重要。經驗分享一下: 1、寫代碼前,先把需求弄清晰(這個非常關鍵):把業務轉化成功能點,有多少個功能點? 2、設計 把業務對象弄清晰,從大到細設計,看看使用什麽設計模

將java打jar包成linux後臺服務service

提示信息 cut star 依賴 jar包 信息 執行 fin expand 將java打jar包成linux後臺服務service 第一步:將java程序打成jar包 build.gradle配置文件中加spring-boot-gradle-plugin插件,具體配置