|
|
@ -141,6 +141,7 @@ class Monitor extends BeanModel {
|
|
|
|
// 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();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] Prepare Options for axios`);
|
|
|
|
const options = {
|
|
|
|
const options = {
|
|
|
|
url: this.url,
|
|
|
|
url: this.url,
|
|
|
|
method: (this.method || "get").toLowerCase(),
|
|
|
|
method: (this.method || "get").toLowerCase(),
|
|
|
@ -160,6 +161,8 @@ class Monitor extends BeanModel {
|
|
|
|
return checkStatusCode(status, this.getAcceptedStatuscodes());
|
|
|
|
return checkStatusCode(status, this.getAcceptedStatuscodes());
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] Axios Request`);
|
|
|
|
let res = await axios.request(options);
|
|
|
|
let res = await axios.request(options);
|
|
|
|
bean.msg = `${res.status} - ${res.statusText}`;
|
|
|
|
bean.msg = `${res.status} - ${res.statusText}`;
|
|
|
|
bean.ping = dayjs().valueOf() - startTime;
|
|
|
|
bean.ping = dayjs().valueOf() - startTime;
|
|
|
@ -167,12 +170,13 @@ class Monitor extends BeanModel {
|
|
|
|
// Check certificate if https is used
|
|
|
|
// Check certificate if https is used
|
|
|
|
let certInfoStartTime = dayjs().valueOf();
|
|
|
|
let certInfoStartTime = dayjs().valueOf();
|
|
|
|
if (this.getUrl()?.protocol === "https:") {
|
|
|
|
if (this.getUrl()?.protocol === "https:") {
|
|
|
|
|
|
|
|
debug(`[${this.name}] Check cert`);
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
let tlsInfoObject = checkCertificate(res);
|
|
|
|
let tlsInfoObject = checkCertificate(res);
|
|
|
|
tlsInfo = await this.updateTlsInfo(tlsInfoObject);
|
|
|
|
tlsInfo = await this.updateTlsInfo(tlsInfoObject);
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.getIgnoreTls()) {
|
|
|
|
if (!this.getIgnoreTls()) {
|
|
|
|
debug("call sendCertNotification");
|
|
|
|
debug(`[${this.name}] call sendCertNotification`);
|
|
|
|
await this.sendCertNotification(tlsInfoObject);
|
|
|
|
await this.sendCertNotification(tlsInfoObject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -351,15 +355,19 @@ class Monitor extends BeanModel {
|
|
|
|
|
|
|
|
|
|
|
|
let beatInterval = this.interval;
|
|
|
|
let beatInterval = this.interval;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] Check isImportant`);
|
|
|
|
let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status);
|
|
|
|
let isImportant = Monitor.isImportantBeat(isFirstBeat, previousBeat?.status, bean.status);
|
|
|
|
|
|
|
|
|
|
|
|
// Mark as important if status changed, ignore pending pings,
|
|
|
|
// Mark as important if status changed, ignore pending pings,
|
|
|
|
// Don't notify if disrupted changes to up
|
|
|
|
// Don't notify if disrupted changes to up
|
|
|
|
if (isImportant) {
|
|
|
|
if (isImportant) {
|
|
|
|
bean.important = true;
|
|
|
|
bean.important = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] sendNotification`);
|
|
|
|
await Monitor.sendNotification(isFirstBeat, this, bean);
|
|
|
|
await Monitor.sendNotification(isFirstBeat, this, bean);
|
|
|
|
|
|
|
|
|
|
|
|
// Clear Status Page Cache
|
|
|
|
// Clear Status Page Cache
|
|
|
|
|
|
|
|
debug(`[${this.name}] Check isImportant`);
|
|
|
|
apicache.clear();
|
|
|
|
apicache.clear();
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -377,10 +385,14 @@ class Monitor extends BeanModel {
|
|
|
|
console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
|
|
|
|
console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] Send to socket`);
|
|
|
|
io.to(this.user_id).emit("heartbeat", bean.toJSON());
|
|
|
|
io.to(this.user_id).emit("heartbeat", bean.toJSON());
|
|
|
|
Monitor.sendStats(io, this.id, this.user_id);
|
|
|
|
Monitor.sendStats(io, this.id, this.user_id);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] Store`);
|
|
|
|
await R.store(bean);
|
|
|
|
await R.store(bean);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] prometheus.update`);
|
|
|
|
prometheus.update(bean, tlsInfo);
|
|
|
|
prometheus.update(bean, tlsInfo);
|
|
|
|
|
|
|
|
|
|
|
|
previousBeat = bean;
|
|
|
|
previousBeat = bean;
|
|
|
@ -394,7 +406,10 @@ class Monitor extends BeanModel {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debug(`[${this.name}] SetTimeout for next check.`);
|
|
|
|
this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000);
|
|
|
|
this.heartbeatInterval = setTimeout(safeBeat, beatInterval * 1000);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log(`[${this.name}] isStop = true, no next check.`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|