mirror of
https://github.com/TwiN/gatus.git
synced 2024-11-25 09:24:04 +01:00
Add request handlers and move monitoring to watchdog package
This commit is contained in:
parent
1c05871975
commit
d57da0a1dd
@ -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
43
main.go
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user