diff --git a/Common/Server/Services/IncidentService.ts b/Common/Server/Services/IncidentService.ts index eaa4b958ac9..2146de1476d 100644 --- a/Common/Server/Services/IncidentService.ts +++ b/Common/Server/Services/IncidentService.ts @@ -586,7 +586,7 @@ export class Service extends DatabaseService { isRoot: true, }, sort: { - createdAt: SortOrder.Descending, + startsAt: SortOrder.Descending, }, }); diff --git a/Common/Server/Services/MonitorService.ts b/Common/Server/Services/MonitorService.ts index 289aa7828e8..c8092ef9e1c 100644 --- a/Common/Server/Services/MonitorService.ts +++ b/Common/Server/Services/MonitorService.ts @@ -876,7 +876,7 @@ export class Service extends DatabaseService { monitorStatusId: true, }, sort: { - createdAt: SortOrder.Descending, + startsAt: SortOrder.Descending, }, props: { isRoot: true, @@ -889,6 +889,7 @@ export class Service extends DatabaseService { lastMonitorStatusTimeline.monitorStatusId.toString() === monitorStatusId.toString() ) { + // status is same as last status. do not create new status timeline. continue; } diff --git a/Common/Server/Utils/Monitor/MonitorResource.ts b/Common/Server/Utils/Monitor/MonitorResource.ts index 3dd7108a7bf..631207d74ba 100644 --- a/Common/Server/Utils/Monitor/MonitorResource.ts +++ b/Common/Server/Utils/Monitor/MonitorResource.ts @@ -421,27 +421,57 @@ export default class MonitorResourceUtil { dataToProcess: dataToProcess, }); - // if no criteria is met then update monitor to default state. - const monitorStatusTimeline: MonitorStatusTimeline = - new MonitorStatusTimeline(); - monitorStatusTimeline.monitorId = monitor.id!; - monitorStatusTimeline.monitorStatusId = - monitorSteps.data.defaultMonitorStatusId!; - monitorStatusTimeline.projectId = monitor.projectId!; - monitorStatusTimeline.statusChangeLog = JSON.parse( - JSON.stringify(dataToProcess), - ); - monitorStatusTimeline.rootCause = - "No monitoring criteria met. Change to default status. "; - await MonitorStatusTimelineService.create({ - data: monitorStatusTimeline, - props: { - isRoot: true, - }, - }); - logger.debug( - `${dataToProcess.monitorId.toString()} - Monitor status updated to default.`, - ); + // get last monitor status timeline. + const lastMonitorStatusTimeline: MonitorStatusTimeline | null = + await MonitorStatusTimelineService.findOneBy({ + query: { + monitorId: monitor.id!, + projectId: monitor.projectId!, + }, + select: { + _id: true, + monitorStatusId: true, + }, + sort: { + startsAt: SortOrder.Descending, + }, + props: { + isRoot: true, + }, + }); + + if ( + lastMonitorStatusTimeline && + lastMonitorStatusTimeline.monitorStatusId && + lastMonitorStatusTimeline.monitorStatusId.toString() === + monitorSteps.data.defaultMonitorStatusId.toString() + ) { + // status is same as last status. do not create new status timeline. + // do nothing! status is same as last status. + } else { + // if no criteria is met then update monitor to default state. + const monitorStatusTimeline: MonitorStatusTimeline = + new MonitorStatusTimeline(); + monitorStatusTimeline.monitorId = monitor.id!; + monitorStatusTimeline.monitorStatusId = + monitorSteps.data.defaultMonitorStatusId!; + monitorStatusTimeline.projectId = monitor.projectId!; + monitorStatusTimeline.statusChangeLog = JSON.parse( + JSON.stringify(dataToProcess), + ); + monitorStatusTimeline.rootCause = + "No monitoring criteria met. Change to default status. "; + + await MonitorStatusTimelineService.create({ + data: monitorStatusTimeline, + props: { + isRoot: true, + }, + }); + logger.debug( + `${dataToProcess.monitorId.toString()} - Monitor status updated to default.`, + ); + } } return response; @@ -737,6 +767,37 @@ export default class MonitorResourceUtil { //change monitor status. + // get last status of this monitor. + + // get last monitor status timeline. + const lastMonitorStatusTimeline: MonitorStatusTimeline | null = + await MonitorStatusTimelineService.findOneBy({ + query: { + monitorId: input.monitor.id!, + projectId: input.monitor.projectId!, + }, + select: { + _id: true, + monitorStatusId: true, + }, + sort: { + startsAt: SortOrder.Descending, + }, + props: { + isRoot: true, + }, + }); + + if ( + lastMonitorStatusTimeline && + lastMonitorStatusTimeline.monitorStatusId && + lastMonitorStatusTimeline.monitorStatusId.toString() === + monitorStatusId.toString() + ) { + // status is same as last status. do not create new status timeline. + return; + } + const monitorStatusTimeline: MonitorStatusTimeline = new MonitorStatusTimeline(); monitorStatusTimeline.monitorId = input.monitor.id!;