Fix Group monitors to send notification after reaching maximum retires count (#6286)

Co-authored-by: Frank Elsinga <frank@elsinga.de>
This commit is contained in:
MayMeow 2025-11-09 17:57:20 +01:00 committed by GitHub
parent 36ac5dd56d
commit 81544c8a39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -11,35 +11,67 @@ class GroupMonitorType extends MonitorType {
async check(monitor, heartbeat, _server) {
const children = await Monitor.getChildren(monitor.id);
if (children.length > 0) {
heartbeat.status = UP;
heartbeat.msg = "All children up and running";
for (const child of children) {
if (!child.active) {
// Ignore inactive childs
continue;
}
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
// Only change state if the monitor is in worse conditions then the ones before
// lastBeat.status could be null
if (!lastBeat) {
heartbeat.status = PENDING;
} else if (heartbeat.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
heartbeat.status = lastBeat.status;
} else if (heartbeat.status === PENDING && lastBeat.status === DOWN) {
heartbeat.status = lastBeat.status;
}
}
if (heartbeat.status !== UP) {
heartbeat.msg = "Child inaccessible";
}
} else {
if (children.length === 0) {
// Set status pending if group is empty
heartbeat.status = PENDING;
heartbeat.msg = "Group empty";
return;
}
let worstStatus = UP;
const downChildren = [];
const pendingChildren = [];
for (const child of children) {
if (!child.active) {
// Ignore inactive (=paused) children
continue;
}
const label = child.name || `#${child.id}`;
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
if (!lastBeat) {
if (worstStatus === UP) {
worstStatus = PENDING;
}
pendingChildren.push(label);
continue;
}
if (lastBeat.status === DOWN) {
worstStatus = DOWN;
downChildren.push(label);
} else if (lastBeat.status === PENDING) {
if (worstStatus !== DOWN) {
worstStatus = PENDING;
}
pendingChildren.push(label);
}
}
if (worstStatus === UP) {
heartbeat.status = UP;
heartbeat.msg = "All children up and running";
return;
}
if (worstStatus === PENDING) {
heartbeat.status = PENDING;
heartbeat.msg = `Pending child monitors: ${pendingChildren.join(", ")}`;
return;
}
heartbeat.status = DOWN;
let message = `Child monitors down: ${downChildren.join(", ")}`;
if (pendingChildren.length > 0) {
message += `; pending: ${pendingChildren.join(", ")}`;
}
// Throw to leverage the generic retry handling and notification flow
throw new Error(message);
}
}