github.com/jonaz/heapster@v1.3.0-beta.0.0.20170208112634-cd3c15ca3d29/metrics/sinks/kafka/driver.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  	"net/url"
    19  	"sync"
    20  	"time"
    21  
    22  	"github.com/golang/glog"
    23  	kafka_common "k8s.io/heapster/common/kafka"
    24  	"k8s.io/heapster/metrics/core"
    25  )
    26  
    27  type KafkaSinkPoint struct {
    28  	MetricsName      string
    29  	MetricsValue     interface{}
    30  	MetricsTimestamp time.Time
    31  	MetricsTags      map[string]string
    32  }
    33  
    34  type kafkaSink struct {
    35  	kafka_common.KafkaClient
    36  	sync.RWMutex
    37  }
    38  
    39  func (sink *kafkaSink) ExportData(dataBatch *core.DataBatch) {
    40  	sink.Lock()
    41  	defer sink.Unlock()
    42  
    43  	for _, metricSet := range dataBatch.MetricSets {
    44  		for metricName, metricValue := range metricSet.MetricValues {
    45  			point := KafkaSinkPoint{
    46  				MetricsName: metricName,
    47  				MetricsTags: metricSet.Labels,
    48  				MetricsValue: map[string]interface{}{
    49  					"value": metricValue.GetValue(),
    50  				},
    51  				MetricsTimestamp: dataBatch.Timestamp.UTC(),
    52  			}
    53  			err := sink.ProduceKafkaMessage(point)
    54  			if err != nil {
    55  				glog.Errorf("Failed to produce metric message: %s", err)
    56  			}
    57  		}
    58  		for _, metric := range metricSet.LabeledMetrics {
    59  			labels := make(map[string]string)
    60  			for k, v := range metricSet.Labels {
    61  				labels[k] = v
    62  			}
    63  			for k, v := range metric.Labels {
    64  				labels[k] = v
    65  			}
    66  			point := KafkaSinkPoint{
    67  				MetricsName: metric.Name,
    68  				MetricsTags: labels,
    69  				MetricsValue: map[string]interface{}{
    70  					"value": metric.GetValue(),
    71  				},
    72  				MetricsTimestamp: dataBatch.Timestamp.UTC(),
    73  			}
    74  			err := sink.ProduceKafkaMessage(point)
    75  			if err != nil {
    76  				glog.Errorf("Failed to produce metric message: %s", err)
    77  			}
    78  		}
    79  	}
    80  }
    81  
    82  func NewKafkaSink(uri *url.URL) (core.DataSink, error) {
    83  	client, err := kafka_common.NewKafkaClient(uri, kafka_common.TimeSeriesTopic)
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  
    88  	return &kafkaSink{
    89  		KafkaClient: client,
    90  	}, nil
    91  }