github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/sinks/opentsdb/driver_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 opentsdb 16 17 import ( 18 "fmt" 19 "net/url" 20 "testing" 21 "time" 22 23 opentsdb "github.com/bluebreezecf/opentsdb-goclient/client" 24 "github.com/stretchr/testify/assert" 25 "k8s.io/heapster/metrics/core" 26 ) 27 28 var ( 29 fakeOpenTSDBHost = "192.168.1.8:823" 30 fakeNodeIp = "192.168.1.23" 31 fakePodName = "redis-test" 32 fakePodUid = "redis-test-uid" 33 fakeClusterName = "fakeClusterName" 34 fakeLabel = map[string]string{ 35 "name": "redis", 36 "io.kubernetes.pod.name": "default/redis-test", 37 "pod_id": fakePodUid, 38 "pod_name": fakePodName, 39 "container_name": "redis", 40 "container_base_image": "kubernetes/redis:v1", 41 "namespace_id": "namespace-test-uid", 42 "host_id": fakeNodeIp, 43 } 44 errorPingFailed = fmt.Errorf("Failed to connect the target opentsdb.") 45 errorPutFailed = fmt.Errorf("The target opentsdb gets error and failed to store the datapoints.") 46 ) 47 48 type fakeOpenTSDBClient struct { 49 successfulPing bool 50 successfulPut bool 51 receivedDataPoints []opentsdb.DataPoint 52 } 53 54 func (client *fakeOpenTSDBClient) Ping() error { 55 if client.successfulPing { 56 return nil 57 } 58 return errorPingFailed 59 } 60 61 func (client *fakeOpenTSDBClient) Put(datapoints []opentsdb.DataPoint, queryParam string) (*opentsdb.PutResponse, error) { 62 if !client.successfulPut { 63 return nil, errorPutFailed 64 } 65 client.receivedDataPoints = append(client.receivedDataPoints, datapoints...) 66 putRes := opentsdb.PutResponse{ 67 StatusCode: 200, 68 Failed: 0, 69 Success: int64(len(datapoints)), 70 } 71 return &putRes, nil 72 } 73 74 type fakeOpenTSDBSink struct { 75 *openTSDBSink 76 fakeClient *fakeOpenTSDBClient 77 } 78 79 func NewFakeOpenTSDBSink(successfulPing, successfulPut bool) fakeOpenTSDBSink { 80 client := &fakeOpenTSDBClient{ 81 successfulPing: successfulPing, 82 successfulPut: successfulPut, 83 } 84 return fakeOpenTSDBSink{ 85 &openTSDBSink{ 86 client: client, 87 clusterName: fakeClusterName, 88 }, 89 client, 90 } 91 } 92 93 func TestStoreTimeseriesEmptyInput(t *testing.T) { 94 fakeSink := NewFakeOpenTSDBSink(true, true) 95 db := core.DataBatch{} 96 fakeSink.ExportData(&db) 97 assert.Equal(t, 0, len(fakeSink.fakeClient.receivedDataPoints)) 98 } 99 100 func TestStoreTimeseriesWithPingFailed(t *testing.T) { 101 fakeSink := NewFakeOpenTSDBSink(false, true) 102 batch := generateFakeBatch() 103 fakeSink.ExportData(batch) 104 assert.Equal(t, 0, len(fakeSink.fakeClient.receivedDataPoints)) 105 } 106 107 func TestStoreTimeseriesWithPutFailed(t *testing.T) { 108 fakeSink := NewFakeOpenTSDBSink(true, false) 109 batch := generateFakeBatch() 110 fakeSink.ExportData(batch) 111 assert.Equal(t, 0, len(fakeSink.fakeClient.receivedDataPoints)) 112 } 113 114 func TestStoreTimeseriesSingleTimeserieInput(t *testing.T) { 115 fakeSink := NewFakeOpenTSDBSink(true, true) 116 batch := core.DataBatch{ 117 Timestamp: time.Now(), 118 MetricSets: map[string]*core.MetricSet{}, 119 } 120 seriesName := "cpu/limit" 121 batch.MetricSets["m1"] = generateMetricSet(seriesName, core.MetricGauge, 1000) 122 batch.MetricSets["m1"].Labels = map[string]string{} 123 fakeSink.ExportData(&batch) 124 assert.Equal(t, 1, len(fakeSink.fakeClient.receivedDataPoints)) 125 assert.Equal(t, "cpu_limit_gauge", fakeSink.fakeClient.receivedDataPoints[0].Metric) 126 //make sure at least one tag is set 127 assert.Equal(t, 1, len(fakeSink.fakeClient.receivedDataPoints[0].Tags)) 128 assert.Equal(t, fakeClusterName, fakeSink.fakeClient.receivedDataPoints[0].Tags[clusterNameTagName]) 129 } 130 131 func TestStoreTimeseriesMultipleTimeseriesInput(t *testing.T) { 132 fakeSink := NewFakeOpenTSDBSink(true, true) 133 batch := generateFakeBatch() 134 fakeSink.ExportData(batch) 135 assert.Equal(t, len(batch.MetricSets), len(fakeSink.fakeClient.receivedDataPoints)) 136 } 137 func TestName(t *testing.T) { 138 fakeSink := NewFakeOpenTSDBSink(true, true) 139 name := fakeSink.Name() 140 assert.Equal(t, name, opentsdbSinkName) 141 } 142 143 func TestCreateOpenTSDBSinkWithDefaultValues(t *testing.T) { 144 sink, err := CreateOpenTSDBSink(&url.URL{}) 145 146 if v, ok := sink.(*openTSDBSink); ok { 147 assert.NoError(t, err) 148 assert.Equal(t, defaultClusterName, v.clusterName) 149 assert.Equal(t, defaultOpentsdbHost, v.host) 150 } else { 151 t.FailNow() 152 } 153 } 154 155 func TestCreateOpenTSDBSinkWithCustomValues(t *testing.T) { 156 customClusterName := "customCluster" 157 fakeOpentsdbHost := "192.168.8.23:4242" 158 159 sink, err := CreateOpenTSDBSink(&url.URL{Host: fakeOpentsdbHost, RawQuery: "cluster=" + customClusterName}) 160 161 if v, ok := sink.(*openTSDBSink); ok { 162 assert.NoError(t, err) 163 assert.Equal(t, customClusterName, v.clusterName) 164 assert.Equal(t, fakeOpentsdbHost, v.host) 165 } else { 166 t.FailNow() 167 } 168 } 169 170 func generateFakeBatch() *core.DataBatch { 171 batch := core.DataBatch{ 172 Timestamp: time.Now(), 173 MetricSets: map[string]*core.MetricSet{}, 174 } 175 176 batch.MetricSets["m1"] = generateMetricSet("cpu/limit", core.MetricGauge, 1000) 177 batch.MetricSets["m2"] = generateMetricSet("cpu/usage", core.MetricCumulative, 43363664) 178 batch.MetricSets["m3"] = generateMetricSet("filesystem/limit", core.MetricGauge, 42241163264) 179 batch.MetricSets["m4"] = generateMetricSet("filesystem/usage", core.MetricGauge, 32768) 180 batch.MetricSets["m5"] = generateMetricSet("memory/limit", core.MetricGauge, -1) 181 batch.MetricSets["m6"] = generateMetricSet("memory/usage", core.MetricGauge, 487424) 182 batch.MetricSets["m7"] = generateMetricSet("memory/working_set", core.MetricGauge, 491520) 183 batch.MetricSets["m8"] = generateMetricSet("uptime", core.MetricCumulative, 910823) 184 return &batch 185 } 186 187 func generateMetricSet(name string, metricType core.MetricType, value int64) *core.MetricSet { 188 return &core.MetricSet{ 189 Labels: fakeLabel, 190 MetricValues: map[string]core.MetricValue{ 191 name: { 192 MetricType: metricType, 193 ValueType: core.ValueInt64, 194 IntValue: value, 195 }, 196 }, 197 } 198 }