From 1ad62f36efdb46233d8e0f8f4800cc5615913ca1 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Wed, 24 Sep 2025 15:23:53 -0400 Subject: [PATCH] feat(server): add health check endpoint --- internal/client/client.go | 16 +++++++++++++++- internal/server/proto.go | 4 ++++ internal/server/server.go | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/internal/client/client.go b/internal/client/client.go index 4310e6a5385b1ebb67d5d5b698048089da2f4d1f..81ca596acad7af4517c505fe46f546db14a15409 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -3,6 +3,7 @@ package client import ( "context" "encoding/json" + "fmt" "net" "net/http" "path/filepath" @@ -64,7 +65,7 @@ func (c *Client) Path() string { return c.path } -// GetGlobalConfig retrieves the server's configuration via RPC. +// GetGlobalConfig retrieves the server's configuration. func (c *Client) GetGlobalConfig() (*config.Config, error) { var cfg config.Config rsp, err := c.h.Get("http://localhost/v1/config") @@ -77,3 +78,16 @@ func (c *Client) GetGlobalConfig() (*config.Config, error) { } return &cfg, nil } + +// Health checks the server's health status. +func (c *Client) Health() error { + rsp, err := c.h.Get("http://localhost/v1/health") + if err != nil { + return err + } + defer rsp.Body.Close() + if rsp.StatusCode != http.StatusOK { + return fmt.Errorf("server health check failed: %s", rsp.Status) + } + return nil +} diff --git a/internal/server/proto.go b/internal/server/proto.go index a7b2d6949d9594fd61f5d4dea481a8ffc2f4ec6f..638de277d8bb2fdfecd9181eedb96ae1fc7b69c8 100644 --- a/internal/server/proto.go +++ b/internal/server/proto.go @@ -21,6 +21,10 @@ type controllerV1 struct { *Server } +func (c *controllerV1) handleGetHealth(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) +} + func (c *controllerV1) handleGetConfig(w http.ResponseWriter, r *http.Request) { jsonEncode(w, c.cfg) } diff --git a/internal/server/server.go b/internal/server/server.go index 14c0bfd75c73bf8d352d92a38975b02b83b686bc..cf3d18e49d76cd5a938de80711976e034a8d6f80 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -112,6 +112,7 @@ func NewServer(cfg *config.Config, network, address string) *Server { p.SetUnencryptedHTTP2(true) c := &controllerV1{Server: s} mux := http.NewServeMux() + mux.HandleFunc("GET /v1/health", c.handleGetHealth) mux.HandleFunc("GET /v1/config", c.handleGetConfig) mux.HandleFunc("GET /v1/instances", c.handleGetInstances) mux.HandleFunc("POST /v1/instances", c.handlePostInstances)