diff --git a/client/src/Hooks/useMonitorForm.ts b/client/src/Hooks/useMonitorForm.ts index 633fcb5c9..5726fd1fe 100644 --- a/client/src/Hooks/useMonitorForm.ts +++ b/client/src/Hooks/useMonitorForm.ts @@ -37,6 +37,7 @@ export const useMonitorForm = ({ matchMethod: data?.matchMethod || "", expectedValue: data?.expectedValue || "", jsonPath: data?.jsonPath || "", + globalpingEnabled: data?.globalpingEnabled || false, }; break; case "ping": @@ -44,6 +45,7 @@ export const useMonitorForm = ({ ...base, type: "ping", url: data?.url || "", + globalpingEnabled: data?.globalpingEnabled || false, }; break; case "port": diff --git a/client/src/Pages/CreateMonitor/index.tsx b/client/src/Pages/CreateMonitor/index.tsx index aa7de0ffd..819f3a1b1 100644 --- a/client/src/Pages/CreateMonitor/index.tsx +++ b/client/src/Pages/CreateMonitor/index.tsx @@ -488,6 +488,27 @@ const CreateMonitorPage = () => { } /> + {/* Global monitoring - only for http and ping types */} + {(watchedType === "http" || watchedType === "ping") && ( + ( + field.onChange(e.target.checked)} + /> + )} + /> + } + /> + )} + {/* Alert Thresholds - only for hardware type */} {generalSettingsConfig.showSecret && ( ( type: [String], default: [], }, + globalpingEnabled: { + type: Boolean, + default: false, + }, group: { type: String, trim: true, diff --git a/server/src/repositories/monitors/MongoMonitorsRepository.ts b/server/src/repositories/monitors/MongoMonitorsRepository.ts index 7c3c1ed64..5ecd1e660 100644 --- a/server/src/repositories/monitors/MongoMonitorsRepository.ts +++ b/server/src/repositories/monitors/MongoMonitorsRepository.ts @@ -344,6 +344,7 @@ class MongoMonitorsRepository implements IMonitorsRepository { gameId: doc.gameId ?? undefined, group: doc.group ?? null, locations: doc.locations ?? [], + globalpingEnabled: doc.globalpingEnabled ?? false, recentChecks: (doc.recentChecks ?? []).map((check: any) => this.toCheckSnapshot(check)), createdAt: toDateString(doc.createdAt), updatedAt: toDateString(doc.updatedAt), @@ -400,6 +401,7 @@ class MongoMonitorsRepository implements IMonitorsRepository { gameId: doc.gameId ?? undefined, group: doc.group ?? null, locations: doc.locations ?? [], + globalpingEnabled: doc.globalpingEnabled ?? false, recentChecks: (doc.recentChecks ?? []).map((check: any) => this.toCheckSnapshot(check)), createdAt: toDateString(doc.createdAt), updatedAt: toDateString(doc.updatedAt), diff --git a/server/src/service/business/monitorService.ts b/server/src/service/business/monitorService.ts index e1b9bc9cd..4db410303 100644 --- a/server/src/service/business/monitorService.ts +++ b/server/src/service/business/monitorService.ts @@ -223,9 +223,9 @@ export class MonitorService implements IMonitorService { throw new AppError({ message: `${monitor.type} monitors are not supported for uptime details`, status: 400 }); } - // Fetch location checks if this is an HTTP or ping monitor + // Fetch location checks if Globalping is enabled for this monitor let locationChecks: Record | undefined; - if (monitor.type === "http" || monitor.type === "ping") { + if (monitor.globalpingEnabled && (monitor.type === "http" || monitor.type === "ping")) { const locData = await this.checksRepository.findLocationChecksByMonitorId( monitor.id, start, diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts index f9bf9ad64..fd0afc658 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts @@ -128,7 +128,7 @@ class SuperSimpleQueueHelper { } // Step 2b. Run Globalping checks (fire-and-forget, doesn't affect local check pipeline) - if (monitor.type === "http" || monitor.type === "ping") { + if (monitor.globalpingEnabled && (monitor.type === "http" || monitor.type === "ping")) { this.globalpingService .runChecks(monitor) .then((locationStatuses) => { diff --git a/server/src/types/monitor.ts b/server/src/types/monitor.ts index 2192c72ed..c055f4bef 100644 --- a/server/src/types/monitor.ts +++ b/server/src/types/monitor.ts @@ -44,6 +44,7 @@ export interface Monitor { gameId?: string; group: string | null; locations: string[]; + globalpingEnabled: boolean; recentChecks: CheckSnapshot[]; createdAt: string; updatedAt: string; diff --git a/server/src/validation/joi.ts b/server/src/validation/joi.ts index c4ba6ef2b..ac163a348 100755 --- a/server/src/validation/joi.ts +++ b/server/src/validation/joi.ts @@ -173,6 +173,7 @@ const createMonitorBodyValidation = joi.object({ selectedDisks: joi.array().items(joi.string()).optional(), group: joi.string().max(50).trim().allow(null, "").optional(), locations: joi.array().items(joi.string()).max(5).optional(), + globalpingEnabled: joi.boolean().optional(), }); const createMonitorsBodyValidation = joi.array().items( @@ -205,6 +206,7 @@ const editMonitorBodyValidation = joi selectedDisks: joi.array().items(joi.string()).optional(), group: joi.string().max(50).trim().allow(null, "").optional(), locations: joi.array().items(joi.string()).max(5).optional(), + globalpingEnabled: joi.boolean().optional(), }) .options({ stripUnknown: true });