github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/api/v1/api_test.go (about) 1 // Copyright 2015 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package v1 16 17 import ( 18 "testing" 19 "time" 20 21 fuzz "github.com/google/gofuzz" 22 "github.com/stretchr/testify/assert" 23 "github.com/stretchr/testify/require" 24 25 "k8s.io/heapster/metrics/api/v1/types" 26 "k8s.io/heapster/metrics/core" 27 metricsink "k8s.io/heapster/metrics/sinks/metric" 28 ) 29 30 func TestApiFactory(t *testing.T) { 31 metricSink := metricsink.MetricSink{} 32 api := NewApi(false, &metricSink, nil, false) 33 as := assert.New(t) 34 for _, metric := range core.StandardMetrics { 35 val, exists := api.gkeMetrics[metric.Name] 36 as.True(exists) 37 as.Equal(val, metric.MetricDescriptor) 38 } 39 for _, metric := range core.LabeledMetrics { 40 val, exists := api.gkeMetrics[metric.Name] 41 as.True(exists) 42 as.Equal(val, metric.MetricDescriptor) 43 } 44 45 for _, metric := range core.LabeledMetrics { 46 val, exists := api.gkeMetrics[metric.Name] 47 as.True(exists) 48 as.Equal(val, metric.MetricDescriptor) 49 } 50 labels := append(core.CommonLabels(), core.ContainerLabels()...) 51 labels = append(labels, core.PodLabels()...) 52 for _, label := range labels { 53 val, exists := api.gkeLabels[label.Key] 54 as.True(exists) 55 as.Equal(val, label) 56 } 57 } 58 59 func TestFuzzInput(t *testing.T) { 60 api := NewApi(false, nil, nil, false) 61 data := []*core.DataBatch{} 62 fuzz.New().NilChance(0).Fuzz(&data) 63 _ = api.processMetricsRequest(data) 64 } 65 66 func generateMetricSet(objectType string, labels []core.LabelDescriptor) *core.MetricSet { 67 ms := &core.MetricSet{ 68 CollectionStartTime: time.Now().Add(-time.Hour), 69 ScrapeTime: time.Now(), 70 Labels: make(map[string]string), 71 MetricValues: make(map[string]core.MetricValue), 72 LabeledMetrics: make([]core.LabeledMetric, len(labels)), 73 } 74 // Add all necessary labels 75 for _, label := range labels { 76 ms.Labels[label.Key] = "test-value" 77 } 78 ms.Labels[core.LabelMetricSetType.Key] = objectType 79 // Add all standard metrics 80 for _, metric := range core.StandardMetrics { 81 ms.MetricValues[metric.Name] = core.MetricValue{ 82 MetricType: core.MetricCumulative, 83 ValueType: core.ValueInt64, 84 IntValue: -1, 85 } 86 } 87 // Add all labeled metrics 88 for _, metric := range core.LabeledMetrics { 89 lm := core.LabeledMetric{ 90 Name: metric.Name, 91 MetricValue: core.MetricValue{ 92 MetricType: core.MetricCumulative, 93 ValueType: core.ValueInt64, 94 IntValue: -1, 95 }, 96 Labels: make(map[string]string), 97 } 98 for _, label := range core.MetricLabels() { 99 lm.Labels[label.Key] = "test-value" 100 } 101 ms.LabeledMetrics = append(ms.LabeledMetrics, lm) 102 } 103 return ms 104 } 105 106 func generateDataBatch() ([]*core.DataBatch, []core.LabelDescriptor) { 107 dataBatch := []*core.DataBatch{ 108 { 109 Timestamp: time.Now(), 110 MetricSets: map[string]*core.MetricSet{}, 111 }, 112 { 113 Timestamp: time.Now().Add(-time.Minute), 114 MetricSets: map[string]*core.MetricSet{}, 115 }, 116 } 117 labels := append(core.CommonLabels(), core.ContainerLabels()...) 118 labels = append(labels, core.PodLabels()...) 119 for _, entry := range dataBatch { 120 // Add a pod, container, node, systemcontainer 121 entry.MetricSets[core.MetricSetTypePod] = generateMetricSet(core.MetricSetTypePod, labels) 122 entry.MetricSets[core.MetricSetTypeNode] = generateMetricSet(core.MetricSetTypeNode, labels) 123 entry.MetricSets[core.MetricSetTypePodContainer] = generateMetricSet(core.MetricSetTypePodContainer, labels) 124 entry.MetricSets[core.MetricSetTypeSystemContainer] = generateMetricSet(core.MetricSetTypeSystemContainer, labels) 125 } 126 return dataBatch, labels 127 } 128 129 func generateMetricSink() *metricsink.MetricSink { 130 batches, _ := generateDataBatch() 131 metricSink := &metricsink.MetricSink{} 132 for _, batch := range batches { 133 metricSink.ExportData(batch) 134 } 135 return metricSink 136 } 137 138 func TestDisabledExportTrue(t *testing.T) { 139 metricSink := generateMetricSink() 140 api := NewApi(false, metricSink, nil, true) 141 ts := api.getMetricsResponse() 142 assert.Equal(t, make([]*types.Timeseries, 0), ts, "Should get 0 timeseries, %v found", len(ts)) 143 } 144 145 func TestDisabledExportFalse(t *testing.T) { 146 metricSink := generateMetricSink() 147 api := NewApi(false, metricSink, nil, false) 148 ts := api.getMetricsResponse() 149 assert.Equal(t, 4, len(ts), "Should get 4 timeseries, %v found", len(ts)) 150 } 151 152 func TestRealInput(t *testing.T) { 153 api := NewApi(false, nil, nil, false) 154 dataBatch, labels := generateDataBatch() 155 ts := api.processMetricsRequest(dataBatch) 156 type expectation struct { 157 count int 158 extraLabels bool 159 } 160 expectedMetrics := make(map[string]*expectation) 161 for _, metric := range core.StandardMetrics { 162 expectedMetrics[metric.Name] = &expectation{ 163 count: 4, 164 extraLabels: false, 165 } 166 } 167 for _, metric := range core.LabeledMetrics { 168 expectedMetrics[metric.Name] = &expectation{ 169 count: 4, 170 extraLabels: true, 171 } 172 } 173 as := assert.New(t) 174 for _, elem := range ts { 175 // validate labels 176 for _, label := range labels { 177 val, exists := elem.Labels[label.Key] 178 as.True(exists, "%q label does not exist", label.Key) 179 if label.Key == core.LabelMetricSetType.Key { 180 continue 181 } 182 if label.Key == core.LabelContainerName.Key && val != "machine" && val != "/pod" { 183 as.Equal(val, "test-value", "%q label's value is %q, expected 'test-value'", label.Key, val) 184 } 185 } 186 for mname, points := range elem.Metrics { 187 ex := expectedMetrics[mname] 188 require.NotNil(t, ex) 189 as.NotEqual(ex, 0) 190 ex.count-- 191 for _, point := range points { 192 as.Equal(point.Value, int64(-1)) 193 if !ex.extraLabels { 194 continue 195 } 196 as.Equal(len(core.MetricLabels()), len(point.Labels)) 197 for _, label := range core.MetricLabels() { 198 val, exists := point.Labels[label.Key] 199 as.True(exists, "expected label %q to be found - %+v", label.Key, point.Labels) 200 as.Equal(val, "test-value") 201 } 202 } 203 } 204 205 } 206 }