mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08:13 +00:00 
			
		
		
		
	Disambiguate unsupported metrics from metrics errors
This commit is contained in:
		| @@ -98,9 +98,9 @@ func (s *volumeStatCalculator) calcAndStoreStats() { | |||||||
| 		metric, err := v.GetMetrics() | 		metric, err := v.GetMetrics() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			// Expected for Volumes that don't support Metrics | 			// Expected for Volumes that don't support Metrics | ||||||
| 			// TODO: Disambiguate unsupported from errors | 			if !volume.IsNotSupported(err) { | ||||||
| 			// See issue #20676 | 				glog.V(4).Infof("Failed to calculate volume metrics for pod %s volume %s: %+v", format.Pod(s.pod), name, err) | ||||||
| 			glog.V(4).Infof("Failed to calculate volume metrics for pod %s volume %s: %+v", format.Pod(s.pod), name, err) | 			} | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		stats = append(stats, s.parsePodVolumeStats(name, metric)) | 		stats = append(stats, s.parsePodVolumeStats(name, metric)) | ||||||
|   | |||||||
| @@ -17,9 +17,6 @@ limitations under the License. | |||||||
| package volume | package volume | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/api/resource" | 	"k8s.io/kubernetes/pkg/api/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/volume/util" | 	"k8s.io/kubernetes/pkg/volume/util" | ||||||
| ) | ) | ||||||
| @@ -45,7 +42,7 @@ func NewMetricsDu(path string) MetricsProvider { | |||||||
| func (md *metricsDu) GetMetrics() (*Metrics, error) { | func (md *metricsDu) GetMetrics() (*Metrics, error) { | ||||||
| 	metrics := &Metrics{} | 	metrics := &Metrics{} | ||||||
| 	if md.path == "" { | 	if md.path == "" { | ||||||
| 		return metrics, errors.New("no path defined for disk usage metrics.") | 		return metrics, NewNoPathDefinedError() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := md.runDu(metrics) | 	err := md.runDu(metrics) | ||||||
| @@ -76,7 +73,7 @@ func (md *metricsDu) runDu(metrics *Metrics) error { | |||||||
| func (md *metricsDu) getFsInfo(metrics *Metrics) error { | func (md *metricsDu) getFsInfo(metrics *Metrics) error { | ||||||
| 	available, capacity, _, err := util.FsInfo(md.path) | 	available, capacity, _, err := util.FsInfo(md.path) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to get FsInfo due to error %v", err) | 		return NewFsInfoFailedError(err) | ||||||
| 	} | 	} | ||||||
| 	metrics.Available = resource.NewQuantity(available, resource.BinarySI) | 	metrics.Available = resource.NewQuantity(available, resource.BinarySI) | ||||||
| 	metrics.Capacity = resource.NewQuantity(capacity, resource.BinarySI) | 	metrics.Capacity = resource.NewQuantity(capacity, resource.BinarySI) | ||||||
|   | |||||||
							
								
								
									
										77
									
								
								pkg/volume/metrics_errors.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								pkg/volume/metrics_errors.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | /* | ||||||
|  | Copyright 2016 The Kubernetes Authors. | ||||||
|  |  | ||||||
|  | Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | you may not use this file except in compliance with the License. | ||||||
|  | You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  | Unless required by applicable law or agreed to in writing, software | ||||||
|  | distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | See the License for the specific language governing permissions and | ||||||
|  | limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package volume | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// ErrCodeNotSupported code for NotSupported Errors. | ||||||
|  | 	ErrCodeNotSupported int = iota + 1 | ||||||
|  | 	ErrCodeNoPathDefined | ||||||
|  | 	ErrCodeFsInfoFailed | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // NewNotSupportedError creates a new MetricsError with code NotSupported. | ||||||
|  | func NewNotSupportedError() *MetricsError { | ||||||
|  | 	return &MetricsError{ | ||||||
|  | 		Code: ErrCodeNotSupported, | ||||||
|  | 		Msg:  "metrics are not supported for MetricsNil Volumes", | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewNoPathDefined creates a new MetricsError with code NoPathDefined. | ||||||
|  | func NewNoPathDefinedError() *MetricsError { | ||||||
|  | 	return &MetricsError{ | ||||||
|  | 		Code: ErrCodeNoPathDefined, | ||||||
|  | 		Msg:  "no path defined for disk usage metrics.", | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewFsInfoFailedError creates a new MetricsError with code FsInfoFailed. | ||||||
|  | func NewFsInfoFailedError(err error) *MetricsError { | ||||||
|  | 	return &MetricsError{ | ||||||
|  | 		Code: ErrCodeFsInfoFailed, | ||||||
|  | 		Msg:  fmt.Sprintf("Failed to get FsInfo due to error %v", err), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MetricsError to distinguish different Metrics Errors. | ||||||
|  | type MetricsError struct { | ||||||
|  | 	Code int | ||||||
|  | 	Msg  string | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *MetricsError) Error() string { | ||||||
|  | 	return fmt.Sprintf("%s", e.Msg) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsNotSupported returns true if and only if err is "key" not found error. | ||||||
|  | func IsNotSupported(err error) bool { | ||||||
|  | 	return isErrCode(err, ErrCodeNotSupported) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func isErrCode(err error, code int) bool { | ||||||
|  | 	if err == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if e, ok := err.(*MetricsError); ok { | ||||||
|  | 		return e.Code == code | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
| @@ -16,8 +16,6 @@ limitations under the License. | |||||||
|  |  | ||||||
| package volume | package volume | ||||||
|  |  | ||||||
| import "errors" |  | ||||||
|  |  | ||||||
| var _ MetricsProvider = &MetricsNil{} | var _ MetricsProvider = &MetricsNil{} | ||||||
|  |  | ||||||
| // MetricsNil represents a MetricsProvider that does not support returning | // MetricsNil represents a MetricsProvider that does not support returning | ||||||
| @@ -28,5 +26,5 @@ type MetricsNil struct{} | |||||||
| // GetMetrics returns an empty Metrics and an error. | // GetMetrics returns an empty Metrics and an error. | ||||||
| // See MetricsProvider.GetMetrics | // See MetricsProvider.GetMetrics | ||||||
| func (*MetricsNil) GetMetrics() (*Metrics, error) { | func (*MetricsNil) GetMetrics() (*Metrics, error) { | ||||||
| 	return &Metrics{}, errors.New("metrics are not supported for MetricsNil Volumes") | 	return &Metrics{}, NewNotSupportedError() | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,9 +17,6 @@ limitations under the License. | |||||||
| package volume | package volume | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/api/resource" | 	"k8s.io/kubernetes/pkg/api/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/volume/util" | 	"k8s.io/kubernetes/pkg/volume/util" | ||||||
| ) | ) | ||||||
| @@ -44,7 +41,7 @@ func NewMetricsStatFS(path string) MetricsProvider { | |||||||
| func (md *metricsStatFS) GetMetrics() (*Metrics, error) { | func (md *metricsStatFS) GetMetrics() (*Metrics, error) { | ||||||
| 	metrics := &Metrics{} | 	metrics := &Metrics{} | ||||||
| 	if md.path == "" { | 	if md.path == "" { | ||||||
| 		return metrics, errors.New("no path defined for disk usage metrics.") | 		return metrics, NewNoPathDefinedError() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := md.getFsInfo(metrics) | 	err := md.getFsInfo(metrics) | ||||||
| @@ -59,7 +56,7 @@ func (md *metricsStatFS) GetMetrics() (*Metrics, error) { | |||||||
| func (md *metricsStatFS) getFsInfo(metrics *Metrics) error { | func (md *metricsStatFS) getFsInfo(metrics *Metrics) error { | ||||||
| 	available, capacity, usage, err := util.FsInfo(md.path) | 	available, capacity, usage, err := util.FsInfo(md.path) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to get FsInfo due to error %v", err) | 		return NewFsInfoFailedError(err) | ||||||
| 	} | 	} | ||||||
| 	metrics.Available = resource.NewQuantity(available, resource.BinarySI) | 	metrics.Available = resource.NewQuantity(available, resource.BinarySI) | ||||||
| 	metrics.Capacity = resource.NewQuantity(capacity, resource.BinarySI) | 	metrics.Capacity = resource.NewQuantity(capacity, resource.BinarySI) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Angus Salkeld
					Angus Salkeld