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 }