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ドロップレットメトリックによると、サーバーを再起動することによってのみ修正できるCPU使用率と帯域幅パブリックの永続的な増加を引き起こすため、識別可能です。
Picは、 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}}) 。 これにより、スコープと関連するメモリリークが解消されます。

ライフサイクルの最後にwithScopepopScope操作を実行して、内部配列からレイヤーを削除します。したがって、このレイヤーへの強い参照はありません。GCが自動的に処理します。
fwfwあなたはあなたの呼び出しを次のように変更することができます:

Sentry.withScope((scope) => {
  scope.setUser(user)
  scope.setTags(tags)
  Sentry.captureException(error)
});
このページは役に立ちましたか?
0 / 5 - 0 評価