From ab0766ce336553c9f7ea733a7e6691cd471525c3 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Thu, 4 Jan 2024 17:10:43 +0100 Subject: [PATCH] fix(node): Anr doesn't block exit --- .../suites/anr/should-exit-forced.js | 19 +++++++++++++++++++ .../suites/anr/should-exit.js | 1 - .../node-integration-tests/suites/anr/test.ts | 16 +++++++++++++++- packages/node/src/integrations/anr/index.ts | 5 +++-- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 dev-packages/node-integration-tests/suites/anr/should-exit-forced.js diff --git a/dev-packages/node-integration-tests/suites/anr/should-exit-forced.js b/dev-packages/node-integration-tests/suites/anr/should-exit-forced.js new file mode 100644 index 000000000000..cee261e8ccb3 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/anr/should-exit-forced.js @@ -0,0 +1,19 @@ +const Sentry = require('@sentry/node'); + +function configureSentry() { + Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + debug: true, + autoSessionTracking: false, + integrations: [new Sentry.Integrations.Anr({ captureStackTrace: true })], + }); +} + +async function main() { + configureSentry(); + await new Promise(resolve => setTimeout(resolve, 1000)); + process.exit(0); +} + +main(); diff --git a/dev-packages/node-integration-tests/suites/anr/should-exit.js b/dev-packages/node-integration-tests/suites/anr/should-exit.js index cee261e8ccb3..7d0ba8db4484 100644 --- a/dev-packages/node-integration-tests/suites/anr/should-exit.js +++ b/dev-packages/node-integration-tests/suites/anr/should-exit.js @@ -13,7 +13,6 @@ function configureSentry() { async function main() { configureSentry(); await new Promise(resolve => setTimeout(resolve, 1000)); - process.exit(0); } main(); diff --git a/dev-packages/node-integration-tests/suites/anr/test.ts b/dev-packages/node-integration-tests/suites/anr/test.ts index 1da0c0557bf9..2c2e513559cf 100644 --- a/dev-packages/node-integration-tests/suites/anr/test.ts +++ b/dev-packages/node-integration-tests/suites/anr/test.ts @@ -115,7 +115,7 @@ conditionalTest({ min: 16 })('should report ANR when event loop blocked', () => }); }); - test('can exit', done => { + test('should exit', done => { const testScriptPath = path.resolve(__dirname, 'should-exit.js'); let hasClosed = false; @@ -129,6 +129,20 @@ conditionalTest({ min: 16 })('should report ANR when event loop blocked', () => }); }); + test('should exit forced', done => { + const testScriptPath = path.resolve(__dirname, 'should-exit-forced.js'); + let hasClosed = false; + + setTimeout(() => { + expect(hasClosed).toBe(true); + done(); + }, 5_000); + + childProcess.exec(`node ${testScriptPath}`, { encoding: 'utf8' }, () => { + hasClosed = true; + }); + }); + test('With session', done => { expect.assertions(9); diff --git a/packages/node/src/integrations/anr/index.ts b/packages/node/src/integrations/anr/index.ts index cbc0c47cbfc7..3aa71f0589f3 100644 --- a/packages/node/src/integrations/anr/index.ts +++ b/packages/node/src/integrations/anr/index.ts @@ -122,8 +122,6 @@ async function _startWorker(client: NodeClient, _options: Partial): Pro const worker = new Worker(new URL(`data:application/javascript;base64,${base64WorkerScript}`), { workerData: options, }); - // Ensure this thread can't block app exit - worker.unref(); process.on('exit', () => { worker.terminate(); @@ -160,4 +158,7 @@ async function _startWorker(client: NodeClient, _options: Partial): Pro clearInterval(timer); log('ANR worker exit', code); }); + + // Ensure this thread can't block app exit + worker.unref(); }