2014-11-17 27 views
6

如何讓New Relic記錄使用New Relic應用程序監視使進程崩潰的錯誤?我試圖完成的關鍵事項是有錯誤,這些錯誤會導致進程仍然記錄到,並且會通過某種方式將過濾到儀表板上的這些錯誤。使用New Relic在NodeJS中檢測進程崩潰

這裏是到目前爲止我的理解:

  1. New Relic的他們每分鐘的雲傳輸數據。如果發生uncaughtException,這將導致當前等待傳輸的所有數據都將丟失。

  2. 有一個newrelic.noticeError()這應該採取第二個參數,允許您傳遞一個錯誤的自定義參數。新文物獲取錯誤,但不包含自定義參數。

簡單的例子:

var newrelic = require("newrelic"); 
var express = require("express"); 
var app = express(); 

app.get("/softFail/", function(req, res) { 
    res.send(500, "softFail"); 
}); 

app.get("/hardFail/", function(req, res) { 
    setImmediate(function() { 
     throw new Error("I failed"); 
    }); 
}); 

app.listen(80); 

process.on("uncaughtException", function(err) { 
    console.error("Uncaught Exception"); 
    console.error(err.stack); 
    newrelic.addCustomParameter("crash", "true"); 
    newrelic.noticeError(err); 
    console.log("sending errors to New Relic"); 
    newrelic.agent.harvest(function() { 
     console.log("send complete, crashing process"); 
     process.exit(1); 
    }); 
}); 

使用的代碼塊,如果我叫/爲hardfail /我能夠獲得New Relic的至少記錄錯誤。沒有uncaughtException處理程序我沒有得到任何新的遺物。問題是我無法區分導致進程崩潰的錯誤和正常的HTTP 500錯誤。

這裏的東西的事情我已經試過:

  1. 如果我嘗試添加{ crash : true }noticeError調用它似乎並沒有產生任何影響。

  2. 我試過做domain而不是process.on,這並沒有改變這種情況。

  3. 如果我試圖改變錯誤的name,如err.name = "CrashError"那麼錯誤根本不會被傳輸。

  4. 如果我創建一個自定義錯誤類型,然後新建一個,並將堆棧跟蹤複製到它,它仍然報告爲Error而不是我的新錯誤類型的prototype.name

+0

謝謝!我錯過了「收穫」的號召,你幫了我很多! – Pedro

+0

有沒有解決方法?你是如何得到它的工作? – kfiroo

+0

不幸的是,我們永遠無法找到解決方案。實際上,我們停止使用Newrelic的應用程序監視來支持Loggly。它使錯誤日誌和處理日誌更容易。 – Nucleon

回答

-12

看起來您已經使用New Relic Support創建了一張票,因此我們將通過票證來追蹤此問題。

+4

如果您可以在這裏分享解決方案,以便其他新文物的用戶可以實施它,那將是非常好的。我有同樣的掙扎... – Eugene

+1

凹凸不平,請分享解決方案 – talkol

+0

請在這裏分享解決方案! – Holf