2017-10-16 69 views
0

我正在PM2管理的nodejs集羣上隨機重新啓動。我在錯誤日誌上得到的唯一症狀是以下模式 - 對dns.js的ENOTFOUND。如何調試神祕ENOTFOUND?

Error: getaddrinfo ENOTFOUND walkinto.inhttp walkinto.inhttp:80 at errnoException (dns.js:28:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)

問題顯然是畸形的服務器名稱 - walkinto.inhttp是不正確的,它應該是walkinto.in。挑戰在於,這不是代碼中硬編碼的主機名。在這個相當龐大的代碼庫中有很多地方可以進行名稱解析並且具有動態性。

我花了相當多的時間來查明根本原因,但到目前爲止沒有運氣。我需要幫助來從dns.js打印更多日誌信息;可能是一個「可能」的調用堆棧將有助於前進。

Q1:如何在nodejs核心模塊上啓用更詳細的日誌記錄?

Q2:什麼可能導致ENOTFOUND發生nodejs重啓?如何避免重新啓動 - 此路徑不可取。

Q3:有沒有其他更聰明的方法來解決這個問題?

+0

您能否包含導致此錯誤的代碼?請參閱:https://stackoverflow.com/help/mcve – Svenskunganka

+0

不,我不知道這個錯誤的來源。我試圖添加錯誤處理程序和日誌到所有可疑的代碼 - http.get,http.post request()... – WalkInto

回答

0

既然沒有辦法讓我們幫你解決問題,而一些代碼去,我會回答你的問題:

How to enable more detailed logging on nodejs core modules?

運行節點與inspect選項,並重視與Chrome的調試器DevTools或其他應用程序。請參閱以下鏈接:
https://nodejs.org/api/debugger.html
https://nodejs.org/en/docs/guides/debugging-getting-started/

What could cause a nodejs restart to happen for an ENOTFOUND? How to avoid a restart - This path is not desirable.

節點運行時不重新啓動。您看到的錯誤是由類似於throw new Error(`getaddrinfo ${err}`)的東西生成的,並且來自throw的任何未被捕獲的錯誤都會導致運行時崩潰。
由於您通過PM2運行應用程序,因此重新啓動,並且可以通過將--no-autorestart選項傳遞給PM2來禁用。如果你想避免應用程序崩潰,你應該包裝任何代碼,這些代碼可以在try/catch區塊中生成,並嘗試從錯誤中恢復。

Are there any other smarter way to trouble shoot this problem?

這是最有可能不與dns STDLIB模塊的問題。如果我理解正確,那麼您將對動態生成的數據執行名稱解析,而這很可能是您的問題。代碼中的某處有一個或多個函數不能驗證生成的數據,或者由於錯誤而生成無效數據。不幸的是,我們不能幫你解決,因爲你還沒有提供任何代碼。如果你能夠確定哪些代碼可能會導致這種情況,並用它更新問題,那將是非常棒的。

+0

正在重新啓動的進程沒有任何服務器端線程例程。它只處理REST調用。可能大約有30〜40種不同的API。每日交易量爲50-60k電話。它在幾千個網站上使用。除了我可以在服務器端看到的重啓模式之外,沒有觀察到失敗的調用。如果我能得到這個失敗的調用堆棧它將有助於識別原始異步調用:(任何使核心庫吐出更多日誌的方法將調試器附加到生產過程以調試非嚴重錯誤可能不合適。 – WalkInto