github.com/gocrane/crane@v0.11.0/pkg/recommendation/recommender/idlenode/prepare.go (about) 1 package idlenode 2 3 import ( 4 "fmt" 5 "time" 6 7 corev1 "k8s.io/api/core/v1" 8 "k8s.io/apimachinery/pkg/labels" 9 "k8s.io/klog/v2" 10 11 "github.com/gocrane/crane/pkg/metricnaming" 12 "github.com/gocrane/crane/pkg/providers" 13 "github.com/gocrane/crane/pkg/recommendation/framework" 14 "github.com/gocrane/crane/pkg/utils" 15 ) 16 17 const callerFormat = "IdleNodeRecommender-%s-%s" 18 19 // CheckDataProviders in PrePrepare phase, will create data source provider via your recommendation config. 20 func (inr *IdleNodeRecommender) CheckDataProviders(ctx *framework.RecommendationContext) error { 21 if err := inr.BaseRecommender.CheckDataProviders(ctx); err != nil { 22 return err 23 } 24 25 return nil 26 } 27 28 func (inr *IdleNodeRecommender) CollectData(ctx *framework.RecommendationContext) error { 29 labelSelector := labels.SelectorFromSet(ctx.Identity.Labels) 30 caller := fmt.Sprintf(callerFormat, klog.KObj(ctx.Recommendation), ctx.Recommendation.UID) 31 timeNow := time.Now() 32 if inr.cpuUsageUtilization > 0 { 33 metricNamer := metricnaming.ResourceToGeneralMetricNamer(utils.GetNodeCpuUsageUtilizationExpression(ctx.Recommendation.Spec.TargetRef.Name), corev1.ResourceCPU, labelSelector, caller) 34 if err := metricNamer.Validate(); err != nil { 35 return err 36 } 37 ctx.MetricNamer = metricNamer 38 39 // get node cpu usage utilization 40 klog.Infof("%s: %s CpuQuery %s", ctx.String(), inr.Name(), ctx.MetricNamer.BuildUniqueKey()) 41 tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(ctx.MetricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 42 if err != nil { 43 return fmt.Errorf("%s query node cpu usage historic metrics failed: %v ", inr.Name(), err) 44 } 45 if len(tsList) != 1 { 46 return fmt.Errorf("%s query node cpu usage historic metrics data is unexpected, List length is %d ", inr.Name(), len(tsList)) 47 } 48 ctx.AddInputValue(cpuUsageUtilizationKey, tsList) 49 } 50 51 if inr.memoryUsageUtilization > 0 { 52 metricNamer := metricnaming.ResourceToGeneralMetricNamer(utils.GetNodeMemUsageUtilizationExpression(ctx.Recommendation.Spec.TargetRef.Name), corev1.ResourceMemory, labelSelector, caller) 53 if err := metricNamer.Validate(); err != nil { 54 return err 55 } 56 // get node memory usage utilization 57 klog.Infof("%s: %s MemoryQuery %s", ctx.String(), inr.Name(), metricNamer.BuildUniqueKey()) 58 tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(metricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 59 if err != nil { 60 return fmt.Errorf("%s query node memory usage historic metrics failed: %v ", inr.Name(), err) 61 } 62 if len(tsList) != 1 { 63 return fmt.Errorf("%s query node memory usage historic metrics data is unexpected, List length is %d ", inr.Name(), len(tsList)) 64 } 65 ctx.AddInputValue(memoryUsageUtilizationKey, tsList) 66 } 67 68 if inr.cpuRequestUtilization > 0 { 69 metricNamer := metricnaming.ResourceToGeneralMetricNamer(utils.GetNodeCpuRequestUtilizationExpression(ctx.Recommendation.Spec.TargetRef.Name), corev1.ResourceCPU, labelSelector, caller) 70 if err := metricNamer.Validate(); err != nil { 71 return err 72 } 73 ctx.MetricNamer = metricNamer 74 75 // get node cpu request utilization 76 klog.Infof("%s: %s CpuQuery %s", ctx.String(), inr.Name(), metricNamer) 77 tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(metricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 78 if err != nil { 79 return fmt.Errorf("%s query node cpu request historic metrics failed: %v ", inr.Name(), err) 80 } 81 if len(tsList) != 1 { 82 return fmt.Errorf("%s query node cpu request historic metrics data is unexpected, List length is %d ", inr.Name(), len(tsList)) 83 } 84 ctx.AddInputValue(cpuRequestUtilizationKey, tsList) 85 } 86 87 if inr.memoryRequestUtilization > 0 { 88 metricNamer := metricnaming.ResourceToGeneralMetricNamer(utils.GetNodeMemRequestUtilizationExpression(ctx.Recommendation.Spec.TargetRef.Name), corev1.ResourceMemory, labelSelector, caller) 89 if err := metricNamer.Validate(); err != nil { 90 return err 91 } 92 93 // get node memory request utilization 94 klog.Infof("%s: %s MemoryQuery %s", ctx.String(), inr.Name(), metricNamer.BuildUniqueKey()) 95 tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(metricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 96 if err != nil { 97 return fmt.Errorf("%s query node memory request historic metrics failed: %v ", inr.Name(), err) 98 } 99 if len(tsList) != 1 { 100 return fmt.Errorf("%s query node memory request historic metrics data is unexpected, List length is %d ", inr.Name(), len(tsList)) 101 } 102 ctx.AddInputValue(memoryRequestUtilizationKey, tsList) 103 } 104 105 return nil 106 } 107 108 func (inr *IdleNodeRecommender) PostProcessing(ctx *framework.RecommendationContext) error { 109 return nil 110 }