Sentry-javascript: vazamento de memória withScope, muito óbvio ao usar scope.setTag em @ sentry / node

Criado em 12 ago. 2019  ·  3Comentários  ·  Fonte: getsentry/sentry-javascript

Pacote + Versão

  • [] @sentry/browser
  • [x] @sentry/node
  • [] raven-js
  • [] raven-node _ (raven para o nó) _
  • [ ] de outros:

Versão:

5.5.0

Descrição

Criando um novo problema desde o fechamento do nº 1762.
Existe um pequeno vazamento de memória em @ sentry / node. Chamar setTag com algumas strings longas torna-o muito maior.
Isso é identificável porque não é apenas um vazamento de memória, mas de acordo com minhas métricas de droplet DO, causa um aumento permanente no uso da CPU e largura de banda pública que só pode ser corrigido reiniciando o servidor.
A foto mostra o que acontece quando adicionei setTag (11 de julho) e quando o removi (9 de agosto).
System memory (1)

Needs Reproduction

Comentários muito úteis

@kamilogorek o código ofensivo está aqui: https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

pelo que parece, o osciloscópio não está recebendo GC.

pode ser impopular, mas tudo que eu realmente quero é uma chamada de API limpa que tenha uma exceção e variáveis. por exemplo, Sentry.captureExpection(error, {tags: {foo: 1}}) . isso eliminaria os escopos e vazamentos de memória associados.

Todos 3 comentários

Você pode fornecer algum caso de reprodução para isso? setTag com várias solicitações simultâneas certamente aumentará a área de cobertura da memória, mas uma vez que um escopo é GC, a memória deve cair para a linha de base.

@kamilogorek o código ofensivo está aqui: https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

pelo que parece, o osciloscópio não está recebendo GC.

pode ser impopular, mas tudo que eu realmente quero é uma chamada de API limpa que tenha uma exceção e variáveis. por exemplo, Sentry.captureExpection(error, {tags: {foo: 1}}) . isso eliminaria os escopos e vazamentos de memória associados.

withScope no final de seu ciclo de vida executa uma operação popScope que remove a camada do array interno, portanto, não há nenhuma referência forte a ela - o GC cuida disso automaticamente.
fwfw você pode mudar sua chamada para:

Sentry.withScope((scope) => {
  scope.setUser(user)
  scope.setTags(tags)
  Sentry.captureException(error)
});
Esta página foi útil?
0 / 5 - 0 avaliações