|
|
@@ -6,7 +6,6 @@ import (
|
|
|
"time"
|
|
|
|
|
|
"github.com/opencost/opencost/core/pkg/env"
|
|
|
- "github.com/opencost/opencost/core/pkg/log"
|
|
|
"github.com/opencost/opencost/core/pkg/model/kubemodel"
|
|
|
"github.com/opencost/opencost/core/pkg/source"
|
|
|
)
|
|
|
@@ -25,9 +24,9 @@ func NewKubeModel(dataSource source.OpenCostDataSource) (*KubeModel, error) {
|
|
|
|
|
|
km := &KubeModel{ds: dataSource}
|
|
|
|
|
|
- clusterUID, err := km.computeClusterUID(time.Now().UTC())
|
|
|
+ clusterUID, err := km.computeClusterUID()
|
|
|
if err != nil {
|
|
|
- return nil, fmt.Errorf("error computing cluster UID: %w", err)
|
|
|
+ return nil, fmt.Errorf("error determining cluster UID: %w", err)
|
|
|
}
|
|
|
|
|
|
km.clusterUID = clusterUID
|
|
|
@@ -70,32 +69,20 @@ func (km *KubeModel) ComputeKubeModelSet(start, end time.Time) (*kubemodel.KubeM
|
|
|
return kms, nil
|
|
|
}
|
|
|
|
|
|
-// TODO: come up with a better way to pull kube-system namespace UID from Metrics()?
|
|
|
-func (km *KubeModel) computeClusterUID(start time.Time) (string, error) {
|
|
|
- // TODO: what (start, end) here? will this always work? or will it fail,
|
|
|
- // e.g. right after a clean install?
|
|
|
- start = start.Truncate(km.ds.Resolution())
|
|
|
- end := start.Add(km.ds.Resolution())
|
|
|
-
|
|
|
- nsLabelsResult, _ := km.ds.Metrics().QueryNamespaceLabels(start, end).Await()
|
|
|
- for _, res := range nsLabelsResult {
|
|
|
- if res.Namespace == "kube-system" {
|
|
|
- log.Infof("KubeModel: detected cluster UID from kube-system: %s", res.UID)
|
|
|
- return res.UID, nil
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+func (km *KubeModel) computeClusterUID() (string, error) {
|
|
|
+ // TODO: Replace with kube-system namespace UID when we have a reliable way
|
|
|
+ // to query for it.
|
|
|
clusterUID := env.GetClusterID()
|
|
|
- if clusterUID != "" {
|
|
|
- log.Warnf("KubeModel: failed to infer cluster UID from kube-system: using env var: %s", clusterUID)
|
|
|
- return clusterUID, nil
|
|
|
+ if clusterUID == "" {
|
|
|
+ return "", errors.New("failed to detect cluster UID")
|
|
|
}
|
|
|
|
|
|
- return "", errors.New("failed to detect cluster UID")
|
|
|
+ return clusterUID, nil
|
|
|
}
|
|
|
|
|
|
-// TODO: should we periodically check the ClusterUID?
|
|
|
-// TODO: where do we get the additional information? km.ds.ClusterInfo().GetClusterInfo() is a map[string]string...
|
|
|
+// TODO: How do we pull kube-system namespace UID for Cluster?
|
|
|
+// TODO: How do we populate (Start, End) for Cluster? A new cluster_info metric?
|
|
|
+// TODO: Where do we get the additional information? km.ds.ClusterInfo().GetClusterInfo()?
|
|
|
func (km *KubeModel) computeCluster(kms *kubemodel.KubeModelSet) error {
|
|
|
kms.Cluster = &kubemodel.Cluster{
|
|
|
UID: km.clusterUID,
|
|
|
@@ -159,105 +146,105 @@ func (km *KubeModel) computeResourceQuotas(kms *kubemodel.KubeModelSet, start, e
|
|
|
rqSpecCPURequestAverageResult, _ := rqSpecCPURequestAverageResultFuture.Await()
|
|
|
for _, res := range rqSpecCPURequestAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatAvg, mcpu)
|
|
|
}
|
|
|
|
|
|
rqSpecCPURequestMaxResult, _ := rqSpecCPURequestMaxResultFuture.Await()
|
|
|
for _, res := range rqSpecCPURequestMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatMax, mcpu)
|
|
|
}
|
|
|
|
|
|
rqSpecRAMRequestAverageResult, _ := rqSpecRAMRequestAverageResultFuture.Await()
|
|
|
for _, res := range rqSpecRAMRequestAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqSpecRAMRequestMaxResult, _ := rqSpecRAMRequestMaxResultFuture.Await()
|
|
|
for _, res := range rqSpecRAMRequestMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Spec.Hard.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqSpecCPULimitAverageResult, _ := rqSpecCPULimitAverageResultFuture.Await()
|
|
|
for _, res := range rqSpecCPULimitAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatAvg, mcpu)
|
|
|
}
|
|
|
|
|
|
rqSpecCPULimitMaxResult, _ := rqSpecCPULimitMaxResultFuture.Await()
|
|
|
for _, res := range rqSpecCPULimitMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatMax, mcpu)
|
|
|
}
|
|
|
|
|
|
rqSpecRAMLimitAverageResult, _ := rqSpecRAMLimitAverageResultFuture.Await()
|
|
|
for _, res := range rqSpecRAMLimitAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqSpecRAMLimitMaxResult, _ := rqSpecRAMLimitMaxResultFuture.Await()
|
|
|
for _, res := range rqSpecRAMLimitMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Spec.Hard.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqStatusUsedCPURequestAverageResult, _ := rqStatusUsedCPURequestAverageResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedCPURequestAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatAvg, mcpu)
|
|
|
}
|
|
|
|
|
|
rqStatusUsedCPURequestMaxResult, _ := rqStatusUsedCPURequestMaxResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedCPURequestMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatMax, mcpu)
|
|
|
}
|
|
|
|
|
|
rqStatusUsedRAMRequestAverageResult, _ := rqStatusUsedRAMRequestAverageResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedRAMRequestAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqStatusUsedRAMRequestMaxResult, _ := rqStatusUsedRAMRequestMaxResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedRAMRequestMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Status.Used.Requests.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqStatusUsedCPULimitAverageResult, _ := rqStatusUsedCPULimitAverageResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedCPULimitAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatAvg, mcpu)
|
|
|
}
|
|
|
|
|
|
rqStatusUsedCPULimitMaxResult, _ := rqStatusUsedCPULimitMaxResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedCPULimitMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- mcpu := res.Data[0].Value * 1000
|
|
|
+ mcpu := uint64(res.Data[0].Value * 1000)
|
|
|
kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceCPU, kubemodel.UnitMillicore, kubemodel.StatMax, mcpu)
|
|
|
}
|
|
|
|
|
|
rqStatusUsedRAMLimitAverageResult, _ := rqStatusUsedRAMLimitAverageResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedRAMLimitAverageResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatAvg, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
rqStatusUsedRAMLimitMaxResult, _ := rqStatusUsedRAMLimitMaxResultFuture.Await()
|
|
|
for _, res := range rqStatusUsedRAMLimitMaxResult {
|
|
|
kms.RegisterResourceQuota(res.UID, res.ResourceQuota, res.Namespace)
|
|
|
- kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, res.Data[0].Value)
|
|
|
+ kms.ResourceQuotas[res.UID].Status.Used.Limits.Set(kubemodel.ResourceMemory, kubemodel.UnitByte, kubemodel.StatMax, uint64(res.Data[0].Value))
|
|
|
}
|
|
|
|
|
|
return nil
|