測試提Bug
的基本要素,主要包括:服務器
生產環境出了故障,固然也脫離不開這3個要點。只不過相對重現問題會略微複雜。畢竟,故障老是咱們意外以外的狀況。微服務
根據Bug
發生的現象,咱們會提出不少假設,而後進行逐步排除。工具
當問題發生時,最應想到的是:系統最近是否有過改動。很大機率上,一個正常工做的服務會一直維持工做,直到某種外力出現。若是確實是新功能上線致使的,能夠結合具體狀況,考慮是否回滾到老版本。但有些時候,回滾可能還會引起二次問題,須要特別注意。測試
接下來:日誌
繼續保存冷靜,簡要評估問題的嚴重程度,及時給外部做出反饋。這裏的反饋特別重要,不只可讓你們瞭解故障的進展狀況,並且,你們還可能提供很是有價值的建議。code
接下來:接口
仔細分析故障發生的現象,不要忽略錯誤日誌的任何細節。這個過程當中,日誌顯得尤其重要。一個好的日誌記錄,必須能還原或推斷出當時故障的現場。日誌信息主要包括:上下文信息、報錯信息。開發
固然,有時候故障會涉及多個微服務,最好能有一個trace_id
,用來跟蹤故障的發生過程,以及具體是微服務中的哪臺服務器發生的故障。程序
接下來:總結
若是沒法絕對肯定故障的緣由,咱們須要復現Bug
,也就是前文提到的逐個排除。這開發過程當中,追加劇要服務的測試用例很是重要,可能會節約好多寶貴的時間。
但也存在難點,好比一些僞相關的緣由誤導咱們的判斷。故障通常都有連鎖反應,有時候會很難分辨問題的主次。
Go
開發排查問題服務發生panic
時,結合日誌中打印的堆棧信息,能夠很容易定位到出錯的代碼,並做出不少可能的推測。而後,結合具體的上下文信息,能很快復現問題。整個過程當中,日誌是問題排查的關鍵。
日誌必須包含panic
的堆棧信息,最好有鏈路的trace_id
信息。若是在開發過程當中,有對應的Test
就更好了。
對於接口響應慢的狀況,能夠依靠pprof
工具進行診斷。其中,最可能的是調用外部服務慢,好比經典的MySQL
慢查詢。
若是排除了外部依賴的問題,那極可能是程序代碼自身問題。經過pprof
的各類信息展現,也能很快定位。
Bug
不要放過任何Bug
,對Bug
的處理過程要作好梳理、總結。下面是總結的模版:
-- 細節 -- 災難響應 -- 過後總結 -- 作的好的地方 -- 作的很差的地方