health: basic health checker from the monitor

This commit is contained in:
Ask Bjørn Hansen 2023-07-02 23:49:05 -07:00
parent bb99ca5843
commit ab579128b9
2 changed files with 74 additions and 0 deletions

47
health/health_server.go Normal file
View File

@ -0,0 +1,47 @@
package health
import (
"context"
"net/http"
"strconv"
"time"
"golang.org/x/exp/slog"
)
// HealthCheckListener runs simple http server on the specified port for
// health check probes
func HealthCheckListener(ctx context.Context, port int, log *slog.Logger) {
log.Info("Starting health listener", "port", port)
serveMux := http.NewServeMux()
serveMux.HandleFunc("/__health", basicHealth)
srv := &http.Server{
Addr: ":" + strconv.Itoa(port),
ReadTimeout: 10 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 120 * time.Second,
Handler: serveMux,
}
go func() {
err := srv.ListenAndServe()
if err != http.ErrServerClosed {
log.Warn("health check server done listening", "err", err)
}
}()
<-ctx.Done()
if err := srv.Shutdown(ctx); err != nil {
log.Error("health check server shutdown failed", "err", err)
}
}
func basicHealth(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte("ok"))
}

27
health/health_test.go Normal file
View File

@ -0,0 +1,27 @@
package health
import (
"io"
"net/http"
"net/http/httptest"
"testing"
)
func TestHealthHandler(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/__health", nil)
w := httptest.NewRecorder()
basicHealth(w, req)
res := w.Result()
defer res.Body.Close()
data, err := io.ReadAll(res.Body)
if err != nil {
t.Errorf("expected error to be nil got %v", err)
}
if string(data) != "ok" {
t.Fail()
t.Errorf("expected ok got %q", string(data))
}
}