diff --git a/cmd/twhelp/cmd_serve.go b/cmd/twhelp/cmd_serve.go index 4ffbb1c..b68b14c 100644 --- a/cmd/twhelp/cmd_serve.go +++ b/cmd/twhelp/cmd_serve.go @@ -7,9 +7,11 @@ import ( "log/slog" "net/http" "net/url" + "strings" "time" "gitea.dwysokinski.me/twhelp/corev3/internal/chislog" + "gitea.dwysokinski.me/twhelp/corev3/internal/health" "gitea.dwysokinski.me/twhelp/corev3/internal/port" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" @@ -73,7 +75,10 @@ var ( } ) -const apiBasePath = "/api" +const ( + apiBasePath = "/api" + metaBasePath = "/_meta" +) var cmdServe = &cli.Command{ Name: "serve", @@ -95,6 +100,8 @@ var cmdServe = &cli.Command{ } }() + h := health.New() + server, err := newHTTPServer( httpServerConfig{ port: c.Uint(apiServerPortFlag.Name), @@ -104,17 +111,16 @@ var cmdServe = &cli.Command{ idleTimeout: c.Duration(apiServerIdleTimeoutFlag.Name), }, func(r chi.Router) error { - r.Use(newAPIMiddlewares(logger)...) - oapiCfg, oapiCfgErr := newOpenAPIConfigFromFlags(c) if oapiCfgErr != nil { return oapiCfgErr } - r.Mount( - apiBasePath, - port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg)), - ) + r.Use(newAPIMiddlewares(logger)...) + + r.Mount(metaBasePath, port.NewMetaHTTPHandler(h)) + + r.Mount(apiBasePath, port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg))) return nil }, @@ -177,7 +183,9 @@ func newOpenAPIConfigFromFlags(c *cli.Context) (port.OpenAPIConfig, error) { func newAPIMiddlewares(logger *slog.Logger) chi.Middlewares { return chi.Middlewares{ - chislog.Logger(logger), + chislog.Logger(logger, chislog.WithFilter(func(r *http.Request) bool { + return !strings.HasPrefix(r.URL.Path, metaBasePath) + })), middleware.Recoverer, } } diff --git a/internal/port/handler_http_api_openapi_test.go b/internal/port/handler_http_api_openapi_test.go index 8ffb52f..c7cd193 100644 --- a/internal/port/handler_http_api_openapi_test.go +++ b/internal/port/handler_http_api_openapi_test.go @@ -92,6 +92,7 @@ func TestOpenAPI(t *testing.T) { defer require.NoError(t, resp.Body.Close()) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, tt.expectedContentType, resp.Header.Get("Content-Type")) + _, _ = io.Copy(io.Discard, resp.Body) }) } }) diff --git a/internal/port/handler_http_meta.go b/internal/port/handler_http_meta.go new file mode 100644 index 0000000..960d7ba --- /dev/null +++ b/internal/port/handler_http_meta.go @@ -0,0 +1,18 @@ +package port + +import ( + "net/http" + + "gitea.dwysokinski.me/twhelp/corev3/internal/health" + "gitea.dwysokinski.me/twhelp/corev3/internal/health/healthhttp" + "github.com/go-chi/chi/v5" +) + +func NewMetaHTTPHandler(h *health.Health) http.Handler { + r := chi.NewRouter() + + r.Get("/livez", healthhttp.LiveHandler(h).ServeHTTP) + r.Get("/readyz", healthhttp.ReadyHandler(h).ServeHTTP) + + return r +} diff --git a/k8s/base/api.yml b/k8s/base/api.yml index 9c58d4a..9470cd2 100644 --- a/k8s/base/api.yml +++ b/k8s/base/api.yml @@ -15,6 +15,9 @@ spec: - name: twhelp-api-v2 image: twhelp args: [serve] + ports: + - name: container-port + containerPort: 9234 env: - name: APP_MODE value: development @@ -37,6 +40,18 @@ spec: limits: cpu: 200m memory: 300Mi + livenessProbe: + httpGet: + path: /_meta/livez + port: container-port + initialDelaySeconds: 5 + periodSeconds: 5 + readinessProbe: + httpGet: + path: /_meta/readyz + port: container-port + initialDelaySeconds: 5 + periodSeconds: 10 --- apiVersion: v1 kind: Service