github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/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/hawkular" 27 "k8s.io/heapster/metrics/sinks/influxdb" 28 "k8s.io/heapster/metrics/sinks/kafka" 29 "k8s.io/heapster/metrics/sinks/log" 30 "k8s.io/heapster/metrics/sinks/metric" 31 "k8s.io/heapster/metrics/sinks/monasca" 32 "k8s.io/heapster/metrics/sinks/opentsdb" 33 "k8s.io/heapster/metrics/sinks/riemann" 34 ) 35 36 type SinkFactory struct { 37 } 38 39 func (this *SinkFactory) Build(uri flags.Uri) (core.DataSink, error) { 40 switch uri.Key { 41 case "gcm": 42 return gcm.CreateGCMSink(&uri.Val) 43 case "hawkular": 44 return hawkular.NewHawkularSink(&uri.Val) 45 case "influxdb": 46 return influxdb.CreateInfluxdbSink(&uri.Val) 47 case "kafka": 48 return kafka.NewKafkaSink(&uri.Val) 49 case "log": 50 return logsink.NewLogSink(), nil 51 case "metric": 52 return metricsink.NewMetricSink(140*time.Second, 15*time.Minute, []string{ 53 core.MetricCpuUsageRate.MetricDescriptor.Name, 54 core.MetricMemoryUsage.MetricDescriptor.Name}), nil 55 case "monasca": 56 return monasca.CreateMonascaSink(&uri.Val) 57 case "riemann": 58 return riemann.CreateRiemannSink(&uri.Val) 59 case "opentsdb": 60 return opentsdb.CreateOpenTSDBSink(&uri.Val) 61 case "elasticsearch": 62 return elasticsearch.NewElasticSearchSink(&uri.Val) 63 default: 64 return nil, fmt.Errorf("Sink not recognized: %s", uri.Key) 65 } 66 } 67 68 func (this *SinkFactory) BuildAll(uris flags.Uris) (*metricsink.MetricSink, []core.DataSink) { 69 result := make([]core.DataSink, 0, len(uris)) 70 var metric *metricsink.MetricSink 71 for _, uri := range uris { 72 sink, err := this.Build(uri) 73 if err != nil { 74 glog.Errorf("Failed to create sink: %v", err) 75 continue 76 } 77 if uri.Key == "metric" { 78 metric = sink.(*metricsink.MetricSink) 79 } 80 result = append(result, sink) 81 } 82 if metric == nil { 83 uri := flags.Uri{} 84 uri.Set("metric") 85 sink, err := this.Build(uri) 86 if err == nil { 87 result = append(result, sink) 88 metric = sink.(*metricsink.MetricSink) 89 } else { 90 glog.Errorf("Error while creating metric sink: %v", err) 91 } 92 } 93 return metric, result 94 } 95 96 func NewSinkFactory() *SinkFactory { 97 return &SinkFactory{} 98 }