diff --git a/server/src/domain/checks/check.repository.interface.ts b/server/src/domain/checks/check.repository.interface.ts index 46c2a12c6..95c0ade80 100644 --- a/server/src/domain/checks/check.repository.interface.ts +++ b/server/src/domain/checks/check.repository.interface.ts @@ -42,6 +42,7 @@ export interface IChecksRepository { options?: { type?: MonitorType } ): Promise; findSummaryByTeamId(teamId: string, dateRange: string): Promise; + findUnevaluatedByMonitorId(monitorId: string, since: number): Promise; // update //delete deleteByMonitorId(monitorId: string): Promise; diff --git a/server/src/domain/checks/check.repository.mongo.ts b/server/src/domain/checks/check.repository.mongo.ts index 35d3440c8..4f9ad6f4c 100644 --- a/server/src/domain/checks/check.repository.mongo.ts +++ b/server/src/domain/checks/check.repository.mongo.ts @@ -386,6 +386,16 @@ class MongoChecksRepository implements IChecksRepository { }; }; + findUnevaluatedByMonitorId = async (monitorId: string, since: number) => { + const docs = await CheckModel.find({ + "metadata.monitorId": new mongoose.Types.ObjectId(monitorId), + createdAt: { $gt: new Date(since) }, + }) + .sort({ createdAt: 1 }) + .lean(); + return docs.map(this.toEntity); + }; + deleteByMonitorId = async (monitorId: string): Promise => { const result = await CheckModel.deleteMany({ "metadata.monitorId": new mongoose.Types.ObjectId(monitorId) }); return result.deletedCount; diff --git a/server/src/domain/checks/check.service.ts b/server/src/domain/checks/check.service.ts index 58990eaaf..e7fabe5be 100644 --- a/server/src/domain/checks/check.service.ts +++ b/server/src/domain/checks/check.service.ts @@ -11,7 +11,8 @@ const SERVICE_NAME = "checkService"; export interface ICheckService { createChecks(checks: Check[]): Promise; - buildCheck(statusResponse: MonitorStatusResponse): Check | undefined; + toCheck(statusResponse: MonitorStatusResponse): Check | undefined; + toStatusResponse(check: Check): MonitorStatusResponse; getChecksByMonitor(params: { monitorId: string; teamId: string; @@ -56,7 +57,7 @@ export class CheckService implements ICheckService { return this.checksRepository.createChecks(checks); }; - buildCheck = (statusResponse: MonitorStatusResponse): Check | undefined => { + toCheck = (statusResponse: MonitorStatusResponse): Check | undefined => { const { monitorId, teamId, type, status, responseTime, code, message, payload, timings } = statusResponse; const now = new Date().toISOString(); @@ -82,7 +83,7 @@ export class CheckService implements ICheckService { this.logger.warn({ message: "Failed to build check", service: SERVICE_NAME, - method: "buildCheck", + method: "toCheck", }); return undefined; } @@ -131,6 +132,24 @@ export class CheckService implements ICheckService { return check; }; + toStatusResponse = (check: Check) => { + const statusResponse: MonitorStatusResponse = { + monitorId: check.metadata.monitorId, + teamId: check.metadata.teamId, + type: check.metadata.type, + status: check.status, + code: check.statusCode, + message: check.message, + responseTime: check.responseTime, + // re-nest hardware metrics so updateMonitorStatus / extractThresholdBreaches see payload.data + payload: + check.metadata.type === "hardware" + ? ({ data: { cpu: check.cpu, memory: check.memory, disk: check.disk, host: check.host, net: check.net } } as HardwareStatusPayload) + : undefined, + }; + return statusResponse; + }; + getChecksByMonitor = async ({ monitorId, teamId,