github.com/jonaz/heapster@v1.3.0-beta.0.0.20170208112634-cd3c15ca3d29/metrics/sinks/factory.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 sinks
    16  
    17  import (
    18  	"fmt"
    19  	"time"
    20  
    21  	"github.com/golang/glog"
    22  	"k8s.io/heapster/common/flags"
    23  	"k8s.io/heapster/metrics/core"
    24  	"k8s.io/heapster/metrics/sinks/elasticsearch"
    25  	"k8s.io/heapster/metrics/sinks/gcm"
    26  	"k8s.io/heapster/metrics/sinks/graphite"
    27  	"k8s.io/heapster/metrics/sinks/hawkular"
    28  	"k8s.io/heapster/metrics/sinks/influxdb"
    29  	"k8s.io/heapster/metrics/sinks/kafka"
    30  	logsink "k8s.io/heapster/metrics/sinks/log"
    31  	metricsink "k8s.io/heapster/metrics/sinks/metric"
    32  	"k8s.io/heapster/metrics/sinks/monasca"
    33  	"k8s.io/heapster/metrics/sinks/opentsdb"
    34  	"k8s.io/heapster/metrics/sinks/riemann"
    35  )
    36  
    37  type SinkFactory struct {
    38  }
    39  
    40  func (this *SinkFactory) Build(uri flags.Uri) (core.DataSink, error) {
    41  	switch uri.Key {
    42  	case "elasticsearch":
    43  		return elasticsearch.NewElasticSearchSink(&uri.Val)
    44  	case "gcm":
    45  		return gcm.CreateGCMSink(&uri.Val)
    46  	case "graphite":
    47  		return graphite.NewGraphiteSink(&uri.Val)
    48  	case "hawkular":
    49  		return hawkular.NewHawkularSink(&uri.Val)
    50  	case "influxdb":
    51  		return influxdb.CreateInfluxdbSink(&uri.Val)
    52  	case "kafka":
    53  		return kafka.NewKafkaSink(&uri.Val)
    54  	case "log":
    55  		return logsink.NewLogSink(), nil
    56  	case "metric":
    57  		return metricsink.NewMetricSink(140*time.Second, 15*time.Minute, []string{
    58  			core.MetricCpuUsageRate.MetricDescriptor.Name,
    59  			core.MetricMemoryUsage.MetricDescriptor.Name}), nil
    60  	case "monasca":
    61  		return monasca.CreateMonascaSink(&uri.Val)
    62  	case "opentsdb":
    63  		return opentsdb.CreateOpenTSDBSink(&uri.Val)
    64  	case "riemann":
    65  		return riemann.CreateRiemannSink(&uri.Val)
    66  	default:
    67  		return nil, fmt.Errorf("Sink not recognized: %s", uri.Key)
    68  	}
    69  }
    70  
    71  func (this *SinkFactory) BuildAll(uris flags.Uris, historicalUri string) (*metricsink.MetricSink, []core.DataSink, core.HistoricalSource) {
    72  	result := make([]core.DataSink, 0, len(uris))
    73  	var metric *metricsink.MetricSink
    74  	var historical core.HistoricalSource
    75  	for _, uri := range uris {
    76  		sink, err := this.Build(uri)
    77  		if err != nil {
    78  			glog.Errorf("Failed to create sink: %v", err)
    79  			continue
    80  		}
    81  		if uri.Key == "metric" {
    82  			metric = sink.(*metricsink.MetricSink)
    83  		}
    84  		if uri.String() == historicalUri {
    85  			if asHistSource, ok := sink.(core.AsHistoricalSource); ok {
    86  				historical = asHistSource.Historical()
    87  			} else {
    88  				glog.Errorf("Sink type %q does not support being used for historical access", uri.Key)
    89  			}
    90  		}
    91  		result = append(result, sink)
    92  	}
    93  
    94  	if len([]flags.Uri(uris)) != 0 && len(result) == 0 {
    95  		glog.Fatal("No available sink to use")
    96  	}
    97  
    98  	if metric == nil {
    99  		uri := flags.Uri{}
   100  		uri.Set("metric")
   101  		sink, err := this.Build(uri)
   102  		if err == nil {
   103  			result = append(result, sink)
   104  			metric = sink.(*metricsink.MetricSink)
   105  		} else {
   106  			glog.Errorf("Error while creating metric sink: %v", err)
   107  		}
   108  	}
   109  	if len(historicalUri) > 0 && historical == nil {
   110  		glog.Errorf("Error while initializing historical access: unable to use sink %q as a historical source", historicalUri)
   111  	}
   112  	return metric, result, historical
   113  }
   114  
   115  func NewSinkFactory() *SinkFactory {
   116  	return &SinkFactory{}
   117  }