From 971e77b5d331193b88054e3044b3c2bb77f9edc2 Mon Sep 17 00:00:00 2001 From: Umputun Date: Sat, 22 May 2021 10:44:21 -0500 Subject: [PATCH] eliminate metrics middleware hit if mgmt disabled --- Makefile | 9 ++------- app/main.go | 32 +++++++++++++++++--------------- app/main_test.go | 2 +- app/proxy/health.go | 1 + app/proxy/proxy.go | 14 +++++++++++++- 5 files changed, 34 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index 3f98773..f648af3 100644 --- a/Makefile +++ b/Makefile @@ -20,18 +20,13 @@ race_test: build: info - cd app && GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X main.revision=$(REV) -s -w" -o ../dist/reproxy -site: build_site deploy_site - -build_site: +site: @rm -f site/public/* docker build -f Dockerfile.site -t reproxy.site . docker run -d --name=reproxy.site reproxy.site docker cp reproxy.site:/build/public site/ docker rm -f reproxy.site - -deploy_site: - rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress \ - ./site/public/ reproxy.io:/srv/www/reproxy.io + rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./site/public/ reproxy.io:/srv/www/reproxy.io info: - @echo "revision $(REV)" diff --git a/app/main.go b/app/main.go index d7f1b12..57d44b0 100644 --- a/app/main.go +++ b/app/main.go @@ -188,22 +188,24 @@ func run() error { } }() - metrics := mgmt.NewMetrics() - go func() { - mgSrv := mgmt.Server{ - Listen: opts.Management.Listen, - Informer: svc, - AssetsLocation: opts.Assets.Location, - AssetsWebRoot: opts.Assets.WebRoot, - Version: revision, - Metrics: metrics, - } - if opts.Management.Enabled { - if mgErr := mgSrv.Run(ctx); err != nil { - log.Printf("[WARN] management service failed, %v", mgErr) + var metrics *mgmt.Metrics // disabled by default + if opts.Management.Enabled { + metrics = mgmt.NewMetrics() + go func() { + mgSrv := mgmt.Server{ + Listen: opts.Management.Listen, + Informer: svc, + AssetsLocation: opts.Assets.Location, + AssetsWebRoot: opts.Assets.WebRoot, + Version: revision, } - } - }() + if opts.Management.Enabled { + if mgErr := mgSrv.Run(ctx); err != nil { + log.Printf("[WARN] management service failed, %v", mgErr) + } + } + }() + } cacheControl, err := proxy.MakeCacheControl(opts.Assets.CacheControl) if err != nil { diff --git a/app/main_test.go b/app/main_test.go index 393e2bb..74de95f 100644 --- a/app/main_test.go +++ b/app/main_test.go @@ -25,7 +25,7 @@ func Test_Main(t *testing.T) { "--static.rule=*,/svc2/(.*), https://echo.umputun.com/$1,https://feedmaster.umputun.com/ping", "--file.enabled", "--file.name=discovery/provider/testdata/config.yml", "--dbg", "--logger.enabled", "--logger.stdout", "--logger.file=/tmp/reproxy.log", - "--listen=127.0.0.1:" + strconv.Itoa(port), "--signature", + "--listen=127.0.0.1:" + strconv.Itoa(port), "--signature", "--mgmt.enabled", "--error.enabled", "--error.template=proxy/testdata/errtmpl.html", } defer os.Remove("/tmp/reproxy.log") diff --git a/app/proxy/health.go b/app/proxy/health.go index a056b82..f32e226 100644 --- a/app/proxy/health.go +++ b/app/proxy/health.go @@ -7,6 +7,7 @@ import ( log "github.com/go-pkgz/lgr" "github.com/go-pkgz/rest" + "github.com/umputun/reproxy/app/discovery" ) diff --git a/app/proxy/proxy.go b/app/proxy/proxy.go index 850296b..a42bec5 100644 --- a/app/proxy/proxy.go +++ b/app/proxy/proxy.go @@ -20,6 +20,7 @@ import ( "github.com/gorilla/handlers" "github.com/umputun/reproxy/app/discovery" + "github.com/umputun/reproxy/app/mgmt" ) // Http is a proxy server for both http and https @@ -104,7 +105,7 @@ func (h *Http) Run(ctx context.Context) error { h.signatureHandler(), h.pingHandler, h.healthMiddleware, - h.Metrics.Middleware, + h.mgmtHandler(), h.headersHandler(h.ProxyHeaders), h.accessLogHandler(h.AccessLog), h.stdoutLogHandler(h.StdOutEnabled, logger.New(logger.Log(log.Default()), logger.Prefix("[INFO]")).Handler), @@ -394,7 +395,18 @@ func (h *Http) maxReqSizeHandler(maxSize int64) func(next http.Handler) http.Han } return http.HandlerFunc(fn) } +} +func (h *Http) mgmtHandler() func(next http.Handler) http.Handler { + if h.Metrics.(*mgmt.Metrics) != nil { // type assertion needed because we compare interface to nil + log.Printf("[DEBUG] metrics enabled") + return h.Metrics.Middleware + } + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r) + }) + } } func (h *Http) makeHTTPServer(addr string, router http.Handler) *http.Server {