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  }