From 2d6d95d72a3fd1144e4f05e68662e8534319fdf7 Mon Sep 17 00:00:00 2001 From: gbuomprisco Date: Tue, 13 Aug 2024 12:56:51 +0200 Subject: [PATCH] Add ready method to monitoring services Implemented a ready method for all monitoring services to standardize initialization readiness checks. Updated initialization logic in SentryMonitoringService to determine environment and invoke appropriate client initialization. --- .../baselime/src/hooks/use-baselime.ts | 3 +++ .../baselime-server-monitoring.service.ts | 5 ++++ .../core/src/console-monitoring.service.ts | 4 +++ .../monitoring/core/src/monitoring.service.ts | 5 ++++ .../src/services/sentry-monitoring.service.ts | 25 +++++++++++++++---- packages/next/src/utils/index.ts | 2 ++ 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/monitoring/baselime/src/hooks/use-baselime.ts b/packages/monitoring/baselime/src/hooks/use-baselime.ts index ecbdc1006..48077a64b 100644 --- a/packages/monitoring/baselime/src/hooks/use-baselime.ts +++ b/packages/monitoring/baselime/src/hooks/use-baselime.ts @@ -22,6 +22,9 @@ export function useBaselime(): MonitoringService { captureEvent(event: string, extra?: Extra) { return sendEvent(event, extra); }, + ready() { + return Promise.resolve(); + } } satisfies MonitoringService; }, [captureException, sendEvent, setUser]); } diff --git a/packages/monitoring/baselime/src/services/baselime-server-monitoring.service.ts b/packages/monitoring/baselime/src/services/baselime-server-monitoring.service.ts index 12addd4e2..c0172d52a 100644 --- a/packages/monitoring/baselime/src/services/baselime-server-monitoring.service.ts +++ b/packages/monitoring/baselime/src/services/baselime-server-monitoring.service.ts @@ -5,6 +5,7 @@ import { MonitoringService } from '@kit/monitoring-core'; const apiKey = z .string({ required_error: 'NEXT_PUBLIC_BASELIME_KEY is required', + description: 'The Baseline API key', }) .parse(process.env.NEXT_PUBLIC_BASELIME_KEY); @@ -99,6 +100,10 @@ export class BaselimeServerMonitoringService implements MonitoringService { identifyUser(info: Info) { this.userId = info.id; } + + ready() { + return Promise.resolve(); + } } function getFormattedError(error: Error) { diff --git a/packages/monitoring/core/src/console-monitoring.service.ts b/packages/monitoring/core/src/console-monitoring.service.ts index c050c299a..aa79817b4 100644 --- a/packages/monitoring/core/src/console-monitoring.service.ts +++ b/packages/monitoring/core/src/console-monitoring.service.ts @@ -14,4 +14,8 @@ export class ConsoleMonitoringService implements MonitoringService { captureEvent(event: string) { console.log(`[Console Monitoring] Captured event: ${event}`); } + + ready() { + return Promise.resolve(); + } } diff --git a/packages/monitoring/core/src/monitoring.service.ts b/packages/monitoring/core/src/monitoring.service.ts index d830945cf..375cd0c91 100644 --- a/packages/monitoring/core/src/monitoring.service.ts +++ b/packages/monitoring/core/src/monitoring.service.ts @@ -29,4 +29,9 @@ export abstract class MonitoringService { * @param info */ abstract identifyUser(info: Info): unknown; + + /** + * Wait for the monitoring service to be ready + */ + abstract ready(): Promise; } diff --git a/packages/monitoring/sentry/src/services/sentry-monitoring.service.ts b/packages/monitoring/sentry/src/services/sentry-monitoring.service.ts index cdb2f49f7..d7a938785 100644 --- a/packages/monitoring/sentry/src/services/sentry-monitoring.service.ts +++ b/packages/monitoring/sentry/src/services/sentry-monitoring.service.ts @@ -8,10 +8,21 @@ import { MonitoringService } from '@kit/monitoring-core'; * ServerSentryMonitoringService is responsible for capturing exceptions and identifying users using the Sentry monitoring service. */ export class SentryMonitoringService implements MonitoringService { + private readonly readyPromise: Promise; + private readyResolver?: (value?: unknown) => void; + constructor() { + this.readyPromise = new Promise( + (resolve) => (this.readyResolver = resolve), + ); + void this.initialize(); } + async ready() { + return this.readyPromise; + } + captureException(error: Error | null) { return Sentry.captureException(error); } @@ -27,17 +38,21 @@ export class SentryMonitoringService implements MonitoringService { Sentry.setUser(user); } - private initialize() { - return this.initializeIfBrowser(); - } - - private async initializeIfBrowser() { + private async initialize() { if (typeof document !== 'undefined') { const { initializeSentryBrowserClient } = await import( '../sentry.client.config' ); initializeSentryBrowserClient(); + } else { + const { initializeSentryServerClient } = await import( + '../sentry.server.config' + ); + + initializeSentryServerClient(); } + + this.readyResolver?.(); } } diff --git a/packages/next/src/utils/index.ts b/packages/next/src/utils/index.ts index 61b457840..bef7b4938 100644 --- a/packages/next/src/utils/index.ts +++ b/packages/next/src/utils/index.ts @@ -18,6 +18,8 @@ export async function captureException(exception: unknown) { const service = await getServerMonitoringService(); + await service.ready(); + const error = exception instanceof Error ? exception : new Error(exception as string);