Просмотр исходного кода

fix PV logging, gauge jittering

AjayTripathy 6 лет назад
Родитель
Сommit
3a874280cd
4 измененных файлов с 34 добавлено и 4 удалено
  1. 16 3
      cloud/awsprovider.go
  2. 4 1
      cloud/gcpprovider.go
  3. 11 0
      costmodel/costmodel.go
  4. 3 0
      main.go

+ 16 - 3
cloud/awsprovider.go

@@ -384,7 +384,7 @@ func (aws *AWS) PVPricing(pvk PVKey) (*PV, error) {
 	}
 	pricing, ok := aws.Pricing[pvk.Features()]
 	if !ok {
-		klog.V(2).Infof("Persistent Volume pricing not found for %s", pvk.Features())
+		klog.V(4).Infof("Persistent Volume pricing not found for %s: %s", pvk.GetStorageClass(), pvk.Features())
 		return &PV{}, nil
 	}
 	return pricing.PV, nil
@@ -394,6 +394,7 @@ type awsPVKey struct {
 	Labels                 map[string]string
 	StorageClassParameters map[string]string
 	StorageClassName       string
+	Name                   string
 }
 
 func (aws *AWS) GetPVKey(pv *v1.PersistentVolume, parameters map[string]string) PVKey {
@@ -401,6 +402,7 @@ func (aws *AWS) GetPVKey(pv *v1.PersistentVolume, parameters map[string]string)
 		Labels:                 pv.Labels,
 		StorageClassName:       pv.Spec.StorageClassName,
 		StorageClassParameters: parameters,
+		Name:                   pv.Name,
 	}
 }
 
@@ -416,7 +418,15 @@ func (key *awsPVKey) Features() string {
 	// Storage class names are generally EBS volume types (gp2)
 	// Keys in Pricing are based on UsageTypes (EBS:VolumeType.gp2)
 	// Converts between the 2
-	return key.Labels[v1.LabelZoneRegion] + "," + volTypes[storageClass]
+	region := key.Labels[v1.LabelZoneRegion]
+	//if region == "" {
+	//	region = "us-east-1"
+	//}
+	class, ok := volTypes[storageClass]
+	if !ok {
+		klog.Infof("No voltype mapping for %s's storageClass: %s", key.Name, storageClass)
+	}
+	return region + "," + class
 }
 
 // GetKey maps node labels to information needed to retrieve pricing data
@@ -483,13 +493,16 @@ func (aws *AWS) DownloadPricingData() error {
 	for _, storageClass := range storageClasses.Items {
 		params := storageClass.Parameters
 		storageClassMap[storageClass.ObjectMeta.Name] = params
+		if storageClass.GetAnnotations()["storageclass.kubernetes.io/is-default-class"] == "true" || storageClass.GetAnnotations()["storageclass.beta.kubernetes.io/is-default-class"] == "true" {
+			storageClassMap["default"] = params
+		}
 	}
 
 	pvkeys := make(map[string]PVKey)
 	for _, pv := range pvList.Items {
 		params, ok := storageClassMap[pv.Spec.StorageClassName]
 		if !ok {
-			klog.V(2).Infof("Unable to find params for storageClassName %s, falling back to default pricing", pv.Name)
+			klog.V(2).Infof("Unable to find params for storageClassName %s, falling back to default pricing", pv.Spec.StorageClassName)
 			continue
 		}
 		key := aws.GetPVKey(&pv, params)

+ 4 - 1
cloud/gcpprovider.go

@@ -679,6 +679,9 @@ func (gcp *GCP) DownloadPricingData() error {
 	for _, storageClass := range storageClasses.Items {
 		params := storageClass.Parameters
 		storageClassMap[storageClass.ObjectMeta.Name] = params
+		if storageClass.GetAnnotations()["storageclass.kubernetes.io/is-default-class"] == "true" || storageClass.GetAnnotations()["storageclass.beta.kubernetes.io/is-default-class"] == "true" {
+			storageClassMap["default"] = params
+		}
 	}
 
 	pvkeys := make(map[string]PVKey)
@@ -710,7 +713,7 @@ func (gcp *GCP) PVPricing(pvk PVKey) (*PV, error) {
 	defer gcp.DownloadPricingDataLock.RUnlock()
 	pricing, ok := gcp.Pricing[pvk.Features()]
 	if !ok {
-		klog.V(2).Infof("Persistent Volume pricing not found for %s", pvk)
+		klog.V(4).Infof("Persistent Volume pricing not found for %s: %s", pvk.GetStorageClass(), pvk.Features())
 		return &PV{}, nil
 	}
 	return pricing.PV, nil

+ 11 - 0
costmodel/costmodel.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"math"
 	"net/http"
+	"os"
 	"sort"
 	"strconv"
 	"strings"
@@ -39,6 +40,7 @@ const (
 	epCleanTombstones = apiPrefix + "/admin/tsdb/clean_tombstones"
 	epConfig          = apiPrefix + "/status/config"
 	epFlags           = apiPrefix + "/status/flags"
+	remoteEnabled     = "REMOTE_WRITE_ENABLED"
 )
 
 type CostModel struct {
@@ -753,6 +755,9 @@ func addPVData(clientset kubernetes.Interface, pvClaimMapping map[string]*Persis
 	for _, storageClass := range storageClasses.Items {
 		params := storageClass.Parameters
 		storageClassMap[storageClass.ObjectMeta.Name] = params
+		if storageClass.GetAnnotations()["storageclass.kubernetes.io/is-default-class"] == "true" || storageClass.GetAnnotations()["storageclass.beta.kubernetes.io/is-default-class"] == "true" {
+			storageClassMap["default"] = params
+		}
 	}
 
 	pvs, err := clientset.CoreV1().PersistentVolumes().List(metav1.ListOptions{})
@@ -1015,6 +1020,12 @@ func (cm *CostModel) ComputeCostDataRange(cli prometheusClient.Client, clientset
 		klog.V(1).Infof("Error parsing time " + windowString + ". Error: " + err.Error())
 		return nil, err
 	}
+	remoteEnabled := os.Getenv(remoteEnabled)
+	if remoteEnabled == "true" && (end.Sub(start) > time.Hour*168) {
+		klog.V(1).Infof("Using remote database for query from %s to %s with window %s", startString, endString, windowString)
+		return CostDataRangeFromSQL("", "", windowString, startString, endString)
+	}
+
 	var wg sync.WaitGroup
 	wg.Add(8)
 

+ 3 - 0
main.go

@@ -406,6 +406,9 @@ func (a *Accesses) recordPrices() {
 				for _, storageClass := range storageClasses.Items {
 					params := storageClass.Parameters
 					storageClassMap[storageClass.ObjectMeta.Name] = params
+					if storageClass.GetAnnotations()["storageclass.kubernetes.io/is-default-class"] == "true" || storageClass.GetAnnotations()["storageclass.beta.kubernetes.io/is-default-class"] == "true" {
+						storageClassMap["default"] = params
+					}
 				}
 
 				pvs, _ := a.KubeClientSet.CoreV1().PersistentVolumes().List(metav1.ListOptions{})