diff --git a/pkg/custom-provider/provider.go b/pkg/custom-provider/provider.go index afd59ac9..38076f72 100644 --- a/pkg/custom-provider/provider.go +++ b/pkg/custom-provider/provider.go @@ -37,6 +37,7 @@ import ( "k8s.io/metrics/pkg/apis/custom_metrics" prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" + "github.com/directxman12/k8s-prometheus-adapter/pkg/naming" ) // Runnable represents something that can be run until told to stop. @@ -55,7 +56,7 @@ type prometheusProvider struct { SeriesRegistry } -func NewPrometheusProvider(mapper apimeta.RESTMapper, kubeClient dynamic.Interface, promClient prom.Client, namers []MetricNamer, updateInterval time.Duration, maxAge time.Duration) (provider.CustomMetricsProvider, Runnable) { +func NewPrometheusProvider(mapper apimeta.RESTMapper, kubeClient dynamic.Interface, promClient prom.Client, namers []naming.MetricNamer, updateInterval time.Duration, maxAge time.Duration) (provider.CustomMetricsProvider, Runnable) { lister := &cachingMetricsLister{ updateInterval: updateInterval, maxAge: maxAge, @@ -193,7 +194,7 @@ type cachingMetricsLister struct { promClient prom.Client updateInterval time.Duration maxAge time.Duration - namers []MetricNamer + namers []naming.MetricNamer } func (l *cachingMetricsLister) Run() { diff --git a/pkg/custom-provider/provider_test.go b/pkg/custom-provider/provider_test.go index 29abe038..4f08b536 100644 --- a/pkg/custom-provider/provider_test.go +++ b/pkg/custom-provider/provider_test.go @@ -28,6 +28,7 @@ import ( config "github.com/directxman12/k8s-prometheus-adapter/cmd/config-gen/utils" prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" fakeprom "github.com/directxman12/k8s-prometheus-adapter/pkg/client/fake" + "github.com/directxman12/k8s-prometheus-adapter/pkg/naming" pmodel "github.com/prometheus/common/model" ) @@ -39,7 +40,7 @@ func setupPrometheusProvider() (provider.CustomMetricsProvider, *fakeprom.FakePr fakeKubeClient := &fakedyn.FakeDynamicClient{} cfg := config.DefaultConfig(1*time.Minute, "") - namers, err := NamersFromConfig(cfg, restMapper()) + namers, err := naming.NamersFromConfig(cfg, restMapper()) Expect(err).NotTo(HaveOccurred()) prov, _ := NewPrometheusProvider(restMapper(), fakeKubeClient, fakeProm, namers, fakeProviderUpdateInterval, fakeProviderStartDuration) diff --git a/pkg/custom-provider/series_registry.go b/pkg/custom-provider/series_registry.go index a4701cf4..d4a021ff 100644 --- a/pkg/custom-provider/series_registry.go +++ b/pkg/custom-provider/series_registry.go @@ -24,6 +24,7 @@ import ( apimeta "k8s.io/apimachinery/pkg/api/meta" prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" + "github.com/directxman12/k8s-prometheus-adapter/pkg/naming" "github.com/golang/glog" pmodel "github.com/prometheus/common/model" ) @@ -45,7 +46,7 @@ const ( type SeriesRegistry interface { // SetSeries replaces the known series in this registry. // Each slice in series should correspond to a MetricNamer in namers. - SetSeries(series [][]prom.Series, namers []MetricNamer) error + SetSeries(series [][]prom.Series, namers []naming.MetricNamer) error // ListAllMetrics lists all metrics known to this registry ListAllMetrics() []provider.CustomMetricInfo // SeriesForMetric looks up the minimum required series information to make a query for the given metric @@ -60,7 +61,7 @@ type seriesInfo struct { seriesName string // namer is the MetricNamer used to name this series - namer MetricNamer + namer naming.MetricNamer } // overridableSeriesRegistry is a basic SeriesRegistry @@ -75,7 +76,7 @@ type basicSeriesRegistry struct { mapper apimeta.RESTMapper } -func (r *basicSeriesRegistry) SetSeries(newSeriesSlices [][]prom.Series, namers []MetricNamer) error { +func (r *basicSeriesRegistry) SetSeries(newSeriesSlices [][]prom.Series, namers []naming.MetricNamer) error { if len(newSeriesSlices) != len(namers) { return fmt.Errorf("need one set of series per namer") } @@ -99,7 +100,7 @@ func (r *basicSeriesRegistry) SetSeries(newSeriesSlices [][]prom.Series, namers } // namespace metrics aren't counted as namespaced - if resource == nsGroupResource { + if resource == naming.NsGroupResource { info.Namespaced = false } diff --git a/pkg/custom-provider/series_registry_test.go b/pkg/custom-provider/series_registry_test.go index afd22b32..7e40da14 100644 --- a/pkg/custom-provider/series_registry_test.go +++ b/pkg/custom-provider/series_registry_test.go @@ -31,6 +31,7 @@ import ( config "github.com/directxman12/k8s-prometheus-adapter/cmd/config-gen/utils" prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" + "github.com/directxman12/k8s-prometheus-adapter/pkg/naming" ) // restMapper creates a RESTMapper with just the types we need for @@ -50,9 +51,9 @@ func restMapper() apimeta.RESTMapper { return mapper } -func setupMetricNamer() []MetricNamer { +func setupMetricNamer() []naming.MetricNamer { cfg := config.DefaultConfig(1*time.Minute, "kube_") - namers, err := NamersFromConfig(cfg, restMapper()) + namers, err := naming.NamersFromConfig(cfg, restMapper()) Expect(err).NotTo(HaveOccurred()) return namers } diff --git a/pkg/external-provider/errors.go b/pkg/external-provider/errors.go index 970960e8..c55a18e7 100644 --- a/pkg/external-provider/errors.go +++ b/pkg/external-provider/errors.go @@ -3,19 +3,19 @@ package provider import "errors" var ( - // ErrorNewOperatorNotSupportedByPrometheus creates an error that represents the fact that we were requested to service a query that + // ErrNewOperatorNotSupportedByPrometheus creates an error that represents the fact that we were requested to service a query that // Prometheus would be unable to support. - ErrorNewOperatorNotSupportedByPrometheus = errors.New("operator not supported by prometheus") + ErrNewOperatorNotSupportedByPrometheus = errors.New("operator not supported by prometheus") - // ErrorNewOperatorRequiresValues creates an error that represents the fact that we were requested to service a query + // ErrNewOperatorRequiresValues creates an error that represents the fact that we were requested to service a query // that was malformed in its operator/value combination. - ErrorNewOperatorRequiresValues = errors.New("operator requires values") + ErrNewOperatorRequiresValues = errors.New("operator requires values") - // ErrorNewOperatorDoesNotSupportValues creates an error that represents the fact that we were requested to service a query + // ErrNewOperatorDoesNotSupportValues creates an error that represents the fact that we were requested to service a query // that was malformed in its operator/value combination. - ErrorNewOperatorDoesNotSupportValues = errors.New("operator does not support values") + ErrNewOperatorDoesNotSupportValues = errors.New("operator does not support values") - // ErrorNewLabelNotSpecified creates an error that represents the fact that we were requested to service a query + // ErrNewLabelNotSpecified creates an error that represents the fact that we were requested to service a query // that was malformed in its label specification. - ErrorNewLabelNotSpecified = errors.New("label not specified") + ErrNewLabelNotSpecified = errors.New("label not specified") ) diff --git a/pkg/external-provider/external_series_registry.go b/pkg/external-provider/external_series_registry.go index b6586aaf..50a002b1 100644 --- a/pkg/external-provider/external_series_registry.go +++ b/pkg/external-provider/external_series_registry.go @@ -21,6 +21,7 @@ type ExternalSeriesRegistry interface { // overridableSeriesRegistry is a basic SeriesRegistry type externalSeriesRegistry struct { + // We lock when reading/writing metrics, and rawMetrics to prevent inconsistencies. mu sync.RWMutex // metrics is the list of all known metrics, ready to return from the API diff --git a/pkg/external-provider/query_builder.go b/pkg/external-provider/query_builder.go index 0161ba6f..51317d01 100644 --- a/pkg/external-provider/query_builder.go +++ b/pkg/external-provider/query_builder.go @@ -92,11 +92,11 @@ func (n *queryBuilder) processQueryParts(queryParts []queryPart) ([]string, map[ // We obviously can't generate label filters for these cases. fmt.Println("This is queryPart", qPart.labelName, qPart.operator, qPart.values) if qPart.labelName == "" { - return nil, nil, ErrorNewLabelNotSpecified + return nil, nil, ErrNewLabelNotSpecified } if !n.operatorIsSupported(qPart.operator) { - return nil, nil, ErrorNewOperatorNotSupportedByPrometheus + return nil, nil, ErrNewOperatorNotSupportedByPrometheus } matcher, err := n.selectMatcher(qPart.operator, qPart.values) @@ -128,7 +128,7 @@ func (n *queryBuilder) selectMatcher(operator selection.Operator, values []strin case selection.DoesNotExist: return prom.LabelEq, nil case selection.Equals, selection.DoubleEquals, selection.NotEquals, selection.In, selection.NotIn: - return nil, ErrorNewOperatorRequiresValues + return nil, ErrNewOperatorRequiresValues } } else if numValues == 1 { switch operator { @@ -168,7 +168,7 @@ func (n *queryBuilder) selectTargetValue(operator selection.Operator, values []s // whose value is NOT "". return "", nil case selection.Equals, selection.DoubleEquals, selection.NotEquals, selection.In, selection.NotIn: - return "", ErrorNewOperatorRequiresValues + return "", ErrNewOperatorRequiresValues } } else if numValues == 1 { switch operator { @@ -194,7 +194,7 @@ func (n *queryBuilder) selectTargetValue(operator selection.Operator, values []s // for their label selector. return strings.Join(values, "|"), nil case selection.Exists, selection.DoesNotExist: - return "", ErrorNewOperatorDoesNotSupportValues + return "", ErrNewOperatorDoesNotSupportValues } }