diff --git a/packages/cli/src/ErrorReporting.ts b/packages/cli/src/ErrorReporting.ts index f59b29c13..776ee270a 100644 --- a/packages/cli/src/ErrorReporting.ts +++ b/packages/cli/src/ErrorReporting.ts @@ -40,10 +40,11 @@ export const initErrorHandling = async () => { const seenErrors = new Set(); addGlobalEventProcessor((event, { originalException }) => { if (originalException instanceof ApplicationError) { - const { level, extra } = originalException; + const { level, extra, tags } = originalException; if (level === 'warning') return null; event.level = level; if (extra) event.extra = { ...event.extra, ...extra }; + if (tags) event.tags = { ...event.tags, ...tags }; } if (!event.exception) return null; diff --git a/packages/workflow/package.json b/packages/workflow/package.json index 9c7a02682..a9a3d72eb 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -51,6 +51,7 @@ "@n8n/tournament": "1.0.2", "@n8n_io/riot-tmpl": "4.0.0", "ast-types": "0.15.2", + "callsites": "3.1.0", "crypto-js": "4.2.0", "deep-equal": "2.2.0", "esprima-next": "5.8.4", diff --git a/packages/workflow/src/errors/application.error.ts b/packages/workflow/src/errors/application.error.ts index 4b92419c9..79002c074 100644 --- a/packages/workflow/src/errors/application.error.ts +++ b/packages/workflow/src/errors/application.error.ts @@ -1,3 +1,4 @@ +import callsites from 'callsites'; import type { Event } from '@sentry/node'; type Level = 'warning' | 'error' | 'fatal'; @@ -13,13 +14,22 @@ export class ApplicationError extends Error { readonly extra?: Event['extra']; + readonly packageName?: string; + constructor( message: string, - { level, tags, extra, ...rest }: Partial & ReportingOptions = {}, + { level, tags = {}, extra, ...rest }: Partial & ReportingOptions = {}, ) { super(message, rest); this.level = level ?? 'error'; this.tags = tags; this.extra = extra; + + try { + const filePath = callsites()[2].getFileName() ?? ''; + const match = /packages\/([^\/]+)\//.exec(filePath)?.[1]; + + if (match) this.tags.packageName = match; + } catch {} } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb08afd27..c3c07ffa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1563,6 +1563,9 @@ importers: ast-types: specifier: 0.15.2 version: 0.15.2 + callsites: + specifier: 3.1.0 + version: 3.1.0 crypto-js: specifier: 4.2.0 version: 4.2.0 @@ -8866,7 +8869,7 @@ packages: ts-dedent: 2.2.0 type-fest: 2.19.0 vue: 3.3.4 - vue-component-type-helpers: 1.8.24 + vue-component-type-helpers: 1.8.25 transitivePeerDependencies: - encoding - supports-color @@ -11392,7 +11395,7 @@ packages: /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2(debug@3.2.7) transitivePeerDependencies: - debug dev: false @@ -11421,11 +11424,12 @@ packages: form-data: 4.0.0 transitivePeerDependencies: - debug + dev: true /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2(debug@3.2.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -15138,6 +15142,7 @@ packages: optional: true dependencies: debug: 4.3.4(supports-color@8.1.1) + dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -21222,7 +21227,7 @@ packages: resolution: {integrity: sha512-aXYe/D+28kF63W8Cz53t09ypEORz+ULeDCahdAqhVrRm2scbOXFbtnn0GGhvMpYe45grepLKuwui9KxrZ2ZuMw==} engines: {node: '>=14.17.0'} dependencies: - axios: 0.27.2(debug@4.3.4) + axios: 0.27.2(debug@3.2.7) transitivePeerDependencies: - debug dev: false @@ -25320,8 +25325,8 @@ packages: vue: 3.3.4 dev: false - /vue-component-type-helpers@1.8.24: - resolution: {integrity: sha512-lqWs/7fdRXoSBAlbouHBX+LNuaY6gI9xWW34m/ZIz9zVPYHEyw0b2/zaCBwlKx0NtKTeF/6pOpvrxVkh7nhIYg==} + /vue-component-type-helpers@1.8.25: + resolution: {integrity: sha512-NCA6sekiJIMnMs4DdORxATXD+/NRkQpS32UC+I1KQJUasx+Z7MZUb3Y+MsKsFmX+PgyTYSteb73JW77AibaCCw==} dev: true /vue-component-type-helpers@1.8.4: