|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"encoding/json"
|
|
|
"flag"
|
|
|
"fmt"
|
|
|
+ "math"
|
|
|
"net"
|
|
|
"net/http"
|
|
|
"os"
|
|
|
@@ -617,6 +618,8 @@ func (a *Accesses) recordPrices() {
|
|
|
podStatus[pod.Name] = pod.Status.Phase
|
|
|
}
|
|
|
|
|
|
+ cfg, _ := a.Cloud.GetConfig()
|
|
|
+
|
|
|
// Record network pricing at global scope
|
|
|
networkCosts, err := a.Cloud.NetworkPricing()
|
|
|
if err != nil {
|
|
|
@@ -636,12 +639,40 @@ func (a *Accesses) recordPrices() {
|
|
|
|
|
|
nodes, err := a.Model.GetNodeCost(a.Cloud)
|
|
|
for nodeName, node := range nodes {
|
|
|
+ // Emit costs, guarding against NaN inputs for custom pricing.
|
|
|
cpuCost, _ := strconv.ParseFloat(node.VCPUCost, 64)
|
|
|
+ if math.IsNaN(cpuCost) || math.IsInf(cpuCost, 0) {
|
|
|
+ cpuCost, _ = strconv.ParseFloat(cfg.CPU, 64)
|
|
|
+ if math.IsNaN(cpuCost) || math.IsInf(cpuCost, 0) {
|
|
|
+ cpuCost = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
cpu, _ := strconv.ParseFloat(node.VCPU, 64)
|
|
|
+ if math.IsNaN(cpu) || math.IsInf(cpu, 0) {
|
|
|
+ cpu = 1 // Assume 1 CPU
|
|
|
+ }
|
|
|
ramCost, _ := strconv.ParseFloat(node.RAMCost, 64)
|
|
|
+ if math.IsNaN(ramCost) || math.IsInf(ramCost, 0) {
|
|
|
+ ramCost, _ = strconv.ParseFloat(cfg.RAM, 64)
|
|
|
+ if math.IsNaN(ramCost) || math.IsInf(ramCost, 0) {
|
|
|
+ ramCost = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
ram, _ := strconv.ParseFloat(node.RAMBytes, 64)
|
|
|
+ if math.IsNaN(ram) || math.IsInf(ram, 0) {
|
|
|
+ ram = 0
|
|
|
+ }
|
|
|
gpu, _ := strconv.ParseFloat(node.GPU, 64)
|
|
|
+ if math.IsNaN(gpu) || math.IsInf(gpu, 0) {
|
|
|
+ gpu = 0
|
|
|
+ }
|
|
|
gpuCost, _ := strconv.ParseFloat(node.GPUCost, 64)
|
|
|
+ if math.IsNaN(gpuCost) || math.IsInf(gpuCost, 0) {
|
|
|
+ gpuCost, _ = strconv.ParseFloat(cfg.GPU, 64)
|
|
|
+ if math.IsNaN(gpuCost) || math.IsInf(gpuCost, 0) {
|
|
|
+ gpuCost = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
totalCost := cpu*cpuCost + ramCost*(ram/1024/1024/1024) + gpu*gpuCost
|
|
|
|
|
|
@@ -837,8 +868,9 @@ func Initialize() {
|
|
|
configs, err := kubeClientset.CoreV1().ConfigMaps(kubecostNamespace).Get("pricing-configs", metav1.GetOptions{})
|
|
|
if err != nil {
|
|
|
klog.Infof("ERROR FETCHING configmap: %s", err.Error())
|
|
|
+ } else {
|
|
|
+ watchConfigFunc(configs)
|
|
|
}
|
|
|
- watchConfigFunc(configs)
|
|
|
|
|
|
k8sCache.SetConfigMapUpdateFunc(watchConfigFunc)
|
|
|
|
|
|
@@ -1008,12 +1040,7 @@ func Initialize() {
|
|
|
Router.GET("/costDataModelRangeLarge", A.CostDataModelRangeLarge)
|
|
|
Router.GET("/outOfClusterCosts", A.OutOfClusterCostsWithCache)
|
|
|
Router.GET("/allNodePricing", A.GetAllNodePricing)
|
|
|
- Router.GET("/getConfigs", A.GetConfigs)
|
|
|
Router.POST("/refreshPricing", A.RefreshPricingData)
|
|
|
- Router.POST("/updateSpotInfoConfigs", A.UpdateSpotInfoConfigs)
|
|
|
- Router.POST("/updateAthenaInfoConfigs", A.UpdateAthenaInfoConfigs)
|
|
|
- Router.POST("/updateBigQueryInfoConfigs", A.UpdateBigQueryInfoConfigs)
|
|
|
- Router.POST("/updateConfigByKey", A.UpdateConfigByKey)
|
|
|
Router.GET("/clusterCostsOverTime", A.ClusterCostsOverTime)
|
|
|
Router.GET("/clusterCosts", A.ClusterCosts)
|
|
|
Router.GET("/validatePrometheus", A.GetPrometheusMetadata)
|