From 1763f021b6e2766799f5221edd0d486d0e4a0f7f Mon Sep 17 00:00:00 2001 From: Alexander Rodionov Date: Wed, 25 Oct 2023 21:19:48 +0400 Subject: [PATCH] refactor: capture only specific errors --- src/Commands/RunRepeater.ts | 10 ++++++++-- src/Config/CliBuilder.ts | 11 +++++++++-- src/Repeater/DefaultRepeaterLauncher.ts | 4 +++- src/Repeater/DefaultRepeaterServer.ts | 10 +++++++--- src/Repeater/ServerRepeaterLauncher.ts | 4 +++- src/Utils/Logger.ts | 13 ------------- 6 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/Commands/RunRepeater.ts b/src/Commands/RunRepeater.ts index d8701852..38f71cdc 100644 --- a/src/Commands/RunRepeater.ts +++ b/src/Commands/RunRepeater.ts @@ -10,6 +10,7 @@ import { } from '../Repeater'; import { Arguments, Argv, CommandModule } from 'yargs'; import { Lifecycle } from 'tsyringe'; +import { captureException } from '@sentry/node'; import { normalize } from 'path'; export class RunRepeater implements CommandModule { @@ -244,12 +245,16 @@ export class RunRepeater implements CommandModule { if (args.remove) { await repeaterLauncher.uninstall(); - process.exit(0); + process.exitCode = 0; + + return; } if (args.daemon) { await repeaterLauncher.install(); - process.exit(0); + process.exitCode = 0; + + return; } try { @@ -262,6 +267,7 @@ export class RunRepeater implements CommandModule { await repeaterLauncher.run(args.id as string, args.run as boolean); } catch (e) { + captureException(e); logger.error(e); await repeaterLauncher.close(); process.exitCode = 1; diff --git a/src/Config/CliBuilder.ts b/src/Config/CliBuilder.ts index 2caa9b11..e76192a4 100644 --- a/src/Config/CliBuilder.ts +++ b/src/Config/CliBuilder.ts @@ -3,6 +3,7 @@ import { ClusterArgs, Helpers, logger, LogLevel, Sentry } from '../Utils'; import { SystemConfigManager } from './SystemConfigManager'; import { CliInfo } from './CliInfo'; import { Arguments, Argv, CommandModule } from 'yargs'; +import { captureException } from '@sentry/node'; export interface CliBuilderOptions { info: CliInfo; @@ -108,7 +109,7 @@ export class CliBuilder { const systemConfigManager = new SystemConfigManager(args.api as string); const systemConfig = await systemConfigManager.read(); - return Sentry.runWithAsyncContext(() => { + return Sentry.runWithAsyncContext(async () => { this.initSentry(systemConfig.sentryDsn); Sentry.setContext('args', args); @@ -116,7 +117,13 @@ export class CliBuilder { this.initSentry(rotatedSystemConfig.sentryDsn); }); - return handler(args); + try { + return await Promise.resolve(handler(args)); + } catch (e) { + captureException(e); + + throw e; + } }); }; diff --git a/src/Repeater/DefaultRepeaterLauncher.ts b/src/Repeater/DefaultRepeaterLauncher.ts index 50072876..5dfc27ba 100644 --- a/src/Repeater/DefaultRepeaterLauncher.ts +++ b/src/Repeater/DefaultRepeaterLauncher.ts @@ -18,6 +18,7 @@ import { RepeaterCommandHub } from './RepeaterCommandHub'; import { RuntimeDetector } from './RuntimeDetector'; import { gt } from 'semver'; import chalk from 'chalk'; +import { captureException } from '@sentry/node'; import { delay, inject, injectable } from 'tsyringe'; import Timer = NodeJS.Timer; @@ -40,9 +41,10 @@ export class DefaultRepeaterLauncher implements RepeaterLauncher { @inject(delay(() => CliInfo)) private readonly info: CliInfo ) { this.bus.onReconnectionFailure(async (e: Error) => { + captureException(e); logger.error(e); await this.close(); - process.exit(1); + process.exitCode = 1; }); } diff --git a/src/Repeater/DefaultRepeaterServer.ts b/src/Repeater/DefaultRepeaterServer.ts index f53af347..c869b76f 100644 --- a/src/Repeater/DefaultRepeaterServer.ts +++ b/src/Repeater/DefaultRepeaterServer.ts @@ -18,6 +18,7 @@ import { inject, injectable } from 'tsyringe'; import io, { Socket } from 'socket.io-client'; import parser from 'socket.io-msgpack-parser'; import { SocksProxyAgent } from 'socks-proxy-agent'; +import { captureException, captureMessage } from '@sentry/node'; import { once } from 'events'; import { parse } from 'url'; import Timer = NodeJS.Timer; @@ -170,9 +171,11 @@ export class DefaultRepeaterServer implements RepeaterServer { public errorOccurred( handler: (event: RepeaterServerErrorEvent) => void | Promise ): void { - this.socket.on('error', (payload, callback) => - this.processEventHandler('error', payload, handler, callback) - ); + this.socket.on('error', (payload, callback) => { + captureMessage(payload.message); + + return this.processEventHandler('error', payload, handler, callback); + }); } public reconnectionAttempted( @@ -220,6 +223,7 @@ export class DefaultRepeaterServer implements RepeaterServer { callback(response); } catch (error) { + captureException(error); logger.debug( 'Error processing event "%s" with the following payload: %s. Details: %s', event, diff --git a/src/Repeater/ServerRepeaterLauncher.ts b/src/Repeater/ServerRepeaterLauncher.ts index 90d5d789..cda795ac 100644 --- a/src/Repeater/ServerRepeaterLauncher.ts +++ b/src/Repeater/ServerRepeaterLauncher.ts @@ -15,6 +15,7 @@ import { CliInfo } from '../Config'; import { RepeaterCommandHub } from './RepeaterCommandHub'; import { delay, inject, injectable } from 'tsyringe'; import chalk from 'chalk'; +import { captureException } from '@sentry/node'; @injectable() export class ServerRepeaterLauncher implements RepeaterLauncher { @@ -161,9 +162,10 @@ export class ServerRepeaterLauncher implements RepeaterLauncher { } private reconnectionFailed({ error }: RepeaterServerReconnectionFailedEvent) { + captureException(error); logger.error(error); this.close().catch(logger.error); - process.exit(1); + process.exitCode = 1; } private async testingNetwork(event: RepeaterServerNetworkTestEvent) { diff --git a/src/Utils/Logger.ts b/src/Utils/Logger.ts index d087d73d..8dd8e1ce 100644 --- a/src/Utils/Logger.ts +++ b/src/Utils/Logger.ts @@ -41,11 +41,6 @@ export class Logger { return; } - const captureContext = { - contexts: { - errorArgs: Object.fromEntries([messageOrArg, ...args].entries()) - } - }; let message: string; if (typeof errorOrMessage === 'string') { @@ -54,15 +49,7 @@ export class Logger { } message = errorOrMessage; - const formattedMessage = format(message, ...args); - - captureMessage(formattedMessage, { - ...captureContext, - level: 'error' - }); } else { - captureException(errorOrMessage, captureContext); - message = messageOrArg ?? errorOrMessage.message; }