package internal import ( "fmt" "net/http" "sync" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" ) type HealthServer struct { mu sync.RWMutex state int } func NewHealthServer() *HealthServer { return &HealthServer{ state: http.StatusOK, } } func (hs *HealthServer) SetHealthState(code int) { hs.mu.Lock() defer hs.mu.Unlock() hs.state = code } func (hs *HealthServer) GetHealthState() int { hs.mu.RLock() defer hs.mu.RUnlock() return hs.state } func (hs *HealthServer) Start() { r := mux.NewRouter() r.Use(mux.CORSMethodMiddleware(r)) r.HandleFunc("/health", hs.sendHealth).Methods(http.MethodGet) err := http.ListenAndServe("0.0.0.0:8080", r) if err != nil { log.WithFields(log.Fields{ "Caller": "HealthServer.Start", }).Error(fmt.Sprintf("Error creating health endpoint: %s", err.Error())) } } func (hs *HealthServer) sendHealth(w http.ResponseWriter, r *http.Request) { code := hs.GetHealthState() w.WriteHeader(code) _, err := w.Write([]byte{}) if err != nil { log.WithFields(log.Fields{ "Caller": "HealthServer.sendHealth", }).Error(fmt.Sprintf("Error answering health endpoint: %s", err.Error())) } }