github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/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/api/core/v1" 24 "k8s.io/apimachinery/pkg/api/errors" 25 metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 "k8s.io/apimachinery/pkg/labels" 28 "k8s.io/apimachinery/pkg/runtime" 29 "k8s.io/apimachinery/pkg/runtime/schema" 30 genericapirequest "k8s.io/apiserver/pkg/endpoints/request" 31 "k8s.io/apiserver/pkg/registry/rest" 32 v1listers "k8s.io/client-go/listers/core/v1" 33 "k8s.io/heapster/metrics/core" 34 metricsink "k8s.io/heapster/metrics/sinks/metric" 35 "k8s.io/heapster/metrics/storage/util" 36 "k8s.io/metrics/pkg/apis/metrics" 37 _ "k8s.io/metrics/pkg/apis/metrics/install" 38 ) 39 40 type MetricStorage struct { 41 groupResource schema.GroupResource 42 metricSink *metricsink.MetricSink 43 nodeLister v1listers.NodeLister 44 } 45 46 var _ rest.KindProvider = &MetricStorage{} 47 var _ rest.Storage = &MetricStorage{} 48 var _ rest.Getter = &MetricStorage{} 49 var _ rest.Lister = &MetricStorage{} 50 51 func NewStorage(groupResource schema.GroupResource, metricSink *metricsink.MetricSink, nodeLister v1listers.NodeLister) *MetricStorage { 52 return &MetricStorage{ 53 groupResource: groupResource, 54 metricSink: metricSink, 55 nodeLister: nodeLister, 56 } 57 } 58 59 // Storage interface 60 func (m *MetricStorage) New() runtime.Object { 61 return &metrics.NodeMetrics{} 62 } 63 64 // KindProvider interface 65 func (m *MetricStorage) Kind() string { 66 return "NodeMetrics" 67 } 68 69 // Lister interface 70 func (m *MetricStorage) NewList() runtime.Object { 71 return &metrics.NodeMetricsList{} 72 } 73 74 // Lister interface 75 func (m *MetricStorage) List(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { 76 labelSelector := labels.Everything() 77 if options != nil && options.LabelSelector != nil { 78 labelSelector = options.LabelSelector 79 } 80 nodes, err := m.nodeLister.ListWithPredicate(func(node *v1.Node) bool { 81 if labelSelector.Empty() { 82 return true 83 } 84 return labelSelector.Matches(labels.Set(node.Labels)) 85 }) 86 if err != nil { 87 errMsg := fmt.Errorf("Error while listing nodes: %v", err) 88 glog.Error(errMsg) 89 return &metrics.NodeMetricsList{}, errMsg 90 } 91 92 res := metrics.NodeMetricsList{} 93 for _, node := range nodes { 94 if m := m.getNodeMetrics(node.Name); m != nil { 95 res.Items = append(res.Items, *m) 96 } 97 } 98 return &res, nil 99 } 100 101 // Getter interface 102 func (m *MetricStorage) Get(ctx genericapirequest.Context, name string, opts *metav1.GetOptions) (runtime.Object, error) { 103 // TODO: pay attention to get options 104 nodeMetrics := m.getNodeMetrics(name) 105 if nodeMetrics == nil { 106 return &metrics.NodeMetrics{}, errors.NewNotFound(m.groupResource, name) 107 } 108 return nodeMetrics, nil 109 } 110 111 func (m *MetricStorage) getNodeMetrics(node string) *metrics.NodeMetrics { 112 batch := m.metricSink.GetLatestDataBatch() 113 if batch == nil { 114 return nil 115 } 116 117 ms, found := batch.MetricSets[core.NodeKey(node)] 118 if !found { 119 return nil 120 } 121 122 usage, err := util.ParseResourceList(ms) 123 if err != nil { 124 return nil 125 } 126 127 return &metrics.NodeMetrics{ 128 ObjectMeta: metav1.ObjectMeta{ 129 Name: node, 130 CreationTimestamp: metav1.NewTime(time.Now()), 131 }, 132 Timestamp: metav1.NewTime(batch.Timestamp), 133 Window: metav1.Duration{Duration: time.Minute}, 134 Usage: usage, 135 } 136 }