|
@@ -167,66 +167,7 @@ func ClusterDisks(client prometheus.Client, provider cloud.Provider, duration, o
|
|
|
|
|
|
|
|
diskMap := map[string]*Disk{}
|
|
diskMap := map[string]*Disk{}
|
|
|
|
|
|
|
|
- for _, result := range resActiveMins {
|
|
|
|
|
- cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- cluster = env.GetClusterID()
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- name, err := result.GetString("persistentvolume")
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- log.Warningf("ClusterDisks: active mins missing pv name")
|
|
|
|
|
- continue
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if len(result.Values) == 0 {
|
|
|
|
|
- continue
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- key := fmt.Sprintf("%s/%s", cluster, name)
|
|
|
|
|
- if _, ok := diskMap[key]; !ok {
|
|
|
|
|
- diskMap[key] = &Disk{
|
|
|
|
|
- Cluster: cluster,
|
|
|
|
|
- Name: name,
|
|
|
|
|
- Breakdown: &ClusterCostsBreakdown{},
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- s := time.Unix(int64(result.Values[0].Timestamp), 0)
|
|
|
|
|
- e := time.Unix(int64(result.Values[len(result.Values)-1].Timestamp), 0).Add(resolution)
|
|
|
|
|
- mins := e.Sub(s).Minutes()
|
|
|
|
|
-
|
|
|
|
|
- // TODO niko/assets if mins >= threshold, interpolate for missing data?
|
|
|
|
|
-
|
|
|
|
|
- diskMap[key].End = e
|
|
|
|
|
- diskMap[key].Start = s
|
|
|
|
|
- diskMap[key].Minutes = mins
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- for _, result := range resPVSize {
|
|
|
|
|
- cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- cluster = env.GetClusterID()
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- name, err := result.GetString("persistentvolume")
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- log.Warningf("ClusterDisks: PV size data missing persistentvolume")
|
|
|
|
|
- continue
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // TODO niko/assets storage class
|
|
|
|
|
-
|
|
|
|
|
- bytes := result.Values[0].Value
|
|
|
|
|
- key := fmt.Sprintf("%s/%s", cluster, name)
|
|
|
|
|
- if _, ok := diskMap[key]; !ok {
|
|
|
|
|
- diskMap[key] = &Disk{
|
|
|
|
|
- Cluster: cluster,
|
|
|
|
|
- Name: name,
|
|
|
|
|
- Breakdown: &ClusterCostsBreakdown{},
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- diskMap[key].Bytes = bytes
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ pvCosts(diskMap, resActiveMins, resPVSize, resPVCost)
|
|
|
|
|
|
|
|
for _, result := range resLocalStorageCost {
|
|
for _, result := range resLocalStorageCost {
|
|
|
cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
@@ -336,6 +277,83 @@ func ClusterDisks(client prometheus.Client, provider cloud.Provider, duration, o
|
|
|
diskMap[key].Minutes = mins
|
|
diskMap[key].Minutes = mins
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ for _, disk := range diskMap {
|
|
|
|
|
+ // Apply all remaining RAM to Idle
|
|
|
|
|
+ disk.Breakdown.Idle = 1.0 - (disk.Breakdown.System + disk.Breakdown.Other + disk.Breakdown.User)
|
|
|
|
|
+
|
|
|
|
|
+ // Set provider Id to the name for reconciliation on Azure
|
|
|
|
|
+ if fmt.Sprintf("%T", provider) == "*provider.Azure" {
|
|
|
|
|
+ if disk.ProviderID == "" {
|
|
|
|
|
+ disk.ProviderID = disk.Name
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return diskMap, nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func pvCosts(diskMap map[string]*Disk, resActiveMins, resPVSize, resPVCost []*prom.QueryResult) {
|
|
|
|
|
+ for _, result := range resActiveMins {
|
|
|
|
|
+ cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ cluster = env.GetClusterID()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ name, err := result.GetString("persistentvolume")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ log.Warningf("ClusterDisks: active mins missing pv name")
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if len(result.Values) == 0 {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ key := fmt.Sprintf("%s/%s", cluster, name)
|
|
|
|
|
+ if _, ok := diskMap[key]; !ok {
|
|
|
|
|
+ diskMap[key] = &Disk{
|
|
|
|
|
+ Cluster: cluster,
|
|
|
|
|
+ Name: name,
|
|
|
|
|
+ Breakdown: &ClusterCostsBreakdown{},
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ s := time.Unix(int64(result.Values[0].Timestamp), 0)
|
|
|
|
|
+ e := time.Unix(int64(result.Values[len(result.Values)-1].Timestamp), 0).Add(resolution)
|
|
|
|
|
+ mins := e.Sub(s).Minutes()
|
|
|
|
|
+
|
|
|
|
|
+ // TODO niko/assets if mins >= threshold, interpolate for missing data?
|
|
|
|
|
+
|
|
|
|
|
+ diskMap[key].End = e
|
|
|
|
|
+ diskMap[key].Start = s
|
|
|
|
|
+ diskMap[key].Minutes = mins
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for _, result := range resPVSize {
|
|
|
|
|
+ cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ cluster = env.GetClusterID()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ name, err := result.GetString("persistentvolume")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ log.Warningf("ClusterDisks: PV size data missing persistentvolume")
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // TODO niko/assets storage class
|
|
|
|
|
+
|
|
|
|
|
+ bytes := result.Values[0].Value
|
|
|
|
|
+ key := fmt.Sprintf("%s/%s", cluster, name)
|
|
|
|
|
+ if _, ok := diskMap[key]; !ok {
|
|
|
|
|
+ diskMap[key] = &Disk{
|
|
|
|
|
+ Cluster: cluster,
|
|
|
|
|
+ Name: name,
|
|
|
|
|
+ Breakdown: &ClusterCostsBreakdown{},
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ diskMap[key].Bytes = bytes
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
for _, result := range resPVCost {
|
|
for _, result := range resPVCost {
|
|
|
cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
cluster, err := result.GetString(env.GetPromClusterLabel())
|
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -365,20 +383,6 @@ func ClusterDisks(client prometheus.Client, provider cloud.Provider, duration, o
|
|
|
diskMap[key].ProviderID = cloud.ParsePVID(providerID)
|
|
diskMap[key].ProviderID = cloud.ParsePVID(providerID)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- for _, disk := range diskMap {
|
|
|
|
|
- // Apply all remaining RAM to Idle
|
|
|
|
|
- disk.Breakdown.Idle = 1.0 - (disk.Breakdown.System + disk.Breakdown.Other + disk.Breakdown.User)
|
|
|
|
|
-
|
|
|
|
|
- // Set provider Id to the name for reconciliation on Azure
|
|
|
|
|
- if fmt.Sprintf("%T", provider) == "*provider.Azure" {
|
|
|
|
|
- if disk.ProviderID == "" {
|
|
|
|
|
- disk.ProviderID = disk.Name
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return diskMap, nil
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type Node struct {
|
|
type Node struct {
|