github.com/gocrane/crane@v0.11.0/pkg/recommendation/recommender/service/prepare.go (about)

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	corev1 "k8s.io/api/core/v1"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	"k8s.io/apimachinery/pkg/labels"
    10  	"k8s.io/klog/v2"
    11  
    12  	"github.com/gocrane/crane/pkg/metricnaming"
    13  	"github.com/gocrane/crane/pkg/providers"
    14  	"github.com/gocrane/crane/pkg/recommendation/framework"
    15  	"github.com/gocrane/crane/pkg/utils"
    16  )
    17  
    18  const callerFormat = "ServiceRecommender-%s-%s"
    19  
    20  // CheckDataProviders in PrePrepare phase, will create data source provider via your recommendation config.
    21  func (s *ServiceRecommender) CheckDataProviders(ctx *framework.RecommendationContext) error {
    22  	if err := s.BaseRecommender.CheckDataProviders(ctx); err != nil {
    23  		return err
    24  	}
    25  
    26  	return nil
    27  }
    28  
    29  func (s *ServiceRecommender) CollectData(ctx *framework.RecommendationContext) error {
    30  	if len(ctx.Pods) == 0 {
    31  		return nil
    32  	}
    33  
    34  	var workloadRef *metav1.OwnerReference
    35  	for _, pod := range ctx.Pods {
    36  		workloadRef = utils.GetPodOwnerReference(ctx.Context, ctx.Client, &pod)
    37  		if workloadRef != nil {
    38  			break
    39  		}
    40  	}
    41  	if workloadRef == nil {
    42  		return fmt.Errorf("could not find all pod OwnerReferences for Service %s selector", ctx.Object.GetName())
    43  	}
    44  
    45  	labelSelector := labels.SelectorFromSet(ctx.Identity.Labels)
    46  	caller := fmt.Sprintf(callerFormat, klog.KObj(ctx.Recommendation), ctx.Recommendation.UID)
    47  	timeNow := time.Now()
    48  	metricNamer := metricnaming.ResourceToGeneralMetricNamer(utils.GetWorkloadNetReceiveBytesExpression(ctx.Recommendation.Spec.TargetRef.Namespace, ctx.Recommendation.Spec.TargetRef.Name, ctx.Recommendation.Spec.TargetRef.Kind), corev1.ResourceServices, labelSelector, caller)
    49  	if err := metricNamer.Validate(); err != nil {
    50  		return err
    51  	}
    52  	ctx.MetricNamer = metricNamer
    53  
    54  	// get pod net receive bytes
    55  	klog.Infof("%s: %s NetReceiveBytes %s", ctx.String(), s.Name(), ctx.MetricNamer.BuildUniqueKey())
    56  	tsList, err := ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(ctx.MetricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute)
    57  	if err != nil {
    58  		return fmt.Errorf("%s query pod net receive bytes historic metrics failed: %v ", s.Name(), err)
    59  	}
    60  	if len(tsList) != 1 {
    61  		return fmt.Errorf("%s query pod net receive bytes historic metrics data is unexpected, List length is %d ", s.Name(), len(tsList))
    62  	}
    63  	ctx.AddInputValue(netReceiveBytesKey, tsList)
    64  
    65  	metricNamer = metricnaming.ResourceToGeneralMetricNamer(utils.GetWorkloadNetTransferBytesExpression(ctx.Recommendation.Spec.TargetRef.Namespace, ctx.Recommendation.Spec.TargetRef.Name, ctx.Recommendation.Spec.TargetRef.Kind), corev1.ResourceServices, labelSelector, caller)
    66  	if err = metricNamer.Validate(); err != nil {
    67  		return err
    68  	}
    69  
    70  	// get pod net transfer bytes
    71  	klog.Infof("%s: %s NetTransferBytes %s", ctx.String(), s.Name(), ctx.MetricNamer.BuildUniqueKey())
    72  	tsList, err = ctx.DataProviders[providers.PrometheusDataSource].QueryTimeSeries(ctx.MetricNamer, timeNow.Add(-time.Hour*24*7), timeNow, time.Minute)
    73  	if err != nil {
    74  		return fmt.Errorf("%s query pod net transfer bytes historic metrics failed: %v ", s.Name(), err)
    75  	}
    76  	if len(tsList) != 1 {
    77  		return fmt.Errorf("%s query pod net transfer bytes historic metrics data is unexpected, List length is %d ", s.Name(), len(tsList))
    78  	}
    79  	ctx.AddInputValue(netTransferBytesKey, tsList)
    80  
    81  	return nil
    82  }
    83  
    84  func (s *ServiceRecommender) PostProcessing(ctx *framework.RecommendationContext) error {
    85  	return nil
    86  }