From cbd1fc775d70609682ccdf17a8781a4f5b606f96 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 10:38:18 +0100 Subject: [PATCH 01/10] feat(node): Capture exceptions from worker threads --- .../suites/child-process/child.js | 3 + .../suites/child-process/child.mjs | 3 + .../suites/child-process/fork.js | 19 ++++++ .../suites/child-process/fork.mjs | 20 +++++++ .../suites/child-process/test.ts | 58 +++++++++++++++++++ .../suites/child-process/worker.js | 19 ++++++ .../suites/child-process/worker.mjs | 20 +++++++ .../node/src/integrations/childProcess.ts | 35 +++++++---- 8 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 dev-packages/node-integration-tests/suites/child-process/child.js create mode 100644 dev-packages/node-integration-tests/suites/child-process/child.mjs create mode 100644 dev-packages/node-integration-tests/suites/child-process/fork.js create mode 100644 dev-packages/node-integration-tests/suites/child-process/fork.mjs create mode 100644 dev-packages/node-integration-tests/suites/child-process/test.ts create mode 100644 dev-packages/node-integration-tests/suites/child-process/worker.js create mode 100644 dev-packages/node-integration-tests/suites/child-process/worker.mjs diff --git a/dev-packages/node-integration-tests/suites/child-process/child.js b/dev-packages/node-integration-tests/suites/child-process/child.js new file mode 100644 index 000000000000..cb1937007297 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/child.js @@ -0,0 +1,3 @@ +setTimeout(() => { + throw new Error('Test error'); +}, 1000); diff --git a/dev-packages/node-integration-tests/suites/child-process/child.mjs b/dev-packages/node-integration-tests/suites/child-process/child.mjs new file mode 100644 index 000000000000..cb1937007297 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/child.mjs @@ -0,0 +1,3 @@ +setTimeout(() => { + throw new Error('Test error'); +}, 1000); diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.js b/dev-packages/node-integration-tests/suites/child-process/fork.js new file mode 100644 index 000000000000..1307f7c51c39 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/fork.js @@ -0,0 +1,19 @@ +const Sentry = require('@sentry/node'); +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const path = require('path'); +const { fork } = require('child_process'); + +Sentry.init({ + debug: true, + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + integrations: [Sentry.childProcessIntegration()], + transport: loggingTransport, +}); + +// eslint-disable-next-line no-unused-vars +const _child = fork(path.join(__dirname, 'child.mjs')); + +setTimeout(() => { + throw new Error('Exiting main process'); +}, 3000); diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.mjs b/dev-packages/node-integration-tests/suites/child-process/fork.mjs new file mode 100644 index 000000000000..8693ce934b4b --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/fork.mjs @@ -0,0 +1,20 @@ +import * as Sentry from '@sentry/node'; +import { loggingTransport } from '@sentry-internal/node-integration-tests'; +import * as path from 'path'; +import { fork } from 'child_process'; + +const __dirname = new URL('.', import.meta.url).pathname; + +Sentry.init({ + debug: true, + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + integrations: [Sentry.childProcessIntegration()], + transport: loggingTransport, +}); + +const _child = fork(path.join(__dirname, 'child.mjs')); + +setTimeout(() => { + throw new Error('Exiting main process'); +}, 3000); diff --git a/dev-packages/node-integration-tests/suites/child-process/test.ts b/dev-packages/node-integration-tests/suites/child-process/test.ts new file mode 100644 index 000000000000..5c5a6232f48d --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/test.ts @@ -0,0 +1,58 @@ +import type { Event } from '@sentry/core'; +import { conditionalTest } from '../../utils'; +import { cleanupChildProcesses, createRunner } from '../../utils/runner'; + +const WORKER_EVENT: Event = { + exception: { + values: [ + { + type: 'Error', + value: 'Test error', + }, + ], + }, +}; + +const CHILD_EVENT: Event = { + exception: { + values: [ + { + type: 'Error', + value: 'Exiting main process', + }, + ], + }, + breadcrumbs: [ + { + category: 'child_process', + message: "Child process exited with code '1'", + level: 'info', + }, + ], +}; + +describe('should capture child process events', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + describe('worker', () => { + test('ESM', done => { + createRunner(__dirname, 'worker.mjs').expect({ event: WORKER_EVENT }).start(done); + }); + + test('CJS', done => { + createRunner(__dirname, 'worker.js').expect({ event: WORKER_EVENT }).start(done); + }); + }); + + conditionalTest({ min: 20 })('fork', () => { + test('ESM', done => { + createRunner(__dirname, 'fork.mjs').expect({ event: CHILD_EVENT }).start(done); + }); + + test('CJS', done => { + createRunner(__dirname, 'fork.js').expect({ event: CHILD_EVENT }).start(done); + }); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.js b/dev-packages/node-integration-tests/suites/child-process/worker.js new file mode 100644 index 000000000000..86aaac7ead0b --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/worker.js @@ -0,0 +1,19 @@ +const Sentry = require('@sentry/node'); +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const path = require('path'); +const { Worker } = require('worker_threads'); + +Sentry.init({ + debug: true, + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + integrations: [Sentry.childProcessIntegration()], + transport: loggingTransport, +}); + +// eslint-disable-next-line no-unused-vars +const _worker = new Worker(path.join(__dirname, 'child.js')); + +setTimeout(() => { + process.exit(); +}, 3000); diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.mjs b/dev-packages/node-integration-tests/suites/child-process/worker.mjs new file mode 100644 index 000000000000..0934da5f9fdd --- /dev/null +++ b/dev-packages/node-integration-tests/suites/child-process/worker.mjs @@ -0,0 +1,20 @@ +import * as Sentry from '@sentry/node'; +import { loggingTransport } from '@sentry-internal/node-integration-tests'; +import * as path from 'path'; +import { Worker } from 'worker_threads'; + +const __dirname = new URL('.', import.meta.url).pathname; + +Sentry.init({ + debug: true, + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + integrations: [Sentry.childProcessIntegration()], + transport: loggingTransport, +}); + +const _worker = new Worker(path.join(__dirname, 'child.mjs')); + +setTimeout(() => { + process.exit(); +}, 3000); diff --git a/packages/node/src/integrations/childProcess.ts b/packages/node/src/integrations/childProcess.ts index 934bac99dc42..56d4e71fd327 100644 --- a/packages/node/src/integrations/childProcess.ts +++ b/packages/node/src/integrations/childProcess.ts @@ -1,7 +1,7 @@ import type { ChildProcess } from 'node:child_process'; import * as diagnosticsChannel from 'node:diagnostics_channel'; import type { Worker } from 'node:worker_threads'; -import { addBreadcrumb, defineIntegration } from '@sentry/core'; +import { addBreadcrumb, captureException, defineIntegration } from '@sentry/core'; interface Options { /** @@ -10,6 +10,13 @@ interface Options { * @default false */ includeChildProcessArgs?: boolean; + + /** + * Whether to capture errors from worker threads. + * + * @default true + */ + captureWorkerErrors?: boolean; } const INTEGRATION_NAME = 'ChildProcess'; @@ -20,7 +27,7 @@ const INTEGRATION_NAME = 'ChildProcess'; export const childProcessIntegration = defineIntegration((options: Options = {}) => { return { name: INTEGRATION_NAME, - setup(_client) { + setup() { diagnosticsChannel.channel('child_process').subscribe((event: unknown) => { if (event && typeof event === 'object' && 'process' in event) { captureChildProcessEvents(event.process as ChildProcess, options); @@ -29,7 +36,7 @@ export const childProcessIntegration = defineIntegration((options: Options = {}) diagnosticsChannel.channel('worker_threads').subscribe((event: unknown) => { if (event && typeof event === 'object' && 'worker' in event) { - captureWorkerThreadEvents(event.worker as Worker); + captureWorkerThreadEvents(event.worker as Worker, options); } }); }, @@ -62,7 +69,7 @@ function captureChildProcessEvents(child: ChildProcess, options: Options): void addBreadcrumb({ category: 'child_process', message: `Child process exited with code '${code}'`, - level: 'warning', + level: code === 0 ? 'warning' : 'info', data, }); } @@ -82,7 +89,7 @@ function captureChildProcessEvents(child: ChildProcess, options: Options): void }); } -function captureWorkerThreadEvents(worker: Worker): void { +function captureWorkerThreadEvents(worker: Worker, options: Options): void { let threadId: number | undefined; worker @@ -90,11 +97,17 @@ function captureWorkerThreadEvents(worker: Worker): void { threadId = worker.threadId; }) .on('error', error => { - addBreadcrumb({ - category: 'worker_thread', - message: `Worker thread errored with '${error.message}'`, - level: 'error', - data: { threadId }, - }); + if (options.captureWorkerErrors !== false) { + captureException(error, { + mechanism: { type: 'instrument', handled: false, data: { threadId: String(threadId) } }, + }); + } else { + addBreadcrumb({ + category: 'worker_thread', + message: `Worker thread errored with '${error.message}'`, + level: 'error', + data: { threadId }, + }); + } }); } From d8037de9f75951cd8f4c15806ef20fc7a3aa1983 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 10:42:27 +0100 Subject: [PATCH 02/10] Set child process exit level --- packages/node/src/integrations/childProcess.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node/src/integrations/childProcess.ts b/packages/node/src/integrations/childProcess.ts index 56d4e71fd327..0287a52f9c88 100644 --- a/packages/node/src/integrations/childProcess.ts +++ b/packages/node/src/integrations/childProcess.ts @@ -69,7 +69,7 @@ function captureChildProcessEvents(child: ChildProcess, options: Options): void addBreadcrumb({ category: 'child_process', message: `Child process exited with code '${code}'`, - level: code === 0 ? 'warning' : 'info', + level: code === 0 ? 'info' : 'warning', data, }); } From 096d8747aea3484b7d83e29651249e6bd820e41b Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 10:48:11 +0100 Subject: [PATCH 03/10] Lint --- .../node-integration-tests/suites/child-process/fork.js | 2 +- .../node-integration-tests/suites/child-process/fork.mjs | 6 +++--- .../node-integration-tests/suites/child-process/worker.js | 2 +- .../node-integration-tests/suites/child-process/worker.mjs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.js b/dev-packages/node-integration-tests/suites/child-process/fork.js index 1307f7c51c39..a9c4700889f4 100644 --- a/dev-packages/node-integration-tests/suites/child-process/fork.js +++ b/dev-packages/node-integration-tests/suites/child-process/fork.js @@ -1,4 +1,4 @@ -const Sentry = require('@sentry/node'); +const Sentry = require('@sentry/node'); const { loggingTransport } = require('@sentry-internal/node-integration-tests'); const path = require('path'); const { fork } = require('child_process'); diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.mjs b/dev-packages/node-integration-tests/suites/child-process/fork.mjs index 8693ce934b4b..2fb5400764ca 100644 --- a/dev-packages/node-integration-tests/suites/child-process/fork.mjs +++ b/dev-packages/node-integration-tests/suites/child-process/fork.mjs @@ -1,7 +1,7 @@ -import * as Sentry from '@sentry/node'; -import { loggingTransport } from '@sentry-internal/node-integration-tests'; -import * as path from 'path'; import { fork } from 'child_process'; +import * as path from 'path'; +import { loggingTransport } from '@sentry-internal/node-integration-tests'; +import * as Sentry from '@sentry/node'; const __dirname = new URL('.', import.meta.url).pathname; diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.js b/dev-packages/node-integration-tests/suites/child-process/worker.js index 86aaac7ead0b..10553ee40007 100644 --- a/dev-packages/node-integration-tests/suites/child-process/worker.js +++ b/dev-packages/node-integration-tests/suites/child-process/worker.js @@ -1,4 +1,4 @@ -const Sentry = require('@sentry/node'); +const Sentry = require('@sentry/node'); const { loggingTransport } = require('@sentry-internal/node-integration-tests'); const path = require('path'); const { Worker } = require('worker_threads'); diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.mjs b/dev-packages/node-integration-tests/suites/child-process/worker.mjs index 0934da5f9fdd..d059a91e873a 100644 --- a/dev-packages/node-integration-tests/suites/child-process/worker.mjs +++ b/dev-packages/node-integration-tests/suites/child-process/worker.mjs @@ -1,6 +1,6 @@ -import * as Sentry from '@sentry/node'; -import { loggingTransport } from '@sentry-internal/node-integration-tests'; import * as path from 'path'; +import { loggingTransport } from '@sentry-internal/node-integration-tests'; +import * as Sentry from '@sentry/node'; import { Worker } from 'worker_threads'; const __dirname = new URL('.', import.meta.url).pathname; From 344abccdaccc3d9a25e98f27b86adafd05e9d581 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 10:57:27 +0100 Subject: [PATCH 04/10] No new feature --- .../suites/child-process/fork.js | 1 - .../suites/child-process/fork.mjs | 1 - .../suites/child-process/worker.js | 1 - .../suites/child-process/worker.mjs | 1 - .../node/src/integrations/childProcess.ts | 31 ++++++------------- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.js b/dev-packages/node-integration-tests/suites/child-process/fork.js index a9c4700889f4..c6e5cd3f0b7f 100644 --- a/dev-packages/node-integration-tests/suites/child-process/fork.js +++ b/dev-packages/node-integration-tests/suites/child-process/fork.js @@ -7,7 +7,6 @@ Sentry.init({ debug: true, dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [Sentry.childProcessIntegration()], transport: loggingTransport, }); diff --git a/dev-packages/node-integration-tests/suites/child-process/fork.mjs b/dev-packages/node-integration-tests/suites/child-process/fork.mjs index 2fb5400764ca..88503fa887a9 100644 --- a/dev-packages/node-integration-tests/suites/child-process/fork.mjs +++ b/dev-packages/node-integration-tests/suites/child-process/fork.mjs @@ -9,7 +9,6 @@ Sentry.init({ debug: true, dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [Sentry.childProcessIntegration()], transport: loggingTransport, }); diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.js b/dev-packages/node-integration-tests/suites/child-process/worker.js index 10553ee40007..99b645d9001c 100644 --- a/dev-packages/node-integration-tests/suites/child-process/worker.js +++ b/dev-packages/node-integration-tests/suites/child-process/worker.js @@ -7,7 +7,6 @@ Sentry.init({ debug: true, dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [Sentry.childProcessIntegration()], transport: loggingTransport, }); diff --git a/dev-packages/node-integration-tests/suites/child-process/worker.mjs b/dev-packages/node-integration-tests/suites/child-process/worker.mjs index d059a91e873a..dcca0bcc4105 100644 --- a/dev-packages/node-integration-tests/suites/child-process/worker.mjs +++ b/dev-packages/node-integration-tests/suites/child-process/worker.mjs @@ -9,7 +9,6 @@ Sentry.init({ debug: true, dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [Sentry.childProcessIntegration()], transport: loggingTransport, }); diff --git a/packages/node/src/integrations/childProcess.ts b/packages/node/src/integrations/childProcess.ts index 0287a52f9c88..56826051add9 100644 --- a/packages/node/src/integrations/childProcess.ts +++ b/packages/node/src/integrations/childProcess.ts @@ -1,7 +1,7 @@ import type { ChildProcess } from 'node:child_process'; import * as diagnosticsChannel from 'node:diagnostics_channel'; import type { Worker } from 'node:worker_threads'; -import { addBreadcrumb, captureException, defineIntegration } from '@sentry/core'; +import { addBreadcrumb, defineIntegration } from '@sentry/core'; interface Options { /** @@ -10,13 +10,6 @@ interface Options { * @default false */ includeChildProcessArgs?: boolean; - - /** - * Whether to capture errors from worker threads. - * - * @default true - */ - captureWorkerErrors?: boolean; } const INTEGRATION_NAME = 'ChildProcess'; @@ -36,7 +29,7 @@ export const childProcessIntegration = defineIntegration((options: Options = {}) diagnosticsChannel.channel('worker_threads').subscribe((event: unknown) => { if (event && typeof event === 'object' && 'worker' in event) { - captureWorkerThreadEvents(event.worker as Worker, options); + captureWorkerThreadEvents(event.worker as Worker); } }); }, @@ -89,7 +82,7 @@ function captureChildProcessEvents(child: ChildProcess, options: Options): void }); } -function captureWorkerThreadEvents(worker: Worker, options: Options): void { +function captureWorkerThreadEvents(worker: Worker): void { let threadId: number | undefined; worker @@ -97,17 +90,11 @@ function captureWorkerThreadEvents(worker: Worker, options: Options): void { threadId = worker.threadId; }) .on('error', error => { - if (options.captureWorkerErrors !== false) { - captureException(error, { - mechanism: { type: 'instrument', handled: false, data: { threadId: String(threadId) } }, - }); - } else { - addBreadcrumb({ - category: 'worker_thread', - message: `Worker thread errored with '${error.message}'`, - level: 'error', - data: { threadId }, - }); - } + addBreadcrumb({ + category: 'worker_thread', + message: `Worker thread errored with '${error.message}'`, + level: 'error', + data: { threadId }, + }); }); } From 4657510f8dd05bd42ad546d8b97b6469dc645754 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 11:19:01 +0100 Subject: [PATCH 05/10] level --- .../node-integration-tests/suites/child-process/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/node-integration-tests/suites/child-process/test.ts b/dev-packages/node-integration-tests/suites/child-process/test.ts index 5c5a6232f48d..e0054e43b68c 100644 --- a/dev-packages/node-integration-tests/suites/child-process/test.ts +++ b/dev-packages/node-integration-tests/suites/child-process/test.ts @@ -26,7 +26,7 @@ const CHILD_EVENT: Event = { { category: 'child_process', message: "Child process exited with code '1'", - level: 'info', + level: 'warning', }, ], }; From d73756a8f3a80914bb9fd44395cf9f6341f7229b Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 11:19:45 +0100 Subject: [PATCH 06/10] New feature --- .../node/src/integrations/childProcess.ts | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/node/src/integrations/childProcess.ts b/packages/node/src/integrations/childProcess.ts index 56826051add9..0287a52f9c88 100644 --- a/packages/node/src/integrations/childProcess.ts +++ b/packages/node/src/integrations/childProcess.ts @@ -1,7 +1,7 @@ import type { ChildProcess } from 'node:child_process'; import * as diagnosticsChannel from 'node:diagnostics_channel'; import type { Worker } from 'node:worker_threads'; -import { addBreadcrumb, defineIntegration } from '@sentry/core'; +import { addBreadcrumb, captureException, defineIntegration } from '@sentry/core'; interface Options { /** @@ -10,6 +10,13 @@ interface Options { * @default false */ includeChildProcessArgs?: boolean; + + /** + * Whether to capture errors from worker threads. + * + * @default true + */ + captureWorkerErrors?: boolean; } const INTEGRATION_NAME = 'ChildProcess'; @@ -29,7 +36,7 @@ export const childProcessIntegration = defineIntegration((options: Options = {}) diagnosticsChannel.channel('worker_threads').subscribe((event: unknown) => { if (event && typeof event === 'object' && 'worker' in event) { - captureWorkerThreadEvents(event.worker as Worker); + captureWorkerThreadEvents(event.worker as Worker, options); } }); }, @@ -82,7 +89,7 @@ function captureChildProcessEvents(child: ChildProcess, options: Options): void }); } -function captureWorkerThreadEvents(worker: Worker): void { +function captureWorkerThreadEvents(worker: Worker, options: Options): void { let threadId: number | undefined; worker @@ -90,11 +97,17 @@ function captureWorkerThreadEvents(worker: Worker): void { threadId = worker.threadId; }) .on('error', error => { - addBreadcrumb({ - category: 'worker_thread', - message: `Worker thread errored with '${error.message}'`, - level: 'error', - data: { threadId }, - }); + if (options.captureWorkerErrors !== false) { + captureException(error, { + mechanism: { type: 'instrument', handled: false, data: { threadId: String(threadId) } }, + }); + } else { + addBreadcrumb({ + category: 'worker_thread', + message: `Worker thread errored with '${error.message}'`, + level: 'error', + data: { threadId }, + }); + } }); } From f3e1c31ee67705b0812c897744a9682373044959 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 11:53:43 +0100 Subject: [PATCH 07/10] Fix older breadcrumb tests --- .../suites/breadcrumbs/process-thread/app.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-packages/node-integration-tests/suites/breadcrumbs/process-thread/app.mjs b/dev-packages/node-integration-tests/suites/breadcrumbs/process-thread/app.mjs index 903470806ad9..298952d58ced 100644 --- a/dev-packages/node-integration-tests/suites/breadcrumbs/process-thread/app.mjs +++ b/dev-packages/node-integration-tests/suites/breadcrumbs/process-thread/app.mjs @@ -9,6 +9,7 @@ const __dirname = new URL('.', import.meta.url).pathname; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', + integrations: [Sentry.childProcessIntegration({ captureWorkerErrors: false })], transport: loggingTransport, }); From decde3a3fc0982234c3bfdadb1ad19697d9f2aaa Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 14:59:39 +0100 Subject: [PATCH 08/10] Update docs --- packages/node/src/integrations/childProcess.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node/src/integrations/childProcess.ts b/packages/node/src/integrations/childProcess.ts index 0287a52f9c88..6fc6046c7e2f 100644 --- a/packages/node/src/integrations/childProcess.ts +++ b/packages/node/src/integrations/childProcess.ts @@ -22,7 +22,7 @@ interface Options { const INTEGRATION_NAME = 'ChildProcess'; /** - * Capture breadcrumbs for child processes and worker threads. + * Capture breadcrumbs and events for child processes and worker threads. */ export const childProcessIntegration = defineIntegration((options: Options = {}) => { return { From 8004aa08609a9546826df2066fb9aadb6bc08ae1 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 15:22:13 +0100 Subject: [PATCH 09/10] check mechanism --- .../node-integration-tests/suites/child-process/test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dev-packages/node-integration-tests/suites/child-process/test.ts b/dev-packages/node-integration-tests/suites/child-process/test.ts index e0054e43b68c..cf5e1854134b 100644 --- a/dev-packages/node-integration-tests/suites/child-process/test.ts +++ b/dev-packages/node-integration-tests/suites/child-process/test.ts @@ -8,6 +8,13 @@ const WORKER_EVENT: Event = { { type: 'Error', value: 'Test error', + mechanism: { + type: 'instrument', + handled: false, + data: { + threadId: expect.any(String), + }, + }, }, ], }, From 6594c407c3238fb27205ebdd522953e64a0bd8c3 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Jan 2025 16:04:35 +0100 Subject: [PATCH 10/10] Test only Node >= 20 --- .../node-integration-tests/suites/child-process/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/node-integration-tests/suites/child-process/test.ts b/dev-packages/node-integration-tests/suites/child-process/test.ts index cf5e1854134b..9b9064dacf3e 100644 --- a/dev-packages/node-integration-tests/suites/child-process/test.ts +++ b/dev-packages/node-integration-tests/suites/child-process/test.ts @@ -43,7 +43,7 @@ describe('should capture child process events', () => { cleanupChildProcesses(); }); - describe('worker', () => { + conditionalTest({ min: 20 })('worker', () => { test('ESM', done => { createRunner(__dirname, 'worker.mjs').expect({ event: WORKER_EVENT }).start(done); });