aggregation
This commit is contained in:
1 parent
ef5629d8e4
commit
b4f8fa7d72
5 files changed
+62
-1
No files matched your search
@@ -160,6 +160,14 @@ export interface PageSpeedGroupedCheck {
|
||||
totalChecks: number;
|
||||
}
|
||||
|
||||
export interface GroupedGeoCheck {
|
||||
bucketDate: string;
|
||||
continent: string;
|
||||
avgResponseTime: number;
|
||||
totalChecks: number;
|
||||
uptimePercentage: number;
|
||||
}
|
||||
|
||||
export interface LatestCheck {
|
||||
status: boolean;
|
||||
responseTime: number;
|
||||
@@ -236,6 +244,7 @@ export interface UptimeChecksResult {
|
||||
groupedDownChecks: GroupedCheck[];
|
||||
uptimePercentage: number;
|
||||
avgResponseTime: number;
|
||||
groupedGeoChecks?: GroupedGeoCheck[];
|
||||
}
|
||||
|
||||
export interface ChecksSummary {
|
||||
|
||||
@@ -180,7 +180,7 @@ const MonitorSchema = new Schema<MonitorDocument>(
|
||||
},
|
||||
geoCheckInterval: {
|
||||
type: Number,
|
||||
default: 5,
|
||||
default: 300000,
|
||||
},
|
||||
recentChecks: {
|
||||
type: [checkSnapshotSchema],
|
||||
|
||||
@@ -532,12 +532,41 @@ class MongoChecksRepository implements IChecksRepository {
|
||||
{ $sort: { _id: 1 } },
|
||||
{ $project: { bucketDate: "$_id", avgResponseTime: 1, totalChecks: 1, _id: 0 } },
|
||||
],
|
||||
groupedGeoChecks: [
|
||||
{ $match: { geoResults: { $exists: true, $ne: null, $not: { $size: 0 } } } },
|
||||
{ $unwind: "$geoResults" },
|
||||
{
|
||||
$group: {
|
||||
_id: {
|
||||
date: { $dateToString: { format: dateString, date: "$createdAt" } },
|
||||
continent: "$geoResults.continent",
|
||||
},
|
||||
avgResponseTime: { $avg: "$geoResults.timings.total" },
|
||||
totalChecks: { $sum: 1 },
|
||||
upChecks: { $sum: { $cond: [{ $eq: ["$geoResults.status", true] }, 1, 0] } },
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
_id: 0,
|
||||
bucketDate: "$_id.date",
|
||||
continent: "$_id.continent",
|
||||
avgResponseTime: 1,
|
||||
totalChecks: 1,
|
||||
uptimePercentage: {
|
||||
$cond: [{ $eq: ["$totalChecks", 0] }, 0, { $divide: ["$upChecks", "$totalChecks"] }],
|
||||
},
|
||||
},
|
||||
},
|
||||
{ $sort: { bucketDate: 1, continent: 1 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
const uptimePercentage = result?.uptimePercentage?.[0]?.percentage ?? 0;
|
||||
const avgResponseTime = result?.groupedAvgResponseTime?.[0]?.avgResponseTime ?? 0;
|
||||
const groupedGeoChecks = result?.groupedGeoChecks ?? [];
|
||||
|
||||
return {
|
||||
monitorType,
|
||||
@@ -546,6 +575,7 @@ class MongoChecksRepository implements IChecksRepository {
|
||||
groupedDownChecks: result?.groupedDownChecks ?? [],
|
||||
uptimePercentage,
|
||||
avgResponseTime,
|
||||
groupedGeoChecks,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -202,6 +202,14 @@ export interface PageSpeedGroupedCheck {
|
||||
totalChecks: number;
|
||||
}
|
||||
|
||||
export interface GroupedGeoCheck {
|
||||
bucketDate: string;
|
||||
continent: string;
|
||||
avgResponseTime: number;
|
||||
totalChecks: number;
|
||||
uptimePercentage: number;
|
||||
}
|
||||
|
||||
export interface UptimeChecksResult {
|
||||
monitorType: Exclude<MonitorType, "hardware" | "pagespeed">;
|
||||
groupedChecks: GroupedCheck[];
|
||||
@@ -209,6 +217,7 @@ export interface UptimeChecksResult {
|
||||
groupedDownChecks: GroupedCheck[];
|
||||
uptimePercentage: number;
|
||||
avgResponseTime: number;
|
||||
groupedGeoChecks?: GroupedGeoCheck[];
|
||||
}
|
||||
|
||||
export interface ChecksSummary {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import joi, { type CustomHelpers } from "joi";
|
||||
import { type UserRole, UserRoles } from "@/types/user.js";
|
||||
import { GeoCheckLocations } from "@/types/monitor.js";
|
||||
|
||||
//****************************************
|
||||
// Custom Validators
|
||||
@@ -172,6 +173,12 @@ const createMonitorBodyValidation = joi.object({
|
||||
gameId: joi.string().allow(""),
|
||||
selectedDisks: joi.array().items(joi.string()).optional(),
|
||||
group: joi.string().max(50).trim().allow(null, "").optional(),
|
||||
geoCheckEnabled: joi.boolean().optional(),
|
||||
geoCheckLocations: joi
|
||||
.array()
|
||||
.items(joi.string().valid(...GeoCheckLocations))
|
||||
.optional(),
|
||||
geoCheckInterval: joi.number().min(300000).optional(),
|
||||
});
|
||||
|
||||
const createMonitorsBodyValidation = joi.array().items(
|
||||
@@ -203,6 +210,12 @@ const editMonitorBodyValidation = joi
|
||||
gameId: joi.string().allow(""),
|
||||
selectedDisks: joi.array().items(joi.string()).optional(),
|
||||
group: joi.string().max(50).trim().allow(null, "").optional(),
|
||||
geoCheckEnabled: joi.boolean().optional(),
|
||||
geoCheckLocations: joi
|
||||
.array()
|
||||
.items(joi.string().valid(...GeoCheckLocations))
|
||||
.optional(),
|
||||
geoCheckInterval: joi.number().min(5).optional(),
|
||||
})
|
||||
.options({ stripUnknown: true });
|
||||
|
||||
|
||||
Reference in new issue
Block a user