diff --git a/README.md b/README.md index f07cd8bd1..303845c73 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,11 @@ apply as with `make run`. Example: make PORT=5000 ALERTMANAGER_URI=https://alertmanager.example.com run-docker +### Health checks + +`/health` endpoint can be used for health check probes, it always responds with +`200 OK` code and `Pong` response body. + ## Configuration Please see [CONFIGURATION](/docs/CONFIGURATION.md) for full list of available diff --git a/cmd/karma/main.go b/cmd/karma/main.go index d3107be46..a48b433d8 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -98,6 +98,7 @@ func setupRouter(router *gin.Engine) { })) router.GET(getViewURL("/"), index) + router.GET(getViewURL("/health"), pong) router.GET(getViewURL("/alerts.json"), alerts) router.GET(getViewURL("/autocomplete.json"), autocomplete) router.GET(getViewURL("/labelNames.json"), knownLabelNames) diff --git a/cmd/karma/views.go b/cmd/karma/views.go index 5d42fce9a..2075d9468 100644 --- a/cmd/karma/views.go +++ b/cmd/karma/views.go @@ -33,6 +33,10 @@ func noCache(c *gin.Context) { c.Header("Cache-Control", "no-cache, no-store, must-revalidate") } +func pong(c *gin.Context) { + c.String(200, "Pong") +} + func compressResponse(data []byte) ([]byte, error) { var b bytes.Buffer gz, err := gzip.NewWriterLevel(&b, 3) diff --git a/cmd/karma/views_test.go b/cmd/karma/views_test.go index cbe037c8b..a22385365 100644 --- a/cmd/karma/views_test.go +++ b/cmd/karma/views_test.go @@ -49,6 +49,30 @@ func ginTestEngine() *gin.Engine { return r } +func TestHealth(t *testing.T) { + mockConfig() + r := ginTestEngine() + req := httptest.NewRequest("GET", "/health", nil) + resp := httptest.NewRecorder() + r.ServeHTTP(resp, req) + if resp.Code != http.StatusOK { + t.Errorf("GET /health returned status %d", resp.Code) + } +} + +func TestHealthPrefix(t *testing.T) { + os.Setenv("LISTEN_PREFIX", "/prefix") + defer os.Unsetenv("LISTEN_PREFIX") + mockConfig() + r := ginTestEngine() + req := httptest.NewRequest("GET", "/prefix/health", nil) + resp := httptest.NewRecorder() + r.ServeHTTP(resp, req) + if resp.Code != http.StatusOK { + t.Errorf("GET /prefix/health returned status %d", resp.Code) + } +} + func TestIndex(t *testing.T) { mockConfig() r := ginTestEngine()