在 NestJS 应用程序中的 Newrelic 中注释匿名中间件

Mah*_*tan 4 node.js express newrelic nestjs

我正在为一个项目使用 NestJS(带有 Express Server)并尝试优化某些端点的性能,使用 New Relic 我注意到所有端点的大部分响应时间都花在匿名中间件上,达到 89 % 在某些时候。

在此处输入图片说明

有没有办法找出这是哪个中间件?

Jay*_*iel 5

我已经在另一个问题中回答了这个问题,但我想我应该更深入地了解 Nest 引擎盖下发生的事情。

Nest 中的路由处理程序在技术上是 express 中的中间件。IE

@Controller('test')
export class TestController {
  @Get()
  testGet() {
    return 'do the thing';
  }
}
Run Code Online (Sandbox Code Playgroud)

Get 在引擎盖下(通过一些非常棒的代码)转变为

app.get('test', (req, res, next) => {
  res.send('do the thing');
})
Run Code Online (Sandbox Code Playgroud)

现在当我们添加一个过滤器

@Controller('test')
export class TestController {
  @Get()
  @UseFilter(SomeExceptionFilter)
  testGet() {
    return 'do the thing';
  }
}
Run Code Online (Sandbox Code Playgroud)

更多的魔法发生了,我们明白了

app.get('test', (req, res, next) => {
  let returnVal = '';
  try {
    returnVal = controller.testGet();
  } catch (err) {
    returnVal = someExceptionFilterInstnace.catch(err, customArgumentHostThatNestMaintains);
  }
  res.send(returnVal);
})
Run Code Online (Sandbox Code Playgroud)

(免责声明:这不是实际发生的完美的 1:1 表示,因为有很多事情发生,但这应该让人明白它最终都是中间件)

当您添加服务时也是如此,它们只是 express/fastify 中间件内部的方法调用,因此它们不会在 newrelic 中以一种很好的方式被破坏。

不幸的是,我不知道在 newrelic 中有什么好方法可以帮助解决这个问题,也不知道如何添加更好的注释。查看中间件的时间,您有 218 毫秒,这还不错。很可能是某个地方的数据库操作,所以我会检查你的管道、守卫和拦截器,以及你的服务,看看你是否有任何可能的大查询。如果不出意外,您可以在本地进行一些分析并获得有关所用时间的更多原始信息