Sentry-javascript: Fuite de mémoire withScope, très évidente lors de l'utilisation de scope.setTag dans @sentry/node

Créé le 12 août 2019  ·  3Commentaires  ·  Source: getsentry/sentry-javascript

Forfait + Version

  • [ ] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(corbeau pour nœud)_
  • [ ] autre:

Version:

5.5.0

La description

Création d'un nouveau problème puisque #1762 a été fermé.
Il existe une petite fuite de mémoire dans @sentry/node. Appeler setTag avec de longues chaînes le rend beaucoup plus gros.
Ceci est identifiable car il ne s'agit pas seulement d'une fuite de mémoire, mais selon mes métriques de gouttelettes DO, cela provoque une augmentation permanente de l'utilisation du processeur et de la bande passante publique qui ne peut être corrigée qu'en redémarrant le serveur.
La photo montre ce qui se passe lorsque j'ai ajouté setTag (11 juillet) et quand je l'ai supprimé (9 août).
System memory (1)

Needs Reproduction

Commentaire le plus utile

@kamilogorek le code incriminé est ici : https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

à première vue, la portée n'est pas GC'd.

cela peut être impopulaire, mais tout ce que je veux vraiment, c'est un appel API propre qui prend une exception et des variables. par exemple Sentry.captureExpection(error, {tags: {foo: 1}}) . cela éliminerait les étendues et les fuites de mémoire associées.

Tous les 3 commentaires

Êtes-vous en mesure de fournir un cas de reproduction pour cela? setTag avec plusieurs requêtes simultanées augmentera certainement l'empreinte mémoire, mais une fois qu'une portée est GC, la mémoire devrait revenir à la ligne de base.

@kamilogorek le code incriminé est ici : https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

à première vue, la portée n'est pas GC'd.

cela peut être impopulaire, mais tout ce que je veux vraiment, c'est un appel API propre qui prend une exception et des variables. par exemple Sentry.captureExpection(error, {tags: {foo: 1}}) . cela éliminerait les étendues et les fuites de mémoire associées.

withScope à la fin de son cycle de vie effectue une opération popScope qui supprime la couche du tableau interne, il n'y a donc pas de référence forte à celle-ci - GC s'en occupe automatiquement.
fwfw vous pouvez changer votre appel en :

Sentry.withScope((scope) => {
  scope.setUser(user)
  scope.setTags(tags)
  Sentry.captureException(error)
});
Cette page vous a été utile?
0 / 5 - 0 notes