From 99d52a4ce8ae954c0755c3db987a0abfd754594b Mon Sep 17 00:00:00 2001 From: Sergiusz Urbaniak Date: Fri, 17 May 2019 14:22:09 +0200 Subject: [PATCH 1/2] pkg/external-provider: set metric name for scalar values --- pkg/external-provider/metric_converter.go | 20 +++++++++++--------- pkg/external-provider/provider.go | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/external-provider/metric_converter.go b/pkg/external-provider/metric_converter.go index eb1b0f99..927aae50 100644 --- a/pkg/external-provider/metric_converter.go +++ b/pkg/external-provider/metric_converter.go @@ -18,6 +18,7 @@ import ( "fmt" prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" + "github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider" "github.com/prometheus/common/model" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,7 +28,7 @@ import ( // MetricConverter provides a unified interface for converting the results of // Prometheus queries into external metric types. type MetricConverter interface { - Convert(queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) + Convert(info provider.ExternalMetricInfo, queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) } type metricConverter struct { @@ -39,23 +40,23 @@ func NewMetricConverter() MetricConverter { return &metricConverter{} } -func (c *metricConverter) Convert(queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { +func (c *metricConverter) Convert(info provider.ExternalMetricInfo, queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { if queryResult.Type == model.ValScalar { - return c.convertScalar(queryResult) + return c.convertScalar(info, queryResult) } if queryResult.Type == model.ValVector { - return c.convertVector(queryResult) + return c.convertVector(info, queryResult) } return nil, errors.New("encountered an unexpected query result type") } -func (c *metricConverter) convertSample(sample *model.Sample) (*external_metrics.ExternalMetricValue, error) { +func (c *metricConverter) convertSample(info provider.ExternalMetricInfo, sample *model.Sample) (*external_metrics.ExternalMetricValue, error) { labels := c.convertLabels(sample.Metric) singleMetric := external_metrics.ExternalMetricValue{ - MetricName: string(sample.Metric[model.LabelName("__name__")]), + MetricName: info.Metric, Timestamp: metav1.Time{ sample.Timestamp.Time(), }, @@ -76,7 +77,7 @@ func (c *metricConverter) convertLabels(inLabels model.Metric) map[string]string return outLabels } -func (c *metricConverter) convertVector(queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { +func (c *metricConverter) convertVector(info provider.ExternalMetricInfo, queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { if queryResult.Type != model.ValVector { return nil, errors.New("incorrect query result type") } @@ -98,7 +99,7 @@ func (c *metricConverter) convertVector(queryResult prom.QueryResult) (*external } for _, val := range toConvert { - singleMetric, err := c.convertSample(val) + singleMetric, err := c.convertSample(info, val) if err != nil { return nil, fmt.Errorf("unable to convert vector: %v", err) @@ -113,7 +114,7 @@ func (c *metricConverter) convertVector(queryResult prom.QueryResult) (*external return &metricValueList, nil } -func (c *metricConverter) convertScalar(queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { +func (c *metricConverter) convertScalar(info provider.ExternalMetricInfo, queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) { if queryResult.Type != model.ValScalar { return nil, errors.New("scalarConverter can only convert scalar query results") } @@ -127,6 +128,7 @@ func (c *metricConverter) convertScalar(queryResult prom.QueryResult) (*external result := external_metrics.ExternalMetricValueList{ Items: []external_metrics.ExternalMetricValue{ { + MetricName: info.Metric, Timestamp: metav1.Time{ toConvert.Timestamp.Time(), }, diff --git a/pkg/external-provider/provider.go b/pkg/external-provider/provider.go index e00d4237..44d004c6 100644 --- a/pkg/external-provider/provider.go +++ b/pkg/external-provider/provider.go @@ -59,7 +59,7 @@ func (p *externalPrometheusProvider) GetExternalMetric(namespace string, metricS // don't leak implementation details to the user return nil, apierr.NewInternalError(fmt.Errorf("unable to fetch metrics")) } - return p.metricConverter.Convert(queryResults) + return p.metricConverter.Convert(info, queryResults) } func (p *externalPrometheusProvider) ListAllExternalMetrics() []provider.ExternalMetricInfo { From 2374cef64192f5a5b3934717aaaf583959f21dea Mon Sep 17 00:00:00 2001 From: paulfantom Date: Fri, 17 May 2019 14:36:02 +0200 Subject: [PATCH 2/2] pkg/naming: fix unit test --- pkg/naming/metrics_query_test.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pkg/naming/metrics_query_test.go b/pkg/naming/metrics_query_test.go index 9a66df0f..1970d8c3 100644 --- a/pkg/naming/metrics_query_test.go +++ b/pkg/naming/metrics_query_test.go @@ -341,17 +341,16 @@ func TestBuildExternalSelector(t *testing.T) { ), }, { - name: "multiple LabelValuesByName", + name: "single LabelValuesByName with multiple selectors", mq: mustNewQuery(`<<.LabelValuesByName>>`, false), metricSelector: labels.NewSelector().Add( - *mustNewLabelRequirement("foo", selection.Equals, []string{"bar"}), - *mustNewLabelRequirement("qux", selection.In, []string{"bar", "baz"}), + *mustNewLabelRequirement("foo", selection.In, []string{"bar", "baz"}), ), check: checks( hasError(nil), - hasSelector("map[foo:bar qux:bar|baz]"), + hasSelector("map[foo:bar|baz]"), ), }, }