feat: add per-monitor Globalping toggle

Add a globalpingEnabled boolean to the Monitor model so users can
opt-in to global location checks per monitor during creation/edit.

## Changes
- Add globalpingEnabled field to server types, Mongoose model,
  Joi validation, and repository mappers
- Add globalpingEnabled to client Monitor type, Zod schemas for
  HTTP and ping monitors, and form defaults
- Add "Global monitoring" ConfigBox with Switch toggle to the
  monitor creation/edit form, visible for HTTP and ping types
- Queue helper and monitorService now check globalpingEnabled
  before running Globalping checks or fetching location data
- Add translation keys for the new form section

## Benefits
- Users can selectively enable Globalping on monitors that need it
  rather than running location checks on every HTTP/ping monitor
- Reduces unnecessary API usage and keeps the UI clean for monitors
  that only need local checks
This commit is contained in:
gorkem-bwl committed 2026-02-19 12:11:56 -05:00
1 parent 7f9d2f275e
commit 4ca24c794e
11 files changed
+47 -3

No files matched your search

+4
View File
@@ -164,6 +164,10 @@ const MonitorSchema = new Schema<MonitorDocument>(
type: [String],
default: [],
},
globalpingEnabled: {
type: Boolean,
default: false,
},
group: {
type: String,
trim: true,
@@ -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),
@@ -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<string, LocationCheckData> | 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,
@@ -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) => {
+1
View File
@@ -44,6 +44,7 @@ export interface Monitor {
gameId?: string;
group: string | null;
locations: string[];
globalpingEnabled: boolean;
recentChecks: CheckSnapshot[];
createdAt: string;
updatedAt: string;
+2
View File
@@ -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 });