From b8b8507ad69cea3ca706ef8230eaf99067e07014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 30 Jul 2025 11:53:02 +0200 Subject: [PATCH] perf(core): Detect event loop blocking (#17805) --- packages/core/package.json | 1 + packages/core/src/errors/error-reporter.ts | 2 + pnpm-lock.yaml | 75 +++++++++++++++------- 3 files changed, 54 insertions(+), 24 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 4784614613..7e12d2f409 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -47,6 +47,7 @@ "@n8n/decorators": "workspace:*", "@n8n/di": "workspace:*", "@sentry/node": "catalog:", + "@sentry/node-native": "^9.42.1", "axios": "catalog:", "callsites": "catalog:", "chardet": "2.0.0", diff --git a/packages/core/src/errors/error-reporter.ts b/packages/core/src/errors/error-reporter.ts index 5806af37bb..d5b68fcba3 100644 --- a/packages/core/src/errors/error-reporter.ts +++ b/packages/core/src/errors/error-reporter.ts @@ -4,6 +4,7 @@ import { Service } from '@n8n/di'; import type { ReportingOptions } from '@n8n/errors'; import type { ErrorEvent, EventHint } from '@sentry/core'; import type { NodeOptions } from '@sentry/node'; +import { eventLoopBlockIntegration } from '@sentry/node-native'; import { AxiosError } from 'axios'; import { ApplicationError, ExecutionCancelledError, BaseError } from 'n8n-workflow'; import { createHash } from 'node:crypto'; @@ -146,6 +147,7 @@ export class ErrorReporter { url: true, }, }), + eventLoopBlockIntegration(), ], }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1704c5e04e..c0b399cb23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -922,7 +922,7 @@ importers: version: 4.3.0 '@getzep/zep-cloud': specifier: 1.0.12 - version: 1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(e83255224da9386305dfb90eaf104268)) + version: 1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(685a0af47c92c1c99f5d7c1501acb3dd)) '@getzep/zep-js': specifier: 0.9.0 version: 0.9.0 @@ -949,7 +949,7 @@ importers: version: 0.3.4(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13) '@langchain/community': specifier: 'catalog:' - version: 0.3.47(dc9073baf40e018f46d70486a38ca362) + version: 0.3.47(d020f0fdc951e6780c547ab03e43240e) '@langchain/core': specifier: 'catalog:' version: 0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)) @@ -1066,7 +1066,7 @@ importers: version: 23.0.1 langchain: specifier: 0.3.29 - version: 0.3.29(e83255224da9386305dfb90eaf104268) + version: 0.3.29(685a0af47c92c1c99f5d7c1501acb3dd) lodash: specifier: 'catalog:' version: 4.17.21 @@ -1730,6 +1730,9 @@ importers: '@sentry/node': specifier: 'catalog:' version: 9.42.1 + '@sentry/node-native': + specifier: ^9.42.1 + version: 9.42.1 axios: specifier: 'catalog:' version: 1.8.3 @@ -6314,6 +6317,10 @@ packages: resolution: {integrity: sha512-ocyN85ndnWRHMtS6kJpYbQiovvXT09UJLIzZfsyj/cIl/kBYaljDVoPHhSWMaMVUWQrP/Ut2Zuse9wnowDvXWg==} engines: {node: '>=18'} + '@sentry-internal/node-native-stacktrace@0.2.2': + resolution: {integrity: sha512-ZRS+a1Ik+w6awjp9na5vHBqLNkIxysfGDswLVAkjtVdBUxtfsEVI8OA6r8PijJC5Gm1oAJJap2e9H7TSiCUQIQ==} + engines: {node: '>=18'} + '@sentry-internal/replay-canvas@9.42.1': resolution: {integrity: sha512-z2Pm7vl5SaK1k/MhYV/CRkDYT32Y6q/CLlV3toKphAK1gZFmJ8FGjYE6DU2Zju2upb9ulgyoU8bLU5DLLZCsZA==} engines: {node: '>=18'} @@ -6342,6 +6349,10 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 '@opentelemetry/semantic-conventions': ^1.34.0 + '@sentry/node-native@9.42.1': + resolution: {integrity: sha512-K64I5I5tqqLeH0CFJitoVP+mPOA558dxvC9Vm6x79fl/W8mgFCGiRROjdpeF0aUWghRGAJUbNREFbI3VrIlUOg==} + engines: {node: '>=18'} + '@sentry/node@9.42.1': resolution: {integrity: sha512-6alU59CUp3NzRWt0zaHl3A1Rv9PeABhtj8cD9fdI5QYj5oFQnxbERY/Y/V9R+pNx3ejwCQRbd+SDApfYeQgejg==} engines: {node: '>=18'} @@ -12768,6 +12779,10 @@ packages: resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} engines: {node: '>=10'} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -18375,7 +18390,7 @@ snapshots: '@currents/commit-info': 1.0.1-beta.0 async-retry: 1.3.3 axios: 1.10.0(debug@4.4.1) - axios-retry: 4.5.0(axios@1.10.0(debug@4.4.1)) + axios-retry: 4.5.0(axios@1.10.0) c12: 1.11.2(magicast@0.3.5) chalk: 4.1.2 commander: 12.1.0 @@ -18678,7 +18693,7 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(e83255224da9386305dfb90eaf104268))': + '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(685a0af47c92c1c99f5d7c1501acb3dd))': dependencies: form-data: 4.0.4 node-fetch: 2.7.0(encoding@0.1.13) @@ -18687,7 +18702,7 @@ snapshots: zod: 3.25.67 optionalDependencies: '@langchain/core': 0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)) - langchain: 0.3.29(e83255224da9386305dfb90eaf104268) + langchain: 0.3.29(685a0af47c92c1c99f5d7c1501acb3dd) transitivePeerDependencies: - encoding @@ -19241,7 +19256,7 @@ snapshots: - aws-crt - encoding - '@langchain/community@0.3.47(dc9073baf40e018f46d70486a38ca362)': + '@langchain/community@0.3.47(d020f0fdc951e6780c547ab03e43240e)': dependencies: '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.53.0)(deepmerge@4.3.1)(dotenv@16.5.0)(encoding@0.1.13)(openai@5.8.1(ws@8.18.2)(zod@3.25.67))(zod@3.25.67) '@ibm-cloud/watsonx-ai': 1.1.2 @@ -19253,7 +19268,7 @@ snapshots: flat: 5.0.2 ibm-cloud-sdk-core: 5.3.2 js-yaml: 4.1.0 - langchain: 0.3.29(e83255224da9386305dfb90eaf104268) + langchain: 0.3.29(685a0af47c92c1c99f5d7c1501acb3dd) langsmith: 0.3.45(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)) openai: 5.8.1(ws@8.18.2)(zod@3.25.67) uuid: 10.0.0 @@ -19267,7 +19282,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.808.0 '@azure/storage-blob': 12.26.0 '@browserbasehq/sdk': 2.6.0(encoding@0.1.13) - '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(e83255224da9386305dfb90eaf104268)) + '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(encoding@0.1.13)(langchain@0.3.29(685a0af47c92c1c99f5d7c1501acb3dd)) '@getzep/zep-js': 0.9.0 '@google-ai/generativelanguage': 2.6.0(encoding@0.1.13) '@google-cloud/storage': 7.12.1(encoding@0.1.13) @@ -20482,6 +20497,11 @@ snapshots: dependencies: '@sentry/core': 9.42.1 + '@sentry-internal/node-native-stacktrace@0.2.2': + dependencies: + detect-libc: 2.0.4 + node-abi: 3.75.0 + '@sentry-internal/replay-canvas@9.42.1': dependencies: '@sentry-internal/replay': 9.42.1 @@ -20515,6 +20535,14 @@ snapshots: '@sentry/opentelemetry': 9.42.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) import-in-the-middle: 1.14.2 + '@sentry/node-native@9.42.1': + dependencies: + '@sentry-internal/node-native-stacktrace': 0.2.2 + '@sentry/core': 9.42.1 + '@sentry/node': 9.42.1 + transitivePeerDependencies: + - supports-color + '@sentry/node@9.42.1': dependencies: '@opentelemetry/api': 1.9.0 @@ -22968,11 +22996,6 @@ snapshots: axe-core@4.7.2: {} - axios-retry@4.5.0(axios@1.10.0(debug@4.4.1)): - dependencies: - axios: 1.10.0(debug@4.4.1) - is-retry-allowed: 2.2.0 - axios-retry@4.5.0(axios@1.10.0): dependencies: axios: 1.10.0 @@ -25016,7 +25039,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.16.1 resolve: 1.22.10 transitivePeerDependencies: @@ -25040,7 +25063,7 @@ snapshots: eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.3)(eslint@9.29.0(jiti@1.21.7)): dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) eslint: 9.29.0(jiti@1.21.7) @@ -25079,7 +25102,7 @@ snapshots: array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 eslint: 9.29.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 @@ -26016,7 +26039,7 @@ snapshots: array-parallel: 0.1.3 array-series: 0.1.5 cross-spawn: 7.0.6 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -26358,7 +26381,7 @@ snapshots: '@types/debug': 4.1.12 '@types/node': 20.19.1 '@types/tough-cookie': 4.0.5 - axios: 1.10.0(debug@4.4.1) + axios: 1.10.0 camelcase: 6.3.0 debug: 4.4.1(supports-color@8.1.1) dotenv: 16.5.0 @@ -26368,7 +26391,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.10.0) + retry-axios: 2.6.0(axios@1.10.0(debug@4.4.1)) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -27582,7 +27605,7 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.29(e83255224da9386305dfb90eaf104268): + langchain@0.3.29(685a0af47c92c1c99f5d7c1501acb3dd): dependencies: '@langchain/core': 0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)) '@langchain/openai': 0.5.16(@langchain/core@0.3.61(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@5.8.1(ws@8.18.2)(zod@3.25.67)))(ws@8.18.2) @@ -28757,6 +28780,10 @@ snapshots: dependencies: semver: 7.7.2 + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + node-abort-controller@3.1.1: {} node-addon-api@7.1.0: {} @@ -29349,7 +29376,7 @@ snapshots: pdf-parse@1.1.1: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) node-ensure: 0.0.0 transitivePeerDependencies: - supports-color @@ -30292,7 +30319,7 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-axios@2.6.0(axios@1.10.0): + retry-axios@2.6.0(axios@1.10.0(debug@4.4.1)): dependencies: axios: 1.10.0 @@ -30319,7 +30346,7 @@ snapshots: rhea@1.0.24: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color