elastic APM 和 NestJS 不区分 graphql 查询

Posted

技术标签:

【中文标题】elastic APM 和 NestJS 不区分 graphql 查询【英文标题】:elastic APM and NestJS does not differentiate graphql queries 【发布时间】:2021-01-27 02:29:34 【问题描述】:

我正在将 elastic-apm-node 包添加到我们的 nestjs 后端。我正在使用nestjs 的graphql 功能。正因为如此,所有请求在弹性中合并为/graphql

这是应该的吗?我想,既然 apollo-server-express 由 nestjs 也使用的 elastic-apm-node 支持,它应该会更好地显示它。我错过了什么吗?

更新

graphql 功能是使用 Nestjs 的文档设置的:https://docs.nestjs.com/graphql/quick-start 这基本上是我正在使用的他们推荐的设置。

【问题讨论】:

【参考方案1】:

如果不确切知道您如何一起使用 NestJS 和 GraphQL,并且不知道 NestJS 本身使用 Apollo Server 的哪些部分,很难说。查看我正在使用nestjs 的graphql 功能 的一小部分示例会很有用。

这里有一些数据点可以帮助您缩小范围。此外,在代理存储库中打开an issue 或a question in their forums 可能会得到更多的关注。

Apollo 服务器的 Elastic APM 工具通过包装 apollo-server-core 模块的 runHttpQuery 函数和 marking the transaction with trans._graphqlRoute 来工作。

当代理sees this _graphqlRoute property 时,它会运行一些代码来设置事务的默认名称

      if (trans._graphqlRoute) 
        var name = queries.length > 0 ? queries.join(', ') : 'Unknown GraphQL query'
        if (trans.req) var path = getPathFromRequest(trans.req, true)
        var defaultName = name
        defaultName = path ? defaultName + ' (' + path + ')' : defaultName
        defaultName = operationName ? operationName + ' ' + defaultName : defaultName
        trans.setDefaultName(defaultName)
        trans.type = 'graphql'
      

在您的应用程序中,_graphqlRoute 属性没有被设置,或者上面的重命名代码做了一些奇怪的事情,或者 NestJS 出现并在使用上面的代码命名事务后重命名了事务。

更具体地了解你在做什么可以帮助人们缩小你的问题范围。

【讨论】:

更新了问题,提供了我正在使用的 graphql 设置的链接。 @theva 虽然这是一个有用的教程,但它相当大且通用——你是否碰巧在 GitHub 的某个地方有一个独立的嵌套站点/应用程序示例?

以上是关于elastic APM 和 NestJS 不区分 graphql 查询的主要内容,如果未能解决你的问题,请参考以下文章

Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM

多语言应用性能监控系统:Elastic APM

Observability:OpenTelemetry 在 Elastic APM 中的集成

Observability:使用 Elastic APM 监控 Elastic Enterprise Search 性能

Observability:使用 Elastic APM 监控 Elastic Enterprise Search 性能

Elastic:应用程序性能监控/管理(APM)实践