Skip to content

Commit

Permalink
Refactor sorting criteria in IncidentService and MonitorService to us…
Browse files Browse the repository at this point in the history
…e startsAt instead of createdAt; enhance monitor status timeline logic to prevent duplicate entries
  • Loading branch information
simlarsen committed Sep 23, 2024
1 parent 2c2bc3a commit 063b9b3
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 23 deletions.
2 changes: 1 addition & 1 deletion Common/Server/Services/IncidentService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ export class Service extends DatabaseService<Model> {
isRoot: true,
},
sort: {
createdAt: SortOrder.Descending,
startsAt: SortOrder.Descending,
},
});

Expand Down
3 changes: 2 additions & 1 deletion Common/Server/Services/MonitorService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ export class Service extends DatabaseService<Model> {
monitorStatusId: true,
},
sort: {
createdAt: SortOrder.Descending,
startsAt: SortOrder.Descending,
},
props: {
isRoot: true,
Expand All @@ -889,6 +889,7 @@ export class Service extends DatabaseService<Model> {
lastMonitorStatusTimeline.monitorStatusId.toString() ===
monitorStatusId.toString()
) {
// status is same as last status. do not create new status timeline.
continue;
}

Expand Down
103 changes: 82 additions & 21 deletions Common/Server/Utils/Monitor/MonitorResource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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!;
Expand Down

0 comments on commit 063b9b3

Please sign in to comment.