From c040fd431e60d6aeda84f604fa98092cdd1814a6 Mon Sep 17 00:00:00 2001 From: bgpat Date: Thu, 19 Apr 2018 10:04:59 +0900 Subject: [PATCH 1/2] Accept custom label in the metric name --- pkg/custom-provider/metric_namer.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pkg/custom-provider/metric_namer.go b/pkg/custom-provider/metric_namer.go index 90d7cdd5..cda8673e 100644 --- a/pkg/custom-provider/metric_namer.go +++ b/pkg/custom-provider/metric_namer.go @@ -146,6 +146,12 @@ func (r *basicSeriesRegistry) QueryForMetric(metricInfo provider.MetricInfo, nam } resourceLbl := r.namer.labelPrefix + singularResource + var expressions []string + if i := strings.Index(metricInfo.Metric, "{"); i > 1 && metricInfo.Metric[len(metricInfo.Metric)-1] == '}' { + expressions = append(expressions, metricInfo.Metric[i+1:len(metricInfo.Metric)-1]) + metricInfo.Metric = metricInfo.Metric[:i] + } + // TODO: support container metrics if info, found := r.info[metricInfo]; found { targetValue := resourceNames[0] @@ -155,13 +161,12 @@ func (r *basicSeriesRegistry) QueryForMetric(metricInfo provider.MetricInfo, nam matcher = prom.LabelMatches } - var expressions []string if info.isContainer { - expressions = []string{matcher("pod_name", targetValue), prom.LabelNeq("container_name", "POD")} + expressions = append(expressions, matcher("pod_name", targetValue), prom.LabelNeq("container_name", "POD")) groupBy = "pod_name" } else { // TODO: copy base series labels? - expressions = []string{matcher(resourceLbl, targetValue)} + expressions = append(expressions, matcher(resourceLbl, targetValue)) groupBy = resourceLbl } @@ -191,6 +196,10 @@ func (r *basicSeriesRegistry) MatchValuesToNames(metricInfo provider.MetricInfo, } resourceLbl := r.namer.labelPrefix + singularResource + if i := strings.Index(metricInfo.Metric, "{"); i > 1 { + metricInfo.Metric = metricInfo.Metric[:i] + } + if info, found := r.info[metricInfo]; found { res := make(map[string]pmodel.SampleValue, len(values)) for _, val := range values { From 7a5a0595c40f5ce3198493158a3622365c4993ed Mon Sep 17 00:00:00 2001 From: bgpat Date: Thu, 19 Apr 2018 13:44:47 +0900 Subject: [PATCH 2/2] Add test for custom label --- pkg/custom-provider/metric_namer_test.go | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pkg/custom-provider/metric_namer_test.go b/pkg/custom-provider/metric_namer_test.go index c01e25e1..762bb3a0 100644 --- a/pkg/custom-provider/metric_namer_test.go +++ b/pkg/custom-provider/metric_namer_test.go @@ -116,6 +116,18 @@ func TestMetricNamerContainerSeries(t *testing.T) { isContainer: true, }, }, + { + input: prom.Series{ + Name: "container_some_time_seconds_total{status=\"success\"}", + Labels: pmodel.LabelSet{"status": "success", "pod_name": "somepod", "namespace": "somens", "container_name": "somecont"}, + }, + outputMetricName: "some_time", + outputInfo: seriesInfo{ + baseSeries: prom.Series{Name: "container_some_time_seconds_total"}, + kind: SecondsCounterSeries, + isContainer: true, + }, + }, } assert := assert.New(t) @@ -207,6 +219,10 @@ func TestSeriesRegistry(t *testing.T) { Name: "admin_reddit_seconds_total", Labels: pmodel.LabelSet{"kube_admin": "some-admin"}, }, + { + Name: "service_proxy_packets{protocol=\"tcp\"}", + Labels: pmodel.LabelSet{"protocol": "tcp", "kube_service": "somesvc", "kube_namespace": "somens"}, + }, } // set up the registry @@ -335,6 +351,15 @@ func TestSeriesRegistry(t *testing.T) { expectedKind: SecondsCounterSeries, expectedQuery: "node_fan_seconds_total{kube_node=\"somenode\"}", }, + { + title: "namespaced metrics gauge", + info: provider.MetricInfo{schema.GroupResource{Resource: "service"}, true, "service_proxy_packets"}, + namespace: "somens", + resourceNames: []string{"somesvc"}, + + expectedKind: GaugeSeries, + expectedQuery: "service_proxy_packets{kube_service=\"somesvc\",kube_namespace=\"somens\"}", + }, } for _, testCase := range testCases { @@ -370,6 +395,8 @@ func TestSeriesRegistry(t *testing.T) { {schema.GroupResource{Resource: "nodes"}, false, "node_gigawatts"}, {schema.GroupResource{Resource: "persistentvolumes"}, false, "volume_claims"}, {schema.GroupResource{Resource: "nodes"}, false, "node_fan"}, + {schema.GroupResource{Resource: "services"}, true, "service_proxy_packets{protocol=\"tcp\"}"}, + {schema.GroupResource{Resource: "namespaces"}, false, "service_proxy_packets{protocol=\"tcp\"}"}, } // sort both for easy comparison