diff --git a/pkg/extensions/monitoring/common.go b/pkg/extensions/monitoring/common.go index a31fca56..3636ed8e 100644 --- a/pkg/extensions/monitoring/common.go +++ b/pkg/extensions/monitoring/common.go @@ -1,7 +1,6 @@ package monitoring import ( - "fmt" "os" "path/filepath" ) @@ -28,5 +27,5 @@ func getDirSize(path string) (int64, error) { return err }) - return size, fmt.Errorf("getDirSize: %w", err) + return size, err } diff --git a/pkg/extensions/monitoring/monitoring_test.go b/pkg/extensions/monitoring/monitoring_test.go new file mode 100644 index 00000000..edaa6ce6 --- /dev/null +++ b/pkg/extensions/monitoring/monitoring_test.go @@ -0,0 +1,126 @@ +//go:build extended +// +build extended + +package monitoring_test + +import ( + "context" + "io/ioutil" + "net/http" + "os" + "path" + "testing" + "time" + + . "github.com/smartystreets/goconvey/convey" + "gopkg.in/resty.v1" + "zotregistry.io/zot/pkg/api" + "zotregistry.io/zot/pkg/api/config" + extconf "zotregistry.io/zot/pkg/extensions/config" + "zotregistry.io/zot/pkg/extensions/monitoring" + . "zotregistry.io/zot/test" +) + +func TestExtensionMetrics(t *testing.T) { + Convey("Make a new controller with explicitly enabled metrics", t, func() { + port := GetFreePort() + baseURL := GetBaseURL(port) + conf := config.New() + conf.HTTP.Port = port + + rootDir, err := ioutil.TempDir("", "metrics-test") + if err != nil { + panic(err) + } + defer os.RemoveAll(rootDir) + + conf.Storage.RootDirectory = rootDir + conf.Extensions = &extconf.ExtensionConfig{} + conf.Extensions.Metrics = &extconf.MetricsConfig{ + Enable: true, + Prometheus: &extconf.PrometheusConfig{Path: "/metrics"}, + } + + ctlr := api.NewController(conf) + So(ctlr, ShouldNotBeNil) + + go startServer(ctlr) + defer stopServer(ctlr) + WaitTillServerReady(baseURL) + + // improve code coverage + ctlr.Metrics.SendMetric(baseURL) + ctlr.Metrics.ForceSendMetric(baseURL) + + So(ctlr.Metrics.IsEnabled(), ShouldBeTrue) + So(ctlr.Metrics.ReceiveMetrics(), ShouldBeNil) + + monitoring.ObserveHTTPRepoLatency(ctlr.Metrics, + "/v2/alpine/blobs/uploads/299148f0-0e32-4830-90d2-a3fa744137d9", time.Millisecond) + monitoring.IncDownloadCounter(ctlr.Metrics, "alpine") + monitoring.IncUploadCounter(ctlr.Metrics, "alpine") + + err = CopyFiles("../../../test/data/zot-test", path.Join(rootDir, "alpine")) + if err != nil { + panic(err) + } + monitoring.SetStorageUsage(ctlr.Metrics, rootDir, "alpine") + + monitoring.ObserveStorageLockLatency(ctlr.Metrics, time.Millisecond, rootDir, "RWLock") + + resp, err := resty.R().Get(baseURL + "/metrics") + So(err, ShouldBeNil) + So(resp, ShouldNotBeNil) + So(resp.StatusCode(), ShouldEqual, http.StatusOK) + + respStr := string(resp.Body()) + So(respStr, ShouldContainSubstring, "zot_repo_downloads_total{repo=\"alpine\"} 1") + So(respStr, ShouldContainSubstring, "zot_repo_uploads_total{repo=\"alpine\"} 1") + So(respStr, ShouldContainSubstring, "zot_repo_storage_bytes{repo=\"alpine\"}") + So(respStr, ShouldContainSubstring, "zot_storage_lock_latency_seconds_bucket") + So(respStr, ShouldContainSubstring, "zot_storage_lock_latency_seconds_sum") + So(respStr, ShouldContainSubstring, "zot_storage_lock_latency_seconds_bucket") + }) + Convey("Make a new controller with disabled metrics extension", t, func() { + port := GetFreePort() + baseURL := GetBaseURL(port) + conf := config.New() + conf.HTTP.Port = port + + rootDir, err := ioutil.TempDir("", "metrics-test") + if err != nil { + panic(err) + } + defer os.RemoveAll(rootDir) + + conf.Storage.RootDirectory = rootDir + conf.Extensions = &extconf.ExtensionConfig{} + conf.Extensions.Metrics = &extconf.MetricsConfig{Enable: false} + + ctlr := api.NewController(conf) + So(ctlr, ShouldNotBeNil) + + go startServer(ctlr) + defer stopServer(ctlr) + WaitTillServerReady(baseURL) + + So(ctlr.Metrics.IsEnabled(), ShouldBeFalse) + + resp, err := resty.R().Get(baseURL + "/metrics") + So(err, ShouldBeNil) + So(resp, ShouldNotBeNil) + So(resp.StatusCode(), ShouldEqual, http.StatusNotFound) + }) +} + +func startServer(c *api.Controller) { + // this blocks + if err := c.Run(); err != nil { + return + } +} + +func stopServer(c *api.Controller) { + ctx := context.Background() + _ = c.Server.Shutdown(ctx) +}