Sentry-javascript: withScope 内存泄漏,在@sentry/node 中使用 scope.setTag 时非常明显

创建于 2019-08-12  ·  3评论  ·  资料来源: getsentry/sentry-javascript

套餐+版本

  • [ ] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(节点的乌鸦)_
  • [ ] 其他:

版本:

5.5.0

描述

自 #1762 关闭以来创建一个新问题。
@sentry/node 中存在小的内存泄漏。 用一些长字符串调用setTag使它变大很多。
这是可以识别的,因为它不仅是内存泄漏,而且根据我的 DO droplet 指标,它会导致 CPU 使用率和公共带宽永久增加,这只能通过重新启动服务器来修复。
图片显示了当我添加setTag (7 月 11 日)和删除它时(8 月 9 日)会发生什么。
System memory (1)

Needs Reproduction

最有用的评论

@kamilogorek违规代码在这里: https :

从它的外观来看,范围没有被 GC 处理。

它可能不受欢迎,但我真正想要的是一个干净的 API 调用,它接受异常和变量。 例如Sentry.captureExpection(error, {tags: {foo: 1}}) 。 这将摆脱范围和相关的内存泄漏。

所有3条评论

您能否为此提供一些重现案例? 具有多个并发请求的setTag肯定会增加内存占用,但是一旦范围被 GC 处理,内存应该下降到基线。

@kamilogorek违规代码在这里: https :

从它的外观来看,范围没有被 GC 处理。

它可能不受欢迎,但我真正想要的是一个干净的 API 调用,它接受异常和变量。 例如Sentry.captureExpection(error, {tags: {foo: 1}}) 。 这将摆脱范围和相关的内存泄漏。

withScope在它的生命周期结束时执行popScope操作,从内部数组中删除该层,因此没有对它的强引用 - GC 会自动处理它。
fwfw 您可以将呼叫更改为:

Sentry.withScope((scope) => {
  scope.setUser(user)
  scope.setTags(tags)
  Sentry.captureException(error)
});
此页面是否有帮助?
0 / 5 - 0 等级