add docker check aggregation

This commit is contained in:
Alex Holliday committed 2026-08-28 13:30:32 -07:00
1 parent 03174d98dd
commit 1a1dc7d807
2 files changed
+56 -1

No files matched your search

@@ -0,0 +1,54 @@
import CheckModel from "@/domain/checks/check.model.js";
import { DockerStatsBucket } from "@/domain/checks/check.type.js";
import mongoose from "mongoose";
type DateRange = { start: Date; end: Date };
export const getDockerTotalChecks = async (monitorId: string, dates: DateRange): Promise<number> =>
CheckModel.countDocuments({
"metadata.monitorId": new mongoose.Types.ObjectId(monitorId),
"metadata.type": "docker",
createdAt: { $gte: dates.start, $lte: dates.end },
});
export const getDockerUpChecks = async (monitorId: string, dates: DateRange): Promise<{ totalChecks: number }> => {
const count = await CheckModel.countDocuments({
"metadata.monitorId": new mongoose.Types.ObjectId(monitorId),
"metadata.type": "docker",
createdAt: { $gte: dates.start, $lte: dates.end },
status: true,
});
return { totalChecks: count };
};
export const getDockerStats = async (monitorId: string, dates: DateRange, dateString: string): Promise<DockerStatsBucket[]> =>
CheckModel.aggregate<DockerStatsBucket>([
{
$match: {
"metadata.monitorId": new mongoose.Types.ObjectId(monitorId),
"metadata.type": "docker",
createdAt: { $gte: dates.start, $lte: dates.end },
},
},
{
$group: {
_id: { $dateToString: { format: dateString, date: "$createdAt" } },
avgResponseTime: { $avg: "$responseTime" },
upCount: { $sum: { $cond: [{ $eq: ["$status", true] }, 1, 0] } },
totalCount: { $sum: 1 },
avgRunning: { $avg: "$containerSummary.running" },
avgTotal: { $avg: "$containerSummary.total" },
avgUnhealthy: { $avg: "$containerSummary.unhealthy" },
},
},
{ $sort: { _id: 1 } },
]);
export const getDockerLatestCheck = async (monitorId: string) =>
CheckModel.findOne({
"metadata.monitorId": new mongoose.Types.ObjectId(monitorId),
"metadata.type": "docker",
})
.sort({ createdAt: -1 })
.select("containers containerSummary createdAt")
.lean();
@@ -3,6 +3,7 @@ import type {
ChecksQueryResult,
ChecksSummary,
DailyCheckBucket,
DockerChecksResult,
HardwareChecksResult,
PageSpeedChecksResult,
UptimeChecksResult,
@@ -38,7 +39,7 @@ export interface IChecksRepository {
monitorId: string,
dateRange: DateRange,
options?: { type?: MonitorType }
): Promise<UptimeChecksResult | HardwareChecksResult | PageSpeedChecksResult>;
): Promise<UptimeChecksResult | HardwareChecksResult | PageSpeedChecksResult | DockerChecksResult>;
findSummaryByTeamId(teamId: string, dateRange: DateRange): Promise<ChecksSummary>;
findUnevaluatedByMonitorId(monitorId: string, since: number): Promise<Check[]>;
getDailyStatusBuckets(monitorIds: string[], days: number, timezone: string): Promise<DailyCheckBucket[]>;