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  }