mirror of https://github.com/statping/statping
61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
![]() |
package checkins
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/hunterlong/statping/types/failures"
|
||
|
"github.com/hunterlong/statping/utils"
|
||
|
"github.com/prometheus/common/log"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// RecheckCheckinFailure will check if a Service Checkin has been reported yet
|
||
|
func (c *Checkin) RecheckCheckinFailure(guard chan struct{}) {
|
||
|
between := utils.Now().Sub(utils.Now()).Seconds()
|
||
|
if between > float64(c.Interval) {
|
||
|
fmt.Println("rechecking every 15 seconds!")
|
||
|
time.Sleep(15 * time.Second)
|
||
|
guard <- struct{}{}
|
||
|
c.RecheckCheckinFailure(guard)
|
||
|
} else {
|
||
|
fmt.Println("i recovered!!")
|
||
|
}
|
||
|
<-guard
|
||
|
}
|
||
|
|
||
|
// Routine for checking if the last Checkin was within its interval
|
||
|
func (c *Checkin) CheckinRoutine() {
|
||
|
lastHit := c.LastHit()
|
||
|
if lastHit == nil {
|
||
|
return
|
||
|
}
|
||
|
reCheck := c.Period()
|
||
|
CheckinLoop:
|
||
|
for {
|
||
|
select {
|
||
|
case <-c.Running:
|
||
|
log.Infoln(fmt.Sprintf("Stopping checkin routine: %v", c.Name))
|
||
|
c.Failing = false
|
||
|
break CheckinLoop
|
||
|
case <-time.After(reCheck):
|
||
|
log.Infoln(fmt.Sprintf("Checkin %v is expected at %v, checking every %v", c.Name, utils.FormatDuration(c.Expected()), utils.FormatDuration(c.Period())))
|
||
|
if c.Expected() <= 0 {
|
||
|
issue := fmt.Sprintf("Checkin %v is failing, no request since %v", c.Name, lastHit.CreatedAt)
|
||
|
log.Errorln(issue)
|
||
|
|
||
|
fail := &failures.Failure{
|
||
|
Issue: issue,
|
||
|
Method: "checkin",
|
||
|
Service: c.ServiceId,
|
||
|
Checkin: c.Id,
|
||
|
PingTime: c.Expected().Seconds(),
|
||
|
CreatedAt: time.Time{},
|
||
|
}
|
||
|
|
||
|
c.CreateFailure(fail)
|
||
|
}
|
||
|
reCheck = c.Period()
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
}
|