diff --git a/server/src/domain/checks/check.docker.aggregation.ts b/server/src/domain/checks/check.docker.aggregation.ts new file mode 100644 index 000000000..9edd1dcbb --- /dev/null +++ b/server/src/domain/checks/check.docker.aggregation.ts @@ -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 => + 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 => + CheckModel.aggregate([ + { + $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(); diff --git a/server/src/domain/checks/check.repository.interface.ts b/server/src/domain/checks/check.repository.interface.ts index 1767b2ea1..298981216 100644 --- a/server/src/domain/checks/check.repository.interface.ts +++ b/server/src/domain/checks/check.repository.interface.ts @@ -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; + ): Promise; findSummaryByTeamId(teamId: string, dateRange: DateRange): Promise; findUnevaluatedByMonitorId(monitorId: string, since: number): Promise; getDailyStatusBuckets(monitorIds: string[], days: number, timezone: string): Promise;