Add request handlers and move monitoring to watchdog package

This commit is contained in:
TwinProduction 2019-09-06 21:59:50 -04:00
parent 1c05871975
commit d57da0a1dd
3 changed files with 85 additions and 15 deletions

View File

@ -10,13 +10,23 @@ import (
"time" "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 { type Result struct {
HttpStatus int HttpStatus int `json:"status"`
Hostname string Hostname string `json:"hostname"`
Ip string Ip string `json:"ip"`
Duration time.Duration Duration string `json:"duration"`
Errors []error Errors []error `json:"errors"`
ConditionResult []*ConditionResult ConditionResult []*ConditionResult `json:"condition-results"`
} }
type Service struct { type Service struct {
@ -52,7 +62,7 @@ func (service *Service) getStatus(result *Result) {
result.Errors = append(result.Errors, err) result.Errors = append(result.Errors, err)
return return
} }
result.Duration = time.Now().Sub(startTime) result.Duration = time.Now().Sub(startTime).String()
result.HttpStatus = response.StatusCode result.HttpStatus = response.StatusCode
} }

43
main.go
View File

@ -1,15 +1,42 @@
package main package main
import ( import (
"fmt" "encoding/json"
"github.com/TwinProduction/gatus/config" "github.com/TwinProduction/gatus/core"
"github.com/TwinProduction/gatus/watchdog"
"log"
"net/http"
) )
func main() { func main() {
for _, service := range config.Get().Services { go watchdog.Monitor()
result := service.EvaluateConditions() http.HandleFunc("/api/v1/results", serviceResultsHandler)
for _, conditionResult := range result.ConditionResult { http.HandleFunc("/health", healthHandler)
fmt.Printf("%v\n", *conditionResult) 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
} }

View File

@ -1 +1,34 @@
package watchdog 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)
}
}