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

Annotating an annonymus middleware in Newrelic in a NestJS app

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

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

我已经在 another question 中对此做出了回答,但我认为我应该在这里更深入地了解 Nest 的幕后情况。

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

@Controller('test')
export class TestController {
  @Get()
  testGet() {
    return 'do the thing';
  }
}

Get 在幕后进行了转换(通过一些非常棒的代码)

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

现在当我们添加过滤器时

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

更多的奇迹发生了,我们明白了

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

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

添加服务时也会发生这种情况,它们只是 express/fastify 中间件内部的方法调用,因此它们不会在 newrelic 中以很好的方式分解。

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