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  }