mirror of https://github.com/statping/statping
95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/hunterlong/statping/types/failures"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func (s *Service) FailuresColumnID() (string, int64) {
|
|
return "service", s.Id
|
|
}
|
|
|
|
func (s *Service) AllFailures() failures.Failurer {
|
|
return failures.AllFailures(s)
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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 {
|
|
last := s.LastFailure()
|
|
if last == nil {
|
|
return ""
|
|
}
|
|
return parseError(last)
|
|
}
|
|
|
|
// 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
|
|
}
|