mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
feat(API): Set up error tracking using Sentry (#4394)
* feat(cli): Setup error tracking using Sentry * make error reporting available in the workflows package * address some of the PR comments * create a ErrorReporterProxy like LoggerProxy * remove the `captureError` helper. use ErrorReporterProxy directly * fix linting issues * remove ErrorReporterProxy warnings in tests * check for NODE_ENV === 'production' instead * IErrorReporter -> ErrorReporter * ErrorReporterProxy.getInstance() -> ErrorReporter * allow capturing stacks in warnings as well * make n8n debugging consistent with `npm start` * IReportingOptions -> ReportingOptions * use consistent signature for `error` and `warn` * use Logger instead of console.log
This commit is contained in:
committed by
GitHub
parent
0edd4bcc87
commit
41cb0eec6e
36
packages/workflow/src/ErrorReporterProxy.ts
Normal file
36
packages/workflow/src/ErrorReporterProxy.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import type { Primitives } from './utils';
|
||||
import * as Logger from './LoggerProxy';
|
||||
|
||||
export interface ReportingOptions {
|
||||
level?: 'warning' | 'error';
|
||||
tags?: Record<string, Primitives>;
|
||||
extra?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
interface ErrorReporter {
|
||||
report: (error: Error | string, options?: ReportingOptions) => void;
|
||||
}
|
||||
|
||||
const isProduction = process.env.NODE_ENV === 'production';
|
||||
|
||||
const instance: ErrorReporter = {
|
||||
report: (error, options) => isProduction && Logger.error('ERROR', { error, options }),
|
||||
};
|
||||
|
||||
export function init(errorReporter: ErrorReporter) {
|
||||
instance.report = errorReporter.report;
|
||||
}
|
||||
|
||||
const wrap = (e: unknown) => {
|
||||
if (e instanceof Error) return e;
|
||||
if (typeof e === 'string') return new Error(e);
|
||||
return;
|
||||
};
|
||||
|
||||
export const error = (e: unknown, options?: ReportingOptions) => {
|
||||
const toReport = wrap(e);
|
||||
if (toReport) instance.report(toReport, options);
|
||||
};
|
||||
|
||||
export const warn = (warning: Error | string, options?: ReportingOptions) =>
|
||||
error(warning, { level: 'warning', ...options });
|
||||
@@ -1,4 +1,5 @@
|
||||
import * as LoggerProxy from './LoggerProxy';
|
||||
export * as ErrorReporterProxy from './ErrorReporterProxy';
|
||||
import * as NodeHelpers from './NodeHelpers';
|
||||
import * as ObservableObject from './ObservableObject';
|
||||
import * as TelemetryHelpers from './TelemetryHelpers';
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import * as ErrorReporter from './ErrorReporterProxy';
|
||||
|
||||
export type Primitives = string | number | boolean | bigint | symbol | null | undefined;
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */
|
||||
type Primitives = string | number | boolean | bigint | symbol | null | undefined;
|
||||
export const deepCopy = <T extends ((object | Date) & { toJSON?: () => string }) | Primitives>(
|
||||
source: T,
|
||||
hash = new WeakMap(),
|
||||
@@ -16,6 +19,9 @@ export const deepCopy = <T extends ((object | Date) & { toJSON?: () => string })
|
||||
return source.toJSON() as T;
|
||||
}
|
||||
if (hash.has(source)) {
|
||||
ErrorReporter.warn('Circular reference detected', {
|
||||
extra: { source, path },
|
||||
});
|
||||
return hash.get(source);
|
||||
}
|
||||
// Array
|
||||
|
||||
Reference in New Issue
Block a user