feat: add meta endpoints - API (#52)

Reviewed-on: twhelp/corev3#52
This commit is contained in:
Dawid Wysokiński 2024-01-24 06:22:03 +00:00
parent d1878c9e97
commit aff2b077c0
4 changed files with 50 additions and 8 deletions

View File

@ -7,9 +7,11 @@ import (
"log/slog" "log/slog"
"net/http" "net/http"
"net/url" "net/url"
"strings"
"time" "time"
"gitea.dwysokinski.me/twhelp/corev3/internal/chislog" "gitea.dwysokinski.me/twhelp/corev3/internal/chislog"
"gitea.dwysokinski.me/twhelp/corev3/internal/health"
"gitea.dwysokinski.me/twhelp/corev3/internal/port" "gitea.dwysokinski.me/twhelp/corev3/internal/port"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware" "github.com/go-chi/chi/v5/middleware"
@ -73,7 +75,10 @@ var (
} }
) )
const apiBasePath = "/api" const (
apiBasePath = "/api"
metaBasePath = "/_meta"
)
var cmdServe = &cli.Command{ var cmdServe = &cli.Command{
Name: "serve", Name: "serve",
@ -95,6 +100,8 @@ var cmdServe = &cli.Command{
} }
}() }()
h := health.New()
server, err := newHTTPServer( server, err := newHTTPServer(
httpServerConfig{ httpServerConfig{
port: c.Uint(apiServerPortFlag.Name), port: c.Uint(apiServerPortFlag.Name),
@ -104,17 +111,16 @@ var cmdServe = &cli.Command{
idleTimeout: c.Duration(apiServerIdleTimeoutFlag.Name), idleTimeout: c.Duration(apiServerIdleTimeoutFlag.Name),
}, },
func(r chi.Router) error { func(r chi.Router) error {
r.Use(newAPIMiddlewares(logger)...)
oapiCfg, oapiCfgErr := newOpenAPIConfigFromFlags(c) oapiCfg, oapiCfgErr := newOpenAPIConfigFromFlags(c)
if oapiCfgErr != nil { if oapiCfgErr != nil {
return oapiCfgErr return oapiCfgErr
} }
r.Mount( r.Use(newAPIMiddlewares(logger)...)
apiBasePath,
port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg)), r.Mount(metaBasePath, port.NewMetaHTTPHandler(h))
)
r.Mount(apiBasePath, port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg)))
return nil return nil
}, },
@ -177,7 +183,9 @@ func newOpenAPIConfigFromFlags(c *cli.Context) (port.OpenAPIConfig, error) {
func newAPIMiddlewares(logger *slog.Logger) chi.Middlewares { func newAPIMiddlewares(logger *slog.Logger) chi.Middlewares {
return 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, middleware.Recoverer,
} }
} }

View File

@ -92,6 +92,7 @@ func TestOpenAPI(t *testing.T) {
defer require.NoError(t, resp.Body.Close()) defer require.NoError(t, resp.Body.Close())
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
assert.Equal(t, tt.expectedContentType, resp.Header.Get("Content-Type")) assert.Equal(t, tt.expectedContentType, resp.Header.Get("Content-Type"))
_, _ = io.Copy(io.Discard, resp.Body)
}) })
} }
}) })

View File

@ -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
}

View File

@ -15,6 +15,9 @@ spec:
- name: twhelp-api-v2 - name: twhelp-api-v2
image: twhelp image: twhelp
args: [serve] args: [serve]
ports:
- name: container-port
containerPort: 9234
env: env:
- name: APP_MODE - name: APP_MODE
value: development value: development
@ -37,6 +40,18 @@ spec:
limits: limits:
cpu: 200m cpu: 200m
memory: 300Mi 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 apiVersion: v1
kind: Service kind: Service