github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/sinks/kafka/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 kafka 16 17 import ( 18 "encoding/json" 19 "fmt" 20 "testing" 21 "time" 22 23 "github.com/stretchr/testify/assert" 24 "k8s.io/heapster/metrics/core" 25 ) 26 27 type fakeKafkaClient struct { 28 points []KafkaSinkPoint 29 } 30 31 type fakeKafkaSink struct { 32 core.DataSink 33 fakeProducer *fakeKafkaClient 34 } 35 36 func NewFakeKafkaClient() *fakeKafkaClient { 37 return &fakeKafkaClient{[]KafkaSinkPoint{}} 38 } 39 40 func (client *fakeKafkaClient) ProduceKafkaMessage(msgData interface{}) error { 41 if point, ok := msgData.(KafkaSinkPoint); ok { 42 client.points = append(client.points, point) 43 } 44 45 return nil 46 } 47 48 func (client *fakeKafkaClient) Name() string { 49 return "Apache Kafka Sink" 50 } 51 52 func (client *fakeKafkaClient) Stop() { 53 // nothing needs to be done. 54 } 55 56 // Returns a fake kafka sink. 57 func NewFakeSink() fakeKafkaSink { 58 client := NewFakeKafkaClient() 59 return fakeKafkaSink{ 60 &kafkaSink{ 61 KafkaClient: client, 62 }, 63 client, 64 } 65 } 66 67 func TestStoreDataEmptyInput(t *testing.T) { 68 fakeSink := NewFakeSink() 69 dataBatch := core.DataBatch{} 70 fakeSink.ExportData(&dataBatch) 71 assert.Equal(t, 0, len(fakeSink.fakeProducer.points)) 72 } 73 74 func TestStoreMultipleDataInput(t *testing.T) { 75 fakeSink := NewFakeSink() 76 timestamp := time.Now() 77 78 l := make(map[string]string) 79 l["namespace_id"] = "123" 80 l["container_name"] = "/system.slice/-.mount" 81 l[core.LabelPodId.Key] = "aaaa-bbbb-cccc-dddd" 82 83 l2 := make(map[string]string) 84 l2["namespace_id"] = "123" 85 l2["container_name"] = "/system.slice/dbus.service" 86 l2[core.LabelPodId.Key] = "aaaa-bbbb-cccc-dddd" 87 88 l3 := make(map[string]string) 89 l3["namespace_id"] = "123" 90 l3[core.LabelPodId.Key] = "aaaa-bbbb-cccc-dddd" 91 92 l4 := make(map[string]string) 93 l4["namespace_id"] = "" 94 l4[core.LabelPodId.Key] = "aaaa-bbbb-cccc-dddd" 95 96 l5 := make(map[string]string) 97 l5["namespace_id"] = "123" 98 l5[core.LabelPodId.Key] = "aaaa-bbbb-cccc-dddd" 99 100 metricSet1 := core.MetricSet{ 101 Labels: l, 102 MetricValues: map[string]core.MetricValue{ 103 "/system.slice/-.mount//cpu/limit": { 104 ValueType: core.ValueInt64, 105 MetricType: core.MetricCumulative, 106 IntValue: 123456, 107 }, 108 }, 109 } 110 111 metricSet2 := core.MetricSet{ 112 Labels: l2, 113 MetricValues: map[string]core.MetricValue{ 114 "/system.slice/dbus.service//cpu/usage": { 115 ValueType: core.ValueInt64, 116 MetricType: core.MetricCumulative, 117 IntValue: 123456, 118 }, 119 }, 120 } 121 122 metricSet3 := core.MetricSet{ 123 Labels: l3, 124 MetricValues: map[string]core.MetricValue{ 125 "test/metric/1": { 126 ValueType: core.ValueInt64, 127 MetricType: core.MetricCumulative, 128 IntValue: 123456, 129 }, 130 }, 131 } 132 133 metricSet4 := core.MetricSet{ 134 Labels: l4, 135 MetricValues: map[string]core.MetricValue{ 136 "test/metric/1": { 137 ValueType: core.ValueInt64, 138 MetricType: core.MetricCumulative, 139 IntValue: 123456, 140 }, 141 }, 142 } 143 144 metricSet5 := core.MetricSet{ 145 Labels: l5, 146 MetricValues: map[string]core.MetricValue{ 147 "removeme": { 148 ValueType: core.ValueInt64, 149 MetricType: core.MetricCumulative, 150 IntValue: 123456, 151 }, 152 }, 153 } 154 155 data := core.DataBatch{ 156 Timestamp: timestamp, 157 MetricSets: map[string]*core.MetricSet{ 158 "pod1": &metricSet1, 159 "pod2": &metricSet2, 160 "pod3": &metricSet3, 161 "pod4": &metricSet4, 162 "pod5": &metricSet5, 163 }, 164 } 165 166 timeStr, err := timestamp.UTC().MarshalJSON() 167 assert.NoError(t, err) 168 169 fakeSink.ExportData(&data) 170 171 //expect msg string 172 assert.Equal(t, 5, len(fakeSink.fakeProducer.points)) 173 174 var expectMsgTemplate = [5]string{ 175 `{"MetricsName":"/system.slice/-.mount//cpu/limit","MetricsValue":{"value":123456},"MetricsTimestamp":%s,"MetricsTags":{"container_name":"/system.slice/-.mount","namespace_id":"123","pod_id":"aaaa-bbbb-cccc-dddd"}}`, 176 `{"MetricsName":"/system.slice/dbus.service//cpu/usage","MetricsValue":{"value":123456},"MetricsTimestamp":%s,"MetricsTags":{"container_name":"/system.slice/dbus.service","namespace_id":"123","pod_id":"aaaa-bbbb-cccc-dddd"}}`, 177 `{"MetricsName":"test/metric/1","MetricsValue":{"value":123456},"MetricsTimestamp":%s,"MetricsTags":{"namespace_id":"123","pod_id":"aaaa-bbbb-cccc-dddd"}}`, 178 `{"MetricsName":"test/metric/1","MetricsValue":{"value":123456},"MetricsTimestamp":%s,"MetricsTags":{"namespace_id":"","pod_id":"aaaa-bbbb-cccc-dddd"}}`, 179 `{"MetricsName":"removeme","MetricsValue":{"value":123456},"MetricsTimestamp":%s,"MetricsTags":{"namespace_id":"123","pod_id":"aaaa-bbbb-cccc-dddd"}}`, 180 } 181 182 msgsJson, err := json.Marshal(fakeSink.fakeProducer.points) 183 if err != nil { 184 t.Fatalf("KafkaSinkPoint data is illegal") 185 } 186 msgsString := fmt.Sprintf("%s", string(msgsJson)) 187 188 for _, mgsTemplate := range expectMsgTemplate { 189 expectMsg := fmt.Sprintf(mgsTemplate, timeStr) 190 assert.Contains(t, msgsString, expectMsg) 191 } 192 193 }