Sentry-javascript: kebocoran memori withScope, sangat jelas saat menggunakan scope.setTag di @sentry/node

Dibuat pada 12 Agu 2019  ·  3Komentar  ·  Sumber: getsentry/sentry-javascript

Paket + Versi

  • [ ] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(gagak untuk simpul)_
  • [ ] lainnya:

Versi: kapan:

5.5.0

Keterangan

Membuat masalah baru sejak #1762 ditutup.
Ada kebocoran memori kecil di @sentry/node. Memanggil setTag dengan beberapa string panjang membuatnya jauh lebih besar.
Ini dapat diidentifikasi karena bukan hanya kebocoran memori, tetapi menurut metrik droplet DO saya, ini menyebabkan peningkatan permanen dalam penggunaan CPU & Bandwidth publik yang hanya dapat diperbaiki dengan me-restart server.
Pic menunjukkan apa yang terjadi ketika saya menambahkan setTag (11 Juli) dan ketika saya menghapusnya (9 Agustus).
System memory (1)

Needs Reproduction

Komentar yang paling membantu

@kamilogorek kode yang menyinggung ada di sini: https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

dari kelihatannya, ruang lingkupnya tidak mendapatkan GC.

ini mungkin tidak populer, tetapi yang saya inginkan hanyalah panggilan API bersih yang menggunakan pengecualian & variabel. misalnya Sentry.captureExpection(error, {tags: {foo: 1}}) . yang akan menghilangkan cakupan & kebocoran memori terkait.

Semua 3 komentar

Apakah Anda dapat memberikan beberapa kasus repro untuk ini? setTag dengan beberapa permintaan bersamaan pasti akan meningkatkan jejak memori, tetapi setelah cakupan GC, memori harus turun ke garis dasar.

@kamilogorek kode yang menyinggung ada di sini: https://github.com/ParabolInc/action/blob/0bde4b002aa3d53fc00f1febcb39185079d827f2/packages/server/utils/sendToSentry.ts#L28 -L35

dari kelihatannya, ruang lingkupnya tidak mendapatkan GC.

ini mungkin tidak populer, tetapi yang saya inginkan hanyalah panggilan API bersih yang menggunakan pengecualian & variabel. misalnya Sentry.captureExpection(error, {tags: {foo: 1}}) . yang akan menghilangkan cakupan & kebocoran memori terkait.

withScope di akhir siklus hidupnya melakukan operasi popScope yang menghilangkan lapisan dari larik internal, sehingga tidak ada referensi yang kuat untuk itu - GC menanganinya secara otomatis.
fwfw Anda dapat mengubah panggilan Anda ke:

Sentry.withScope((scope) => {
  scope.setUser(user)
  scope.setTags(tags)
  Sentry.captureException(error)
});
Apakah halaman ini membantu?
0 / 5 - 0 peringkat