使用NodeJS中的New Relic检测进程崩溃

时间:2014-11-17 01:06:14

标签: node.js newrelic

如何使用New Relic来记录使用New Relic应用程序监控导致进程崩溃的错误?我试图完成的关键事项是,错误导致流程崩溃仍然会被记录,并且某种方式过滤掉仪表板上的这些错误

到目前为止我的理解是这样的:

  1. New Relic每分钟都会将数据传输到云端。如果发生uncaughtException,则会导致当前等待传输的所有数据丢失。

  2. 有一个newrelic.noticeError()应该采用第二个参数,允许您传递带有错误的自定义参数。新遗物得到错误,但不是自定义参数。

  3. 简单示例:

    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处理程序,我就无法获得New Relic的任何内容。问题在于我无法区分导致进程崩溃的错误和正常的HTTP 500错误。

    这是我尝试过的事情:

    1. 如果我尝试将{ crash : true }添加到noticeError来电,它似乎没有任何影响。

    2. 我尝试过domain而不是process.on,这并没有改变这种情况。

    3. 如果我尝试更改错误的name,例如err.name = "CrashError",则错误根本无法传输。

    4. 如果我创建了一个自定义错误类型,然后新建了它,并将堆栈跟踪复制到它上面,它仍然报告为Error类型,而不是我的新错误的prototype.name类型。

1 个答案:

答案 0 :(得分:-14)

看起来你已经创建了一张New Relic Support的门票,所以我们会通过门票来追问这个问题。