Skip to content

Commit a822007

Browse files
authored
Merge pull request kubernetes#84283 from serathius/remove-prometheus-test-integration
Remove prometheus references in test/integration
2 parents badcd4a + 09329b5 commit a822007

File tree

18 files changed

+231
-435
lines changed

18 files changed

+231
-435
lines changed

staging/src/k8s.io/component-base/metrics/testutil/BUILD

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
22

33
go_library(
44
name = "go_default_library",
5-
srcs = ["testutil.go"],
5+
srcs = [
6+
"metrics.go",
7+
"testutil.go",
8+
],
69
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/testutil",
710
importpath = "k8s.io/component-base/metrics/testutil",
811
visibility = ["//visibility:public"],
912
deps = [
1013
"//staging/src/k8s.io/component-base/metrics:go_default_library",
1114
"//vendor/github.com/prometheus/client_golang/prometheus/testutil:go_default_library",
15+
"//vendor/github.com/prometheus/common/expfmt:go_default_library",
16+
"//vendor/github.com/prometheus/common/model:go_default_library",
1217
],
1318
)
1419

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package testutil
18+
19+
import (
20+
"fmt"
21+
"io"
22+
"reflect"
23+
"strings"
24+
25+
"github.com/prometheus/common/expfmt"
26+
"github.com/prometheus/common/model"
27+
)
28+
29+
var (
30+
// MetricNameLabel is label under which model.Sample stores metric name
31+
MetricNameLabel model.LabelName = model.MetricNameLabel
32+
// QuantileLabel is label under which model.Sample stores latency quantile value
33+
QuantileLabel model.LabelName = model.QuantileLabel
34+
)
35+
36+
// Metrics is generic metrics for other specific metrics
37+
type Metrics map[string]model.Samples
38+
39+
// Equal returns true if all metrics are the same as the arguments.
40+
func (m *Metrics) Equal(o Metrics) bool {
41+
leftKeySet := []string{}
42+
rightKeySet := []string{}
43+
for k := range *m {
44+
leftKeySet = append(leftKeySet, k)
45+
}
46+
for k := range o {
47+
rightKeySet = append(rightKeySet, k)
48+
}
49+
if !reflect.DeepEqual(leftKeySet, rightKeySet) {
50+
return false
51+
}
52+
for _, k := range leftKeySet {
53+
if !(*m)[k].Equal(o[k]) {
54+
return false
55+
}
56+
}
57+
return true
58+
}
59+
60+
// NewMetrics returns new metrics which are initialized.
61+
func NewMetrics() Metrics {
62+
result := make(Metrics)
63+
return result
64+
}
65+
66+
// ParseMetrics parses Metrics from data returned from prometheus endpoint
67+
func ParseMetrics(data string, output *Metrics) error {
68+
dec := expfmt.NewDecoder(strings.NewReader(data), expfmt.FmtText)
69+
decoder := expfmt.SampleDecoder{
70+
Dec: dec,
71+
Opts: &expfmt.DecodeOptions{},
72+
}
73+
74+
for {
75+
var v model.Vector
76+
if err := decoder.Decode(&v); err != nil {
77+
if err == io.EOF {
78+
// Expected loop termination condition.
79+
return nil
80+
}
81+
continue
82+
}
83+
for _, metric := range v {
84+
name := string(metric.Metric[model.MetricNameLabel])
85+
(*output)[name] = append((*output)[name], metric)
86+
}
87+
}
88+
}
89+
90+
// ExtractMetricSamples parses the prometheus metric samples from the input string.
91+
func ExtractMetricSamples(metricsBlob string) ([]*model.Sample, error) {
92+
dec := expfmt.NewDecoder(strings.NewReader(metricsBlob), expfmt.FmtText)
93+
decoder := expfmt.SampleDecoder{
94+
Dec: dec,
95+
Opts: &expfmt.DecodeOptions{},
96+
}
97+
98+
var samples []*model.Sample
99+
for {
100+
var v model.Vector
101+
if err := decoder.Decode(&v); err != nil {
102+
if err == io.EOF {
103+
// Expected loop termination condition.
104+
return samples, nil
105+
}
106+
return nil, err
107+
}
108+
samples = append(samples, v...)
109+
}
110+
}
111+
112+
// PrintSample returns formated representation of metric Sample
113+
func PrintSample(sample *model.Sample) string {
114+
buf := make([]string, 0)
115+
// Id is a VERY special label. For 'normal' container it's useless, but it's necessary
116+
// for 'system' containers (e.g. /docker-daemon, /kubelet, etc.). We know if that's the
117+
// case by checking if there's a label "kubernetes_container_name" present. It's hacky
118+
// but it works...
119+
_, normalContainer := sample.Metric["kubernetes_container_name"]
120+
for k, v := range sample.Metric {
121+
if strings.HasPrefix(string(k), "__") {
122+
continue
123+
}
124+
125+
if string(k) == "id" && normalContainer {
126+
continue
127+
}
128+
buf = append(buf, fmt.Sprintf("%v=%v", string(k), v))
129+
}
130+
return fmt.Sprintf("[%v] = %v", strings.Join(buf, ","), sample.Value)
131+
}
132+
133+
// ComputeHistogramDelta computes the change in histogram metric for a selected label.
134+
// Results are stored in after samples
135+
func ComputeHistogramDelta(before, after model.Samples, label model.LabelName) {
136+
beforeSamplesMap := make(map[string]*model.Sample)
137+
for _, bSample := range before {
138+
beforeSamplesMap[makeKey(bSample.Metric[label], bSample.Metric["le"])] = bSample
139+
}
140+
for _, aSample := range after {
141+
if bSample, found := beforeSamplesMap[makeKey(aSample.Metric[label], aSample.Metric["le"])]; found {
142+
aSample.Value = aSample.Value - bSample.Value
143+
}
144+
}
145+
}
146+
147+
func makeKey(a, b model.LabelValue) string {
148+
return string(a) + "___" + string(b)
149+
}

test/e2e/framework/metrics/BUILD

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ go_library(
1313
"cluster_autoscaler_metrics.go",
1414
"controller_manager_metrics.go",
1515
"e2e_metrics.go",
16-
"etcd.go",
17-
"generic_metrics.go",
1816
"interesting_metrics.go",
1917
"kubelet_metrics.go",
2018
"latencies.go",
@@ -34,13 +32,12 @@ go_library(
3432
"//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library",
3533
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
3634
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
35+
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
3736
"//test/e2e/framework/log:go_default_library",
3837
"//test/e2e/framework/ssh:go_default_library",
3938
"//test/e2e/perftype:go_default_library",
4039
"//test/e2e/system:go_default_library",
4140
"//vendor/github.com/onsi/gomega:go_default_library",
42-
"//vendor/github.com/prometheus/common/expfmt:go_default_library",
43-
"//vendor/github.com/prometheus/common/model:go_default_library",
4441
"//vendor/k8s.io/klog:go_default_library",
4542
],
4643
)

test/e2e/framework/metrics/api_server_metrics.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,24 @@ limitations under the License.
1616

1717
package metrics
1818

19+
import "k8s.io/component-base/metrics/testutil"
20+
1921
// APIServerMetrics is metrics for API server
20-
type APIServerMetrics Metrics
22+
type APIServerMetrics testutil.Metrics
2123

2224
// Equal returns true if all metrics are the same as the arguments.
2325
func (m *APIServerMetrics) Equal(o APIServerMetrics) bool {
24-
return (*Metrics)(m).Equal(Metrics(o))
26+
return (*testutil.Metrics)(m).Equal(testutil.Metrics(o))
2527
}
2628

2729
func newAPIServerMetrics() APIServerMetrics {
28-
result := NewMetrics()
30+
result := testutil.NewMetrics()
2931
return APIServerMetrics(result)
3032
}
3133

3234
func parseAPIServerMetrics(data string) (APIServerMetrics, error) {
3335
result := newAPIServerMetrics()
34-
if err := parseMetrics(data, (*Metrics)(&result)); err != nil {
36+
if err := testutil.ParseMetrics(data, (*testutil.Metrics)(&result)); err != nil {
3537
return APIServerMetrics{}, err
3638
}
3739
return result, nil

test/e2e/framework/metrics/cluster_autoscaler_metrics.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,24 @@ limitations under the License.
1616

1717
package metrics
1818

19+
import "k8s.io/component-base/metrics/testutil"
20+
1921
// ClusterAutoscalerMetrics is metrics for cluster autoscaler
20-
type ClusterAutoscalerMetrics Metrics
22+
type ClusterAutoscalerMetrics testutil.Metrics
2123

2224
// Equal returns true if all metrics are the same as the arguments.
2325
func (m *ClusterAutoscalerMetrics) Equal(o ClusterAutoscalerMetrics) bool {
24-
return (*Metrics)(m).Equal(Metrics(o))
26+
return (*testutil.Metrics)(m).Equal(testutil.Metrics(o))
2527
}
2628

2729
func newClusterAutoscalerMetrics() ClusterAutoscalerMetrics {
28-
result := NewMetrics()
30+
result := testutil.NewMetrics()
2931
return ClusterAutoscalerMetrics(result)
3032
}
3133

3234
func parseClusterAutoscalerMetrics(data string) (ClusterAutoscalerMetrics, error) {
3335
result := newClusterAutoscalerMetrics()
34-
if err := parseMetrics(data, (*Metrics)(&result)); err != nil {
36+
if err := testutil.ParseMetrics(data, (*testutil.Metrics)(&result)); err != nil {
3537
return ClusterAutoscalerMetrics{}, err
3638
}
3739
return result, nil

test/e2e/framework/metrics/controller_manager_metrics.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,24 @@ limitations under the License.
1616

1717
package metrics
1818

19+
import "k8s.io/component-base/metrics/testutil"
20+
1921
// ControllerManagerMetrics is metrics for controller manager
20-
type ControllerManagerMetrics Metrics
22+
type ControllerManagerMetrics testutil.Metrics
2123

2224
// Equal returns true if all metrics are the same as the arguments.
2325
func (m *ControllerManagerMetrics) Equal(o ControllerManagerMetrics) bool {
24-
return (*Metrics)(m).Equal(Metrics(o))
26+
return (*testutil.Metrics)(m).Equal(testutil.Metrics(o))
2527
}
2628

2729
func newControllerManagerMetrics() ControllerManagerMetrics {
28-
result := NewMetrics()
30+
result := testutil.NewMetrics()
2931
return ControllerManagerMetrics(result)
3032
}
3133

3234
func parseControllerManagerMetrics(data string) (ControllerManagerMetrics, error) {
3335
result := newControllerManagerMetrics()
34-
if err := parseMetrics(data, (*Metrics)(&result)); err != nil {
36+
if err := testutil.ParseMetrics(data, (*testutil.Metrics)(&result)); err != nil {
3537
return ControllerManagerMetrics{}, err
3638
}
3739
return result, nil

test/e2e/framework/metrics/e2e_metrics.go

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ import (
2020
"bytes"
2121
"encoding/json"
2222
"fmt"
23-
"strings"
24-
25-
"github.com/prometheus/common/model"
2623

24+
"k8s.io/component-base/metrics/testutil"
2725
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
2826
)
2927

@@ -57,53 +55,33 @@ func (m *ComponentCollection) filterMetrics() {
5755
(*m).KubeletMetrics = kubeletMetrics
5856
}
5957

60-
func printSample(sample *model.Sample) string {
61-
buf := make([]string, 0)
62-
// Id is a VERY special label. For 'normal' container it's useless, but it's necessary
63-
// for 'system' containers (e.g. /docker-daemon, /kubelet, etc.). We know if that's the
64-
// case by checking if there's a label "kubernetes_container_name" present. It's hacky
65-
// but it works...
66-
_, normalContainer := sample.Metric["kubernetes_container_name"]
67-
for k, v := range sample.Metric {
68-
if strings.HasPrefix(string(k), "__") {
69-
continue
70-
}
71-
72-
if string(k) == "id" && normalContainer {
73-
continue
74-
}
75-
buf = append(buf, fmt.Sprintf("%v=%v", string(k), v))
76-
}
77-
return fmt.Sprintf("[%v] = %v", strings.Join(buf, ","), sample.Value)
78-
}
79-
8058
// PrintHumanReadable returns e2e metrics with JSON format.
8159
func (m *ComponentCollection) PrintHumanReadable() string {
8260
buf := bytes.Buffer{}
8361
for _, interestingMetric := range interestingAPIServerMetrics {
8462
buf.WriteString(fmt.Sprintf("For %v:\n", interestingMetric))
8563
for _, sample := range (*m).APIServerMetrics[interestingMetric] {
86-
buf.WriteString(fmt.Sprintf("\t%v\n", printSample(sample)))
64+
buf.WriteString(fmt.Sprintf("\t%v\n", testutil.PrintSample(sample)))
8765
}
8866
}
8967
for _, interestingMetric := range interestingControllerManagerMetrics {
9068
buf.WriteString(fmt.Sprintf("For %v:\n", interestingMetric))
9169
for _, sample := range (*m).ControllerManagerMetrics[interestingMetric] {
92-
buf.WriteString(fmt.Sprintf("\t%v\n", printSample(sample)))
70+
buf.WriteString(fmt.Sprintf("\t%v\n", testutil.PrintSample(sample)))
9371
}
9472
}
9573
for _, interestingMetric := range interestingClusterAutoscalerMetrics {
9674
buf.WriteString(fmt.Sprintf("For %v:\n", interestingMetric))
9775
for _, sample := range (*m).ClusterAutoscalerMetrics[interestingMetric] {
98-
buf.WriteString(fmt.Sprintf("\t%v\n", printSample(sample)))
76+
buf.WriteString(fmt.Sprintf("\t%v\n", testutil.PrintSample(sample)))
9977
}
10078
}
10179
for kubelet, grabbed := range (*m).KubeletMetrics {
10280
buf.WriteString(fmt.Sprintf("For %v:\n", kubelet))
10381
for _, interestingMetric := range interestingKubeletMetrics {
10482
buf.WriteString(fmt.Sprintf("\tFor %v:\n", interestingMetric))
10583
for _, sample := range grabbed[interestingMetric] {
106-
buf.WriteString(fmt.Sprintf("\t\t%v\n", printSample(sample)))
84+
buf.WriteString(fmt.Sprintf("\t\t%v\n", testutil.PrintSample(sample)))
10785
}
10886
}
10987
}
@@ -138,25 +116,12 @@ func (m *ComponentCollection) SummaryKind() string {
138116
return "ComponentCollection"
139117
}
140118

141-
func makeKey(a, b model.LabelValue) string {
142-
return string(a) + "___" + string(b)
143-
}
144-
145119
// ComputeClusterAutoscalerMetricsDelta computes the change in cluster
146120
// autoscaler metrics.
147121
func (m *ComponentCollection) ComputeClusterAutoscalerMetricsDelta(before Collection) {
148122
if beforeSamples, found := before.ClusterAutoscalerMetrics[caFunctionMetric]; found {
149123
if afterSamples, found := m.ClusterAutoscalerMetrics[caFunctionMetric]; found {
150-
beforeSamplesMap := make(map[string]*model.Sample)
151-
for _, bSample := range beforeSamples {
152-
beforeSamplesMap[makeKey(bSample.Metric[caFunctionMetricLabel], bSample.Metric["le"])] = bSample
153-
}
154-
for _, aSample := range afterSamples {
155-
if bSample, found := beforeSamplesMap[makeKey(aSample.Metric[caFunctionMetricLabel], aSample.Metric["le"])]; found {
156-
aSample.Value = aSample.Value - bSample.Value
157-
}
158-
159-
}
124+
testutil.ComputeHistogramDelta(beforeSamples, afterSamples, caFunctionMetricLabel)
160125
}
161126
}
162127
}

0 commit comments

Comments
 (0)