statping/types/services/failures.go

95 lines
2.4 KiB
Go
Raw Normal View History

2020-03-04 10:29:00 +00:00
package services
import (
"fmt"
2020-03-09 18:17:55 +00:00
"github.com/statping/statping/types/failures"
2020-03-04 10:29:00 +00:00
"strings"
"time"
)
func (s *Service) FailuresColumnID() (string, int64) {
return "service", s.Id
}
func (s *Service) AllFailures() failures.Failurer {
return failures.AllFailures(s)
}
2020-03-06 09:33:46 +00:00
func (s *Service) LastFailure() *failures.Failure {
var fail failures.Failure
failures.DB().Where("service = ?", s.Id).Order("id desc").Limit(1).Find(&fail)
return &fail
2020-03-04 10:29:00 +00:00
}
func (s *Service) FailuresCount() int {
var amount int
failures.DB().Where("service = ?", s.Id).Count(&amount)
return amount
}
func (s *Service) FailuresSince(t time.Time) []*failures.Failure {
var fails []*failures.Failure
failures.DB().Where("service = ?", s.Id).Find(&fails)
return fails
}
func (s *Service) DowntimeText() string {
2020-03-06 09:33:46 +00:00
last := s.LastFailure()
if last == nil {
2020-03-04 10:29:00 +00:00
return ""
}
2020-03-06 09:33:46 +00:00
return parseError(last)
2020-03-04 10:29:00 +00:00
}
// ParseError returns a human readable error for a Failure
func parseError(f *failures.Failure) string {
if f.Method == "checkin" {
return fmt.Sprintf("Checkin is Offline")
}
err := strings.Contains(f.Issue, "connection reset by peer")
if err {
return fmt.Sprintf("Connection Reset")
}
err = strings.Contains(f.Issue, "operation timed out")
if err {
return fmt.Sprintf("HTTP Request Timed Out")
}
err = strings.Contains(f.Issue, "x509: certificate is valid")
if err {
return fmt.Sprintf("SSL Certificate invalid")
}
err = strings.Contains(f.Issue, "Client.Timeout exceeded while awaiting headers")
if err {
return fmt.Sprintf("Connection Timed Out")
}
err = strings.Contains(f.Issue, "no such host")
if err {
return fmt.Sprintf("Domain is offline or not found")
}
err = strings.Contains(f.Issue, "HTTP Status Code")
if err {
return fmt.Sprintf("Incorrect HTTP Status Code")
}
err = strings.Contains(f.Issue, "connection refused")
if err {
return fmt.Sprintf("Connection Failed")
}
err = strings.Contains(f.Issue, "can't assign requested address")
if err {
return fmt.Sprintf("Unable to Request Address")
}
err = strings.Contains(f.Issue, "no route to host")
if err {
return fmt.Sprintf("Domain is offline or not found")
}
err = strings.Contains(f.Issue, "i/o timeout")
if err {
return fmt.Sprintf("Connection Timed Out")
}
err = strings.Contains(f.Issue, "Client.Timeout exceeded while reading body")
if err {
return fmt.Sprintf("Timed Out on Response Body")
}
return f.Issue
}