aggregate pagespeed

This commit is contained in:
Alex Holliday committed 2026-02-21 20:52:47 +00:00
1 parent 882e91f6a7
commit 910c675a49
4 files changed
+54 -10

No files matched your search

@@ -378,7 +378,7 @@ class MongoChecksRepository implements IChecksRepository {
return this.findHardwareDateRangeChecks(monitorObjectId, startDate, endDate, dateString);
}
if (options?.type === "pagespeed") {
return this.findPageSpeedDateRangeChecks(monitorObjectId, startDate, endDate);
return this.findPageSpeedDateRangeChecks(monitorObjectId, startDate, endDate, dateString);
}
return this.findUptimeDateRangeChecks(options?.type ?? "http", monitorObjectId, startDate, endDate, dateString);
};
@@ -572,16 +572,50 @@ class MongoChecksRepository implements IChecksRepository {
};
};
private findPageSpeedDateRangeChecks = async (monitorObjectId: mongoose.Types.ObjectId, startDate: Date, endDate: Date) => {
private findPageSpeedDateRangeChecks = async (monitorObjectId: mongoose.Types.ObjectId, startDate: Date, endDate: Date, dateString: string) => {
const matchStage = {
"metadata.monitorId": monitorObjectId,
createdAt: { $gte: startDate, $lte: endDate },
};
const checks = await CheckModel.find(matchStage).sort({ createdAt: -1 }).limit(25).lean();
const [result] = await CheckModel.aggregate([
{ $match: matchStage },
{ $sort: { createdAt: 1 } },
{
$facet: {
groupedChecks: [
{
$group: {
_id: {
$dateToString: { format: dateString, date: "$createdAt" },
},
avgPerformance: { $avg: "$performance" },
avgAccessibility: { $avg: "$accessibility" },
avgBestPractices: { $avg: "$bestPractices" },
avgSeo: { $avg: "$seo" },
totalChecks: { $sum: 1 },
},
},
{ $sort: { _id: 1 } },
{
$project: {
bucketDate: "$_id",
performance: "$avgPerformance",
accessibility: "$avgAccessibility",
bestPractices: "$avgBestPractices",
seo: "$avgSeo",
totalChecks: 1,
_id: 0,
},
},
],
},
},
]);
return {
monitorType: "pagespeed" as const,
checks: this.mapDocuments(checks),
groupedChecks: result?.groupedChecks ?? [],
};
};
@@ -308,9 +308,9 @@ export class MonitorService implements IMonitorService {
const monitorStats = await this.monitorStatsRepository.findByMonitorId(monitor.id);
return {
monitor: {
...monitor,
checks: checksData.checks,
monitorData: {
monitor,
groupedChecks: checksData.groupedChecks,
},
monitorStats,
};
+10 -1
View File
@@ -124,7 +124,7 @@ export interface ChecksQueryResult {
export interface PageSpeedChecksResult {
monitorType: "pagespeed";
checks: Check[];
groupedChecks: PageSpeedGroupedCheck[];
}
export interface HardwareChecksResult {
@@ -170,6 +170,15 @@ export interface GroupedCheck {
totalChecks: number;
}
export interface PageSpeedGroupedCheck {
bucketDate: string;
performance: number;
accessibility: number;
bestPractices: number;
seo: number;
totalChecks: number;
}
export interface UptimeChecksResult {
monitorType: Exclude<MonitorType, "hardware" | "pagespeed">;
groupedChecks: GroupedCheck[];
+3 -2
View File
@@ -125,8 +125,9 @@ export interface HardwareDetailsResult {
}
export interface PageSpeedDetailsResult {
monitor: Monitor & {
checks: import("./check.js").Check[];
monitorData: {
monitor: Monitor;
groupedChecks: import("./check.js").PageSpeedGroupedCheck[];
};
monitorStats: import("./monitorStats.js").MonitorStats | null;
}