@ -292,54 +292,13 @@ class Monitor extends BeanModel {
let beatInterval = this . interval ;
// * ? -> ANY STATUS = important [isFirstBeat]
// UP -> PENDING = not important
// * UP -> DOWN = important
// UP -> UP = not important
// PENDING -> PENDING = not important
// * PENDING -> DOWN = important
// PENDING -> UP = not important
// DOWN -> PENDING = this case not exists
// DOWN -> DOWN = not important
// * DOWN -> UP = important
let isImportant = isFirstBeat ||
( previousBeat . status === UP && bean . status === DOWN ) ||
( previousBeat . status === DOWN && bean . status === UP ) ||
( previousBeat . status === PENDING && bean . status === DOWN ) ;
let isImportant = Monitor . isImportantBeat ( isFirstBeat , previousBeat . status , bean . status ) ;
// Mark as important if status changed, ignore pending pings,
// Don't notify if disrupted changes to up
if ( isImportant ) {
bean . important = true ;
// Send only if the first beat is DOWN
if ( ! isFirstBeat || bean . status === DOWN ) {
let notificationList = await R . getAll ( "SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id " , [
this . id ,
] ) ;
let text ;
if ( bean . status === UP ) {
text = "✅ Up" ;
} else {
text = "🔴 Down" ;
}
let msg = ` [ ${ this . name } ] [ ${ text } ] ${ bean . msg } ` ;
for ( let notification of notificationList ) {
try {
await Notification . send ( JSON . parse ( notification . config ) , msg , await this . toJSON ( ) , bean . toJSON ( ) ) ;
} catch ( e ) {
console . error ( "Cannot send notification to " + notification . name ) ;
console . log ( e ) ;
}
}
// Clear Status Page Cache
apicache . clear ( ) ;
}
await Monitor . sendNotification ( isFirstBeat , this , bean ) ;
} else {
bean . important = false ;
}
@ -546,6 +505,53 @@ class Monitor extends BeanModel {
io . to ( userID ) . emit ( "uptime" , monitorID , duration , uptime ) ;
}
static isImportantBeat ( isFirstBeat , previousBeatStatus , currentBeatStatus ) {
// * ? -> ANY STATUS = important [isFirstBeat]
// UP -> PENDING = not important
// * UP -> DOWN = important
// UP -> UP = not important
// PENDING -> PENDING = not important
// * PENDING -> DOWN = important
// PENDING -> UP = not important
// DOWN -> PENDING = this case not exists
// DOWN -> DOWN = not important
// * DOWN -> UP = important
let isImportant = isFirstBeat ||
( previousBeatStatus === UP && currentBeatStatus === DOWN ) ||
( previousBeatStatus === DOWN && currentBeatStatus === UP ) ||
( previousBeatStatus === PENDING && currentBeatStatus === DOWN ) ;
return isImportant ;
}
static async sendNotification ( isFirstBeat , monitor , bean ) {
if ( ! isFirstBeat || bean . status === DOWN ) {
let notificationList = await R . getAll ( "SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id " , [
monitor . id ,
] ) ;
let text ;
if ( bean . status === UP ) {
text = "✅ Up" ;
} else {
text = "🔴 Down" ;
}
let msg = ` [ ${ monitor . name } ] [ ${ text } ] ${ bean . msg } ` ;
for ( let notification of notificationList ) {
try {
await Notification . send ( JSON . parse ( notification . config ) , msg , await monitor . toJSON ( ) , bean . toJSON ( ) ) ;
} catch ( e ) {
console . error ( "Cannot send notification to " + notification . name ) ;
console . log ( e ) ;
}
}
// Clear Status Page Cache
apicache . clear ( ) ;
}
}
}
module . exports = Monitor ;