From d57da0a1dd9b56c89ade7c50e476b69871c79b63 Mon Sep 17 00:00:00 2001 From: TwinProduction Date: Fri, 6 Sep 2019 21:59:50 -0400 Subject: [PATCH] Add request handlers and move monitoring to watchdog package --- core/types.go | 24 +++++++++++++++++------- main.go | 43 +++++++++++++++++++++++++++++++++++-------- watchdog/watchdog.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 15 deletions(-) diff --git a/core/types.go b/core/types.go index c92addd9..6707d5ac 100644 --- a/core/types.go +++ b/core/types.go @@ -10,13 +10,23 @@ import ( "time" ) +type HealthStatus struct { + Status string `json:"status"` + Message string `json:"message,omitempty"` +} + +type ServerMessage struct { + Error bool `json:"error"` + Message string `json:"message"` +} + type Result struct { - HttpStatus int - Hostname string - Ip string - Duration time.Duration - Errors []error - ConditionResult []*ConditionResult + HttpStatus int `json:"status"` + Hostname string `json:"hostname"` + Ip string `json:"ip"` + Duration string `json:"duration"` + Errors []error `json:"errors"` + ConditionResult []*ConditionResult `json:"condition-results"` } type Service struct { @@ -52,7 +62,7 @@ func (service *Service) getStatus(result *Result) { result.Errors = append(result.Errors, err) return } - result.Duration = time.Now().Sub(startTime) + result.Duration = time.Now().Sub(startTime).String() result.HttpStatus = response.StatusCode } diff --git a/main.go b/main.go index 309a1804..482ec792 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,42 @@ package main import ( - "fmt" - "github.com/TwinProduction/gatus/config" + "encoding/json" + "github.com/TwinProduction/gatus/core" + "github.com/TwinProduction/gatus/watchdog" + "log" + "net/http" ) func main() { - for _, service := range config.Get().Services { - result := service.EvaluateConditions() - for _, conditionResult := range result.ConditionResult { - fmt.Printf("%v\n", *conditionResult) - } - } + go watchdog.Monitor() + http.HandleFunc("/api/v1/results", serviceResultsHandler) + http.HandleFunc("/health", healthHandler) + http.HandleFunc("/", indexHandler) + log.Println("[main][main] Listening on port 80") + log.Fatal(http.ListenAndServe(":80", nil)) +} + +func serviceResultsHandler(writer http.ResponseWriter, request *http.Request) { + serviceResults := watchdog.GetServiceResults() + writer.WriteHeader(http.StatusOK) + _, _ = writer.Write(structToJsonBytes(serviceResults)) +} + +func indexHandler(writer http.ResponseWriter, request *http.Request) { + writer.WriteHeader(http.StatusNotImplemented) + _, _ = writer.Write(structToJsonBytes(&core.ServerMessage{Error: true, Message: "Not implemented yet"})) +} + +func healthHandler(writer http.ResponseWriter, request *http.Request) { + writer.WriteHeader(http.StatusOK) + _, _ = writer.Write(structToJsonBytes(&core.HealthStatus{Status: "UP"})) +} + +func structToJsonBytes(obj interface{}) []byte { + bytes, err := json.Marshal(obj) + if err != nil { + log.Printf("[main][structToJsonBytes] Unable to marshall object to JSON: %s", err.Error()) + } + return bytes } diff --git a/watchdog/watchdog.go b/watchdog/watchdog.go index 03fb525e..1d493619 100644 --- a/watchdog/watchdog.go +++ b/watchdog/watchdog.go @@ -1 +1,34 @@ package watchdog + +import ( + "github.com/TwinProduction/gatus/config" + "github.com/TwinProduction/gatus/core" + "sync" + "time" +) + +var ( + serviceResults = make(map[string][]*core.Result) + rwLock sync.RWMutex +) + +func GetServiceResults() *map[string][]*core.Result { + return &serviceResults +} + +func Monitor() { + for { + for _, service := range config.Get().Services { + go func(service *core.Service) { + result := service.EvaluateConditions() + rwLock.Lock() + defer rwLock.Unlock() + serviceResults[service.Name] = append(serviceResults[service.Name], result) + if len(serviceResults[service.Name]) > 15 { + serviceResults[service.Name] = serviceResults[service.Name][15:] + } + }(service) + } + time.Sleep(10 * time.Second) + } +}