From 5282639f3c5ea871a1351498d2aa0553760f20fe Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 30 May 2018 11:30:14 -0700 Subject: [PATCH] Add prometheus endpoint to support total Used storageInfo (#5988) Since we deprecated Total/Free we don't need to update prometheus with those metrics. This PR also adds support for caching implementation. --- cmd/disk-cache.go | 15 +++++++++----- cmd/metrics.go | 40 ++++++++++++++++++++++++++----------- cmd/object-api-datatypes.go | 4 +--- cmd/server-startup-msg.go | 2 +- cmd/web-handlers_test.go | 4 ---- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/cmd/disk-cache.go b/cmd/disk-cache.go index e07d9c1f4..f96016524 100644 --- a/cmd/disk-cache.go +++ b/cmd/disk-cache.go @@ -77,6 +77,13 @@ type cacheObjects struct { DeleteBucketFn func(ctx context.Context, bucket string) error } +// CacheStorageInfo - represents total, free capacity of +// underlying cache storage. +type CacheStorageInfo struct { + Total uint64 // Total cache disk space. + Free uint64 // Free cache available space. +} + // CacheObjectLayer implements primitives for cache object API layer. type CacheObjectLayer interface { // Bucket operations. @@ -98,7 +105,7 @@ type CacheObjectLayer interface { CompleteMultipartUpload(ctx context.Context, bucket, object, uploadID string, uploadedParts []CompletePart) (objInfo ObjectInfo, err error) // Storage operations. - StorageInfo(ctx context.Context) StorageInfo + StorageInfo(ctx context.Context) CacheStorageInfo } // backendDownError returns true if err is due to backend failure or faulty disk if in server mode @@ -771,7 +778,7 @@ func (c cacheObjects) CompleteMultipartUpload(ctx context.Context, bucket, objec } // StorageInfo - returns underlying storage statistics. -func (c cacheObjects) StorageInfo(ctx context.Context) (storageInfo StorageInfo) { +func (c cacheObjects) StorageInfo(ctx context.Context) (cInfo CacheStorageInfo) { var total, free uint64 for _, cfs := range c.cache.cfs { if cfs == nil { @@ -783,12 +790,10 @@ func (c cacheObjects) StorageInfo(ctx context.Context) (storageInfo StorageInfo) total += info.Total free += info.Free } - storageInfo = StorageInfo{ + return CacheStorageInfo{ Total: total, Free: free, } - storageInfo.Backend.Type = FS - return storageInfo } // DeleteBucket - marks bucket to be deleted from cache if bucket is deleted from backend. diff --git a/cmd/metrics.go b/cmd/metrics.go index 1a32845fe..7853499bb 100644 --- a/cmd/metrics.go +++ b/cmd/metrics.go @@ -84,6 +84,28 @@ func (c *minioCollector) Collect(ch chan<- prometheus.Metric) { float64(globalConnStats.getTotalInputBytes()), ) + // Expose cache stats only if available + cacheObjLayer := newCacheObjectsFn() + if cacheObjLayer != nil { + cs := cacheObjLayer.StorageInfo(context.Background()) + ch <- prometheus.MustNewConstMetric( + prometheus.NewDesc( + prometheus.BuildFQName("minio", "disk", "cache_storage_bytes"), + "Total cache capacity on current Minio server instance", + nil, nil), + prometheus.GaugeValue, + float64(cs.Total), + ) + ch <- prometheus.MustNewConstMetric( + prometheus.NewDesc( + prometheus.BuildFQName("minio", "disk", "cache_storage_free_bytes"), + "Total cache available on current Minio server instance", + nil, nil), + prometheus.GaugeValue, + float64(cs.Free), + ) + } + // Expose disk stats only if applicable // Fetch disk space info @@ -92,7 +114,9 @@ func (c *minioCollector) Collect(ch chan<- prometheus.Metric) { if objLayer == nil { return } + s := objLayer.StorageInfo(context.Background()) + // Gateways don't provide disk info if s.Backend.Type == Unknown { return @@ -108,22 +132,14 @@ func (c *minioCollector) Collect(ch chan<- prometheus.Metric) { totalDisks = s.Backend.OfflineDisks + s.Backend.OnlineDisks } - // Total/Free Storage Bytes - ch <- prometheus.MustNewConstMetric( - prometheus.NewDesc( - prometheus.BuildFQName("minio", "disk", "storage_bytes"), - "Total disk storage available to current Minio server instance", - nil, nil), - prometheus.GaugeValue, - float64(s.Total), - ) + // Total disk usage by current Minio server instance ch <- prometheus.MustNewConstMetric( prometheus.NewDesc( - prometheus.BuildFQName("minio", "disk", "storage_free_bytes"), - "Total free disk storage available to current Minio server instance", + prometheus.BuildFQName("minio", "disk", "storage_used_bytes"), + "Total disk storage used by current Minio server instance", nil, nil), prometheus.GaugeValue, - float64(s.Free), + float64(s.Used), ) // Minio Total Disk/Offline Disk diff --git a/cmd/object-api-datatypes.go b/cmd/object-api-datatypes.go index 486e0fcc9..ac72a19f9 100644 --- a/cmd/object-api-datatypes.go +++ b/cmd/object-api-datatypes.go @@ -39,9 +39,7 @@ const ( // StorageInfo - represents total capacity of underlying storage. type StorageInfo struct { - Total uint64 // Total disk space. - Free uint64 // Free available space. - Used uint64 // Used total used per tenant. + Used uint64 // Used total used per tenant. // Backend type. Backend struct { diff --git a/cmd/server-startup-msg.go b/cmd/server-startup-msg.go index 0a7a52dce..6cbe0c656 100644 --- a/cmd/server-startup-msg.go +++ b/cmd/server-startup-msg.go @@ -188,7 +188,7 @@ func printStorageInfo(storageInfo StorageInfo) { } } -func printCacheStorageInfo(storageInfo StorageInfo) { +func printCacheStorageInfo(storageInfo CacheStorageInfo) { msg := fmt.Sprintf("%s %s Free, %s Total", colorBlue("Cache Capacity:"), humanize.IBytes(uint64(storageInfo.Free)), humanize.IBytes(uint64(storageInfo.Total))) diff --git a/cmd/web-handlers_test.go b/cmd/web-handlers_test.go index 5ccfed158..84a0a2db8 100644 --- a/cmd/web-handlers_test.go +++ b/cmd/web-handlers_test.go @@ -1786,10 +1786,6 @@ func TestWebObjectLayerFaultyDisks(t *testing.T) { if err != nil { t.Fatalf("Failed %v", err) } - // if Total size is 0 it indicates faulty disk. - if storageInfoReply.StorageInfo.Total != 0 { - t.Fatalf("Should get zero Total size since disks are faulty ") - } // Test authorization of Web.Download req, err = http.NewRequest("GET", "/minio/download/bucket/object?token="+authorization, nil)