赢得一个定制的New Relic弹球机!只要让其他数据呆子注册FutureStack就可以了。 现在注册

New Relic的Node.js代理1.28.0刚刚发布,它给Express应用中间件带来了新的可视性!表达是Node.js中最常用的web框架,它严重依赖中间件来实现全局(即每个请求)和特定于路由的功能。New Relic Node代理现在可以自动测试这些中间件功能的性能——只要升级您的代理并重新部署!

有什么新鲜事

对于Express所服务的每个请求,在Express发送回响应之前可能会执行许多中间件函数。我们现在为每个中间件功能添加指标,以便您可以看到在给定事务中执行哪些中间件。此外,慢事务跟踪现在包括表示中间件、路由器、挂载的应用程序和路由路径的新段,以显示时间花费在哪里。

让我们举一个简单的例子,由于中间件执行了一些验证而导致应用响应缓慢:

app.use(function (req, res, next) {setTimeout(function() {next()}, 500)})

看看新功能的实际应用,在New Relic APM,到Transactions选项卡,选择transaction“get /path1”。在代理的早期版本中,事务将以这种方式显示在Breakdown表中:

nodejs表1

但现在,这里是“后”视图,显示改进:

nodejs表2

Breakdown表现在显示了在这个事务中执行的每个中间件功能的段。如果你的应用有一个特别慢的交易,交易跟踪提供了单个请求/响应周期的细粒度细节。之前的Trace细节是这样的:

跟踪信息截图

我们可以看到有一个定时器花了很长时间,但我们无法看到它是从哪里被调用的。在新版本中,事务跟踪是这样的:

nodejs表4

现在我们可以看到定时器在验证器中间件。在左列中,我们可以看到每个中间件的总持续时间。(请注意/query和/expressInit中间件是内置在Express中的,为了透明性,它们总是会显示出来。)

还要注意,路由处理程序(响应程序)本身是树中的最后一个段,并且嵌套在“route Path: /path1”下。Express中的一个路由路径可以有多个处理程序,所以通过这样安排,我们可以将这些处理程序显示为route path段的子片段。处理程序本身是一个匿名函数;如果它有一个名称,它将被使用在段名的末尾,而不是匿名。

错误处理

错误处理程序的处理方式与其他中间件相同,因为它们只是Express中的一种特定类型的中间件。我们的建议是为错误处理程序使用命名函数,以便能够区分生成的度量。

下面的示例应用程序有两个错误处理程序。第一个处理特定的错误,第二个是一个捕获所有错误处理程序:

app.get('/path2', function(req, res, next) {next(new Error('mySpecificError'))}) app.use(function mySpecificErrorHandler(err, req, res, next) {if (err, req, res, next);app.use(function catchAllErrorHandler(err, req, res, next) {res.status(500).end()})

当/path2被调用时,特定的错误被抛出并由第一个错误处理程序处理。事务跟踪将只包括实际执行的一个错误处理程序。

下面是一个错误处理程序如何显示在Breakdown表中的示例:

错误故障截图

下面是一个事务如何跟踪错误中间件段的例子:

nodejs表6

当调用/path3时,错误将通过第一个错误处理程序,并传递给第二个错误处理程序。因此,跟踪显示了两个错误处理程序的片段。

nodejs表7

路由器

作为路由器一部分的中间件函数将在Breakdown表中显示整个路径(包括路由器挂载的路径),如下所示:

nodejs表8

在事务跟踪中,有一个单独的段表示路由器:

nodejs表9

安装应用程序

一个Express应用程序可以被用作另一个Express应用程序的子路由器,类似于路由器的使用方式。下面的截图显示了三个中间件,它们是应用程序挂载在path /subapp1上的一部分:

nodejs表10

类似地,事务跟踪显示一个单独的段,表示挂载的应用程序:

nodejs表11

结论

Express是New Relic的Node.js用户中使用最广泛的一个框架,这些改变旨在让Express用户更好地了解全局和特定于路由的Express中间件功能。

如果您对这些改进有反馈或建议,请在New Relic论坛取得联系-我们很乐意听到你的消息!

背景图像礼貌的Shutterstock.com