github.com/gocrane/crane@v0.11.0/pkg/recommendation/recommender/replicas/prepare.go (about) 1 package replicas 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/gocrane/crane/pkg/metricnaming" 8 corev1 "k8s.io/api/core/v1" 9 "k8s.io/apimachinery/pkg/labels" 10 "k8s.io/klog/v2" 11 12 "github.com/gocrane/crane/pkg/providers" 13 "github.com/gocrane/crane/pkg/recommendation/framework" 14 ) 15 16 const callerFormat = "ReplicasRecommendationCaller-%s-%s" 17 18 // CheckDataProviders in PrePrepare phase, will create data source provider via your recommendation config. 19 func (rr *ReplicasRecommender) CheckDataProviders(ctx *framework.RecommendationContext) error { 20 if err := rr.BaseRecommender.CheckDataProviders(ctx); err != nil { 21 return err 22 } 23 24 return nil 25 } 26 27 func (rr *ReplicasRecommender) CollectData(ctx *framework.RecommendationContext) error { 28 resourceCpu := corev1.ResourceCPU 29 labelSelector := labels.SelectorFromSet(ctx.Identity.Labels) 30 caller := fmt.Sprintf(callerFormat, klog.KObj(ctx.Recommendation), ctx.Recommendation.UID) 31 metricNamer := metricnaming.ResourceToWorkloadMetricNamer(ctx.Recommendation.Spec.TargetRef.DeepCopy(), &resourceCpu, labelSelector, caller) 32 if err := metricNamer.Validate(); err != nil { 33 return err 34 } 35 ctx.MetricNamer = metricNamer 36 37 // get workload cpu usage 38 klog.Infof("%s: %s CpuQuery %s", ctx.String(), rr.Name(), ctx.MetricNamer.BuildUniqueKey()) 39 timeNow := time.Now() 40 tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(ctx.MetricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 41 if err != nil { 42 return fmt.Errorf("%s query historic metrics failed: %v ", rr.Name(), err) 43 } 44 if len(tsList) != 1 { 45 return fmt.Errorf("%s query historic metrics data is unexpected, List length is %d ", rr.Name(), len(tsList)) 46 } 47 ctx.AddInputValue(string(corev1.ResourceCPU), tsList) 48 49 resourceMemory := corev1.ResourceMemory 50 metricNamerMemory := metricnaming.ResourceToWorkloadMetricNamer(ctx.Recommendation.Spec.TargetRef.DeepCopy(), &resourceMemory, labelSelector, caller) 51 klog.Infof("%s: %s MemoryQuery %s", ctx.String(), rr.Name(), metricNamerMemory.BuildUniqueKey()) 52 tsListMemory, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(metricNamerMemory, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute) 53 if err != nil { 54 return fmt.Errorf("%s query historic metrics failed: %v ", rr.Name(), err) 55 } 56 if len(tsListMemory) != 1 { 57 return fmt.Errorf("%s query historic metrics data is unexpected, List length is %d ", rr.Name(), len(tsListMemory)) 58 } 59 ctx.AddInputValue(string(corev1.ResourceMemory), tsList) 60 return nil 61 } 62 63 func (rr *ReplicasRecommender) PostProcessing(ctx *framework.RecommendationContext) error { 64 return nil 65 }