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 }