github.com/jonaz/heapster@v1.3.0-beta.0.0.20170208112634-cd3c15ca3d29/metrics/storage/nodemetrics/reststorage.go (about) 1 // Copyright 2016 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 app 16 17 import ( 18 "fmt" 19 "time" 20 21 "github.com/golang/glog" 22 23 "k8s.io/heapster/metrics/apis/metrics" 24 _ "k8s.io/heapster/metrics/apis/metrics/install" 25 "k8s.io/heapster/metrics/core" 26 metricsink "k8s.io/heapster/metrics/sinks/metric" 27 "k8s.io/heapster/metrics/storage/util" 28 "k8s.io/kubernetes/pkg/api" 29 "k8s.io/kubernetes/pkg/api/errors" 30 "k8s.io/kubernetes/pkg/api/unversioned" 31 "k8s.io/kubernetes/pkg/client/cache" 32 "k8s.io/kubernetes/pkg/labels" 33 "k8s.io/kubernetes/pkg/runtime" 34 ) 35 36 type MetricStorage struct { 37 groupResource unversioned.GroupResource 38 metricSink *metricsink.MetricSink 39 nodeLister *cache.StoreToNodeLister 40 } 41 42 func NewStorage(groupResource unversioned.GroupResource, metricSink *metricsink.MetricSink, nodeLister *cache.StoreToNodeLister) *MetricStorage { 43 return &MetricStorage{ 44 groupResource: groupResource, 45 metricSink: metricSink, 46 nodeLister: nodeLister, 47 } 48 } 49 50 // Storage interface 51 func (m *MetricStorage) New() runtime.Object { 52 return &metrics.NodeMetrics{} 53 } 54 55 // KindProvider interface 56 func (m *MetricStorage) Kind() string { 57 return "NodeMetrics" 58 } 59 60 // Lister interface 61 func (m *MetricStorage) NewList() runtime.Object { 62 return &metrics.NodeMetricsList{} 63 } 64 65 // Lister interface 66 func (m *MetricStorage) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { 67 labelSelector := labels.Everything() 68 if options != nil && options.LabelSelector != nil { 69 labelSelector = options.LabelSelector 70 } 71 nodes, err := m.nodeLister.NodeCondition(func(node *api.Node) bool { 72 if labelSelector.Empty() { 73 return true 74 } 75 return labelSelector.Matches(labels.Set(node.Labels)) 76 }).List() 77 if err != nil { 78 errMsg := fmt.Errorf("Error while listing nodes: %v", err) 79 glog.Error(errMsg) 80 return &metrics.NodeMetricsList{}, errMsg 81 } 82 83 res := metrics.NodeMetricsList{} 84 for _, node := range nodes { 85 if m := m.getNodeMetrics(node.Name); m != nil { 86 res.Items = append(res.Items, *m) 87 } 88 } 89 return &res, nil 90 } 91 92 // Getter interface 93 func (m *MetricStorage) Get(ctx api.Context, name string) (runtime.Object, error) { 94 nodeMetrics := m.getNodeMetrics(name) 95 if nodeMetrics == nil { 96 return &metrics.NodeMetrics{}, errors.NewNotFound(m.groupResource, name) 97 } 98 return nodeMetrics, nil 99 } 100 101 func (m *MetricStorage) getNodeMetrics(node string) *metrics.NodeMetrics { 102 batch := m.metricSink.GetLatestDataBatch() 103 if batch == nil { 104 return nil 105 } 106 107 ms, found := batch.MetricSets[core.NodeKey(node)] 108 if !found { 109 return nil 110 } 111 112 usage, err := util.ParseResourceList(ms) 113 if err != nil { 114 return nil 115 } 116 117 return &metrics.NodeMetrics{ 118 ObjectMeta: api.ObjectMeta{ 119 Name: node, 120 CreationTimestamp: unversioned.NewTime(time.Now()), 121 }, 122 Timestamp: unversioned.NewTime(batch.Timestamp), 123 Window: unversioned.Duration{Duration: time.Minute}, 124 Usage: usage, 125 } 126 }