mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-23 14:54:05 +00:00
Compare commits
6 commits
55cd7b82e4
...
dc76b1d4e3
Author | SHA1 | Date | |
---|---|---|---|
|
dc76b1d4e3 | ||
|
4228dd0a29 | ||
|
17135240e9 | ||
|
a6a2838c75 | ||
|
48abd79005 | ||
|
3a89624d32 |
4 changed files with 59 additions and 38 deletions
|
@ -380,39 +380,6 @@ class Monitor extends BeanModel {
|
||||||
if (await Monitor.isUnderMaintenance(this.id)) {
|
if (await Monitor.isUnderMaintenance(this.id)) {
|
||||||
bean.msg = "Monitor under maintenance";
|
bean.msg = "Monitor under maintenance";
|
||||||
bean.status = MAINTENANCE;
|
bean.status = MAINTENANCE;
|
||||||
} else if (this.type === "group") {
|
|
||||||
const children = await Monitor.getChildren(this.id);
|
|
||||||
|
|
||||||
if (children.length > 0) {
|
|
||||||
bean.status = UP;
|
|
||||||
bean.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) {
|
|
||||||
bean.status = PENDING;
|
|
||||||
} else if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
|
||||||
bean.status = lastBeat.status;
|
|
||||||
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
|
||||||
bean.status = lastBeat.status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bean.status !== UP) {
|
|
||||||
bean.msg = "Child inaccessible";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Set status pending if group is empty
|
|
||||||
bean.status = PENDING;
|
|
||||||
bean.msg = "Group empty";
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") {
|
} else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") {
|
||||||
// Do not do any queries/high loading things before the "bean.ping"
|
// Do not do any queries/high loading things before the "bean.ping"
|
||||||
let startTime = dayjs().valueOf();
|
let startTime = dayjs().valueOf();
|
||||||
|
@ -1625,7 +1592,7 @@ class Monitor extends BeanModel {
|
||||||
/**
|
/**
|
||||||
* Gets all Children of the monitor
|
* Gets all Children of the monitor
|
||||||
* @param {number} monitorID ID of monitor to get
|
* @param {number} monitorID ID of monitor to get
|
||||||
* @returns {Promise<LooseObject<any>>} Children
|
* @returns {Promise<LooseObject<any>[]>} Children
|
||||||
*/
|
*/
|
||||||
static async getChildren(monitorID) {
|
static async getChildren(monitorID) {
|
||||||
return await R.getAll(`
|
return await R.getAll(`
|
||||||
|
|
49
server/monitor-types/group.js
Normal file
49
server/monitor-types/group.js
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
const { UP, PENDING, DOWN } = require("../../src/util");
|
||||||
|
const { MonitorType } = require("./monitor-type");
|
||||||
|
const Monitor = require("../model/monitor");
|
||||||
|
|
||||||
|
class GroupMonitorType extends MonitorType {
|
||||||
|
name = "group";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
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 {
|
||||||
|
// Set status pending if group is empty
|
||||||
|
heartbeat.status = PENDING;
|
||||||
|
heartbeat.msg = "Group empty";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
GroupMonitorType,
|
||||||
|
};
|
||||||
|
|
|
@ -113,6 +113,7 @@ class UptimeKumaServer {
|
||||||
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
||||||
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
|
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
|
||||||
UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType();
|
UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType();
|
||||||
|
UptimeKumaServer.monitorTypeList["group"] = new GroupMonitorType();
|
||||||
UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType();
|
UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType();
|
||||||
UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType();
|
UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType();
|
||||||
UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType();
|
UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType();
|
||||||
|
@ -551,6 +552,7 @@ const { RealBrowserMonitorType } = require("./monitor-types/real-browser-monitor
|
||||||
const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
||||||
const { DnsMonitorType } = require("./monitor-types/dns");
|
const { DnsMonitorType } = require("./monitor-types/dns");
|
||||||
const { MqttMonitorType } = require("./monitor-types/mqtt");
|
const { MqttMonitorType } = require("./monitor-types/mqtt");
|
||||||
|
const { GroupMonitorType } = require("./monitor-types/group");
|
||||||
const { SNMPMonitorType } = require("./monitor-types/snmp");
|
const { SNMPMonitorType } = require("./monitor-types/snmp");
|
||||||
const { MongodbMonitorType } = require("./monitor-types/mongodb");
|
const { MongodbMonitorType } = require("./monitor-types/mongodb");
|
||||||
const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq");
|
const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq");
|
||||||
|
|
|
@ -1443,11 +1443,14 @@ message HealthCheckResponse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.monitor.type === "snmp") {
|
// Set a default timeout if the monitor type has changed or if it's a new monitor
|
||||||
|
if (oldType || this.isAdd) {
|
||||||
|
if (this.monitor.type === "snmp") {
|
||||||
// snmp is not expected to be executed via the internet => we can choose a lower default timeout
|
// snmp is not expected to be executed via the internet => we can choose a lower default timeout
|
||||||
this.monitor.timeout = 5;
|
this.monitor.timeout = 5;
|
||||||
} else {
|
} else {
|
||||||
this.monitor.timeout = 48;
|
this.monitor.timeout = 48;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set default SNMP version
|
// Set default SNMP version
|
||||||
|
|
Loading…
Reference in a new issue