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