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

Nuc*_*eon 6 node.js newrelic

如何使用New Relic来记录使用New Relic应用程序监控导致进程崩溃的错误?我正在尝试完成的关键事项是出现错误,导致进程仍然被记录,在仪表板上过滤掉这些错误.

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

  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);
    });
});
Run Code Online (Sandbox Code Playgroud)

如果我调用/ hardFail /我能够使用New Relic来至少记录错误,那么使用该代码块.没有uncaughtException处理程序,我没有得到任何新的Relic.问题是我无法区分崩溃进程的错误和正常的HTTP 500错误.

这是我尝试过的东西:

  1. 如果我尝试添加{ crash : true }noticeError通话中它似乎没有任何影响.

  2. 我试图做domain而不是process.on,这不会改变这种情况.

  3. 如果我试图改变name错误,err.name = "CrashError"那么错误根本就不会被传输.

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