diff --git a/examples/config-allextensions.json b/examples/config-allextensions.json index 5ee0ec3d..b5d91a8b 100644 --- a/examples/config-allextensions.json +++ b/examples/config-allextensions.json @@ -1,53 +1,53 @@ { - "distSpecVersion": "1.1.0-dev", - "storage": { - "rootDirectory": "/tmp/zot" - }, - "http": { - "address": "127.0.0.1", - "port": "8080" - }, - "log": { - "level": "debug" - }, - "extensions": { - "metrics": {}, - "sync": { - "credentialsFile": "./examples/sync-auth-filepath.json", - "registries": [ - { - "urls": [ - "https://registry1:5000" - ], - "onDemand": false, - "pollInterval": "6h", - "tlsVerify": true, - "certDir": "/home/user/certs", - "maxRetries": 3, - "retryDelay": "15m", - "content": [ - { - "prefix": "/repo1/repo", - "tags": { - "regex": "4.*", - "semver": true - } - }, - { - "prefix": "/repo2/repo" - } - ] - } - ] - }, - "search": { - "cve": { - "updateInterval": "2h" - } - }, - "scrub": { - "enable": true, - "interval": "24h" - } - } + "distSpecVersion": "1.1.0-dev", + "storage": { + "rootDirectory": "/tmp/zot" + }, + "http": { + "address": "127.0.0.1", + "port": "8080" + }, + "log": { + "level": "debug" + }, + "extensions": { + "metrics": {}, + "sync": { + "credentialsFile": "./examples/sync-auth-filepath.json", + "registries": [ + { + "urls": [ + "https://registry1:5000" + ], + "onDemand": false, + "pollInterval": "6h", + "tlsVerify": true, + "certDir": "/home/user/certs", + "maxRetries": 3, + "retryDelay": "15m", + "content": [ + { + "prefix": "/repo1/repo", + "tags": { + "regex": "4.*", + "semver": true + } + }, + { + "prefix": "/repo2/repo" + } + ] + } + ] + }, + "search": { + "cve": { + "updateInterval": "2h" + } + }, + "scrub": { + "enable": true, + "interval": "24h" + } + } } diff --git a/examples/config-anonymous-authz.json b/examples/config-anonymous-authz.json index adf1d740..f3178249 100644 --- a/examples/config-anonymous-authz.json +++ b/examples/config-anonymous-authz.json @@ -32,7 +32,7 @@ "read" ] } - } + } } }, "log": { diff --git a/pkg/api/config/config.go b/pkg/api/config/config.go index e7985884..b0142f2f 100644 --- a/pkg/api/config/config.go +++ b/pkg/api/config/config.go @@ -340,6 +340,10 @@ func isOpenIDAuthProviderEnabled(config *Config, provider string) bool { return false } +func (c *Config) IsMetricsEnabled() bool { + return c.Extensions != nil && c.Extensions.Metrics != nil && *c.Extensions.Metrics.Enable +} + func (c *Config) IsSearchEnabled() bool { return c.Extensions != nil && c.Extensions.Search != nil && *c.Extensions.Search.Enable } diff --git a/pkg/api/routes.go b/pkg/api/routes.go index cd749a6e..1c75488e 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -179,20 +179,8 @@ func (rh *RouteHandler) SetupRoutes() { // gql playground gqlPlayground.SetupGQLPlaygroundRoutes(prefixedRouter, rh.c.StoreController, rh.c.Log) - // setup extension routes - if rh.c.Config != nil { - // This logic needs to be reviewed, it should depend on build options - // not the general presence of the extensions in config - if rh.c.Config.Extensions == nil { - // minimal build - prefixedRouter.HandleFunc("/metrics", rh.GetMetrics).Methods("GET") - } else { - // extended build - ext.SetupMetricsRoutes(rh.c.Config, rh.c.Router, authHandler, rh.c.Log) - } - } - // Preconditions for enabling the actual extension routes are part of extensions themselves + ext.SetupMetricsRoutes(rh.c.Config, rh.c.Router, authHandler, rh.c.Log, rh.c.Metrics) ext.SetupSearchRoutes(rh.c.Config, prefixedRouter, rh.c.StoreController, rh.c.MetaDB, rh.c.CveInfo, rh.c.Log) ext.SetupImageTrustRoutes(rh.c.Config, prefixedRouter, rh.c.MetaDB, rh.c.Log) @@ -1860,11 +1848,6 @@ func (rh *RouteHandler) OpenIDCodeExchangeCallback() rp.CodeExchangeUserinfoCall } } -func (rh *RouteHandler) GetMetrics(w http.ResponseWriter, r *http.Request) { - m := rh.c.Metrics.ReceiveMetrics() - zcommon.WriteJSON(w, http.StatusOK, m) -} - // helper routines func getContentRange(r *http.Request) (int64 /* from */, int64 /* to */, error) { diff --git a/pkg/api/session.go b/pkg/api/session.go index f7dd5a91..c5f46f22 100644 --- a/pkg/api/session.go +++ b/pkg/api/session.go @@ -113,7 +113,7 @@ func SessionLogger(ctlr *Controller) mux.MiddlewareFunc { path = path + "?" + raw } - if path != "/v2/metrics" { + if path != "/metrics" { // In order to test metrics feture,the instrumentation related to node exporter // should be handled by node exporter itself (ex: latency) monitoring.IncHTTPConnRequests(ctlr.Metrics, method, strconv.Itoa(statusCode)) diff --git a/pkg/exporter/api/controller_test.go b/pkg/exporter/api/controller_test.go index c6509a14..9c8ad032 100644 --- a/pkg/exporter/api/controller_test.go +++ b/pkg/exporter/api/controller_test.go @@ -121,6 +121,7 @@ func TestNewExporter(t *testing.T) { So(servercConfig, ShouldNotBeNil) baseURL := fmt.Sprintf(BaseURL, serverPort) servercConfig.HTTP.Port = serverPort + servercConfig.BinaryType = "minimal" serverController := zotapi.NewController(servercConfig) So(serverController, ShouldNotBeNil) @@ -149,7 +150,7 @@ func TestNewExporter(t *testing.T) { } // Side effect of calling this endpoint is that it will enable metrics - resp, err := resty.R().Get(baseURL + "/v2/metrics") + resp, err := resty.R().Get(baseURL + "/metrics") So(resp, ShouldNotBeNil) So(err, ShouldBeNil) So(resp.StatusCode(), ShouldEqual, 200) diff --git a/pkg/extensions/extension_metrics.go b/pkg/extensions/extension_metrics.go index 818fc2fa..54e71982 100644 --- a/pkg/extensions/extension_metrics.go +++ b/pkg/extensions/extension_metrics.go @@ -8,12 +8,12 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "zotregistry.io/zot/pkg/api/config" + "zotregistry.io/zot/pkg/extensions/monitoring" "zotregistry.io/zot/pkg/log" ) func EnableMetricsExtension(config *config.Config, log log.Logger, rootDir string) { - if config.Extensions.Metrics != nil && - *config.Extensions.Metrics.Enable && + if config.IsMetricsEnabled() && config.Extensions.Metrics.Prometheus != nil { if config.Extensions.Metrics.Prometheus.Path == "" { config.Extensions.Metrics.Prometheus.Path = "/metrics" @@ -26,11 +26,11 @@ func EnableMetricsExtension(config *config.Config, log log.Logger, rootDir strin } func SetupMetricsRoutes(config *config.Config, router *mux.Router, - authFunc mux.MiddlewareFunc, log log.Logger, + authFunc mux.MiddlewareFunc, log log.Logger, metrics monitoring.MetricServer, ) { log.Info().Msg("setting up metrics routes") - if config.Extensions.Metrics != nil && *config.Extensions.Metrics.Enable { + if config.IsMetricsEnabled() { extRouter := router.PathPrefix(config.Extensions.Metrics.Prometheus.Path).Subrouter() extRouter.Use(authFunc) extRouter.Methods("GET").Handler(promhttp.Handler()) diff --git a/pkg/extensions/extension_metrics_disabled.go b/pkg/extensions/extension_metrics_disabled.go index 092f75f8..41cdccb8 100644 --- a/pkg/extensions/extension_metrics_disabled.go +++ b/pkg/extensions/extension_metrics_disabled.go @@ -4,9 +4,13 @@ package extensions import ( + "net/http" + "github.com/gorilla/mux" "zotregistry.io/zot/pkg/api/config" + zcommon "zotregistry.io/zot/pkg/common" + "zotregistry.io/zot/pkg/extensions/monitoring" "zotregistry.io/zot/pkg/log" ) @@ -18,8 +22,12 @@ func EnableMetricsExtension(config *config.Config, log log.Logger, rootDir strin // SetupMetricsRoutes ... func SetupMetricsRoutes(conf *config.Config, router *mux.Router, - authFunc mux.MiddlewareFunc, log log.Logger, + authFunc mux.MiddlewareFunc, log log.Logger, metrics monitoring.MetricServer, ) { - log.Warn().Msg("skipping setting up metrics routes because given zot binary doesn't include this feature," + - "please build a binary that does so") + getMetrics := func(w http.ResponseWriter, r *http.Request) { + m := metrics.ReceiveMetrics() + zcommon.WriteJSON(w, http.StatusOK, m) + } + + router.HandleFunc("/metrics", getMetrics).Methods("GET") } diff --git a/pkg/extensions/monitoring/minimal_client.go b/pkg/extensions/monitoring/minimal_client.go index e19a5066..1f4a4e72 100644 --- a/pkg/extensions/monitoring/minimal_client.go +++ b/pkg/extensions/monitoring/minimal_client.go @@ -60,7 +60,7 @@ func NewMetricsClient(config *MetricsConfig, logger log.Logger) *MetricsClient { func (mc *MetricsClient) GetMetrics() (*MetricsInfo, error) { metrics := &MetricsInfo{} - if _, err := mc.makeGETRequest(mc.config.Address+"/v2/metrics", metrics); err != nil { + if _, err := mc.makeGETRequest(mc.config.Address+"/metrics", metrics); err != nil { return nil, err }