github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/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/core" 26 metricsink "k8s.io/heapster/metrics/sinks/metric" 27 ) 28 29 func TestApiFactory(t *testing.T) { 30 metricSink := metricsink.MetricSink{} 31 api := NewApi(false, &metricSink) 32 as := assert.New(t) 33 for _, metric := range core.StandardMetrics { 34 val, exists := api.gkeMetrics[metric.Name] 35 as.True(exists) 36 as.Equal(val, metric.MetricDescriptor) 37 } 38 for _, metric := range core.LabeledMetrics { 39 val, exists := api.gkeMetrics[metric.Name] 40 as.True(exists) 41 as.Equal(val, metric.MetricDescriptor) 42 } 43 44 for _, metric := range core.LabeledMetrics { 45 val, exists := api.gkeMetrics[metric.Name] 46 as.True(exists) 47 as.Equal(val, metric.MetricDescriptor) 48 } 49 labels := append(core.CommonLabels(), core.ContainerLabels()...) 50 labels = append(labels, core.PodLabels()...) 51 for _, label := range labels { 52 val, exists := api.gkeLabels[label.Key] 53 as.True(exists) 54 as.Equal(val, label) 55 } 56 } 57 58 func TestFuzzInput(t *testing.T) { 59 api := NewApi(false, nil) 60 data := []*core.DataBatch{} 61 fuzz.New().NilChance(0).Fuzz(&data) 62 _ = api.processMetricsRequest(data) 63 } 64 65 func generateMetricSet(objectType string, labels []core.LabelDescriptor) *core.MetricSet { 66 ms := &core.MetricSet{ 67 CreateTime: time.Now().Add(-time.Hour), 68 ScrapeTime: time.Now(), 69 Labels: make(map[string]string), 70 MetricValues: make(map[string]core.MetricValue), 71 LabeledMetrics: make([]core.LabeledMetric, len(labels)), 72 } 73 // Add all necessary labels 74 for _, label := range labels { 75 ms.Labels[label.Key] = "test-value" 76 } 77 ms.Labels[core.LabelMetricSetType.Key] = objectType 78 // Add all standard metrics 79 for _, metric := range core.StandardMetrics { 80 ms.MetricValues[metric.Name] = core.MetricValue{ 81 MetricType: core.MetricCumulative, 82 ValueType: core.ValueInt64, 83 IntValue: -1, 84 } 85 } 86 // Add all labeled metrics 87 for _, metric := range core.LabeledMetrics { 88 lm := core.LabeledMetric{ 89 Name: metric.Name, 90 MetricValue: core.MetricValue{ 91 MetricType: core.MetricCumulative, 92 ValueType: core.ValueInt64, 93 IntValue: -1, 94 }, 95 Labels: make(map[string]string), 96 } 97 for _, label := range core.MetricLabels() { 98 lm.Labels[label.Key] = "test-value" 99 } 100 ms.LabeledMetrics = append(ms.LabeledMetrics, lm) 101 } 102 return ms 103 } 104 105 func TestRealInput(t *testing.T) { 106 api := NewApi(false, nil) 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 ts := api.processMetricsRequest(dataBatch) 127 type expectation struct { 128 count int 129 extraLabels bool 130 } 131 expectedMetrics := make(map[string]*expectation) 132 for _, metric := range core.StandardMetrics { 133 expectedMetrics[metric.Name] = &expectation{ 134 count: 4, 135 extraLabels: false, 136 } 137 } 138 for _, metric := range core.LabeledMetrics { 139 expectedMetrics[metric.Name] = &expectation{ 140 count: 4, 141 extraLabels: true, 142 } 143 } 144 as := assert.New(t) 145 for _, elem := range ts { 146 // validate labels 147 for _, label := range labels { 148 val, exists := elem.Labels[label.Key] 149 as.True(exists, "%q label does not exist", label.Key) 150 if label.Key == core.LabelMetricSetType.Key { 151 continue 152 } 153 if label.Key == core.LabelContainerName.Key && val != "machine" && val != "/pod" { 154 as.Equal(val, "test-value", "%q label's value is %q, expected 'test-value'", label.Key, val) 155 } 156 } 157 for mname, points := range elem.Metrics { 158 ex := expectedMetrics[mname] 159 require.NotNil(t, ex) 160 as.NotEqual(ex, 0) 161 ex.count-- 162 for _, point := range points { 163 as.Equal(point.Value, -1) 164 if !ex.extraLabels { 165 continue 166 } 167 as.Equal(len(core.MetricLabels()), len(point.Labels)) 168 for _, label := range core.MetricLabels() { 169 val, exists := point.Labels[label.Key] 170 as.True(exists, "expected label %q to be found - %+v", label.Key, point.Labels) 171 as.Equal(val, "test-value") 172 } 173 } 174 } 175 176 } 177 }