|
|
@@ -332,184 +332,6 @@ func resultToTotals(qr interface{}) ([][]string, error) {
|
|
|
return totals, nil
|
|
|
}
|
|
|
|
|
|
-func resultToTotal(qr interface{}) (map[string][][]string, error) {
|
|
|
- defaultClusterID := os.Getenv(clusterIDKey)
|
|
|
-
|
|
|
- results, err := NewQueryResults(qr)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- toReturn := make(map[string][][]string)
|
|
|
- for _, result := range results {
|
|
|
- clusterID, _ := result.GetString("cluster_id")
|
|
|
- if clusterID == "" {
|
|
|
- clusterID = defaultClusterID
|
|
|
- }
|
|
|
-
|
|
|
- // Expect a single value only
|
|
|
- if len(result.Values) == 0 {
|
|
|
- klog.V(1).Infof("[Warning] Metric values did not contain any valid data.")
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- value := result.Values[0]
|
|
|
- d0 := fmt.Sprintf("%f", value.Timestamp)
|
|
|
- d1 := fmt.Sprintf("%f", value.Value)
|
|
|
- toAppend := []string{
|
|
|
- d0,
|
|
|
- d1,
|
|
|
- }
|
|
|
- if t, ok := toReturn[clusterID]; ok {
|
|
|
- t = append(t, toAppend)
|
|
|
- } else {
|
|
|
- toReturn[clusterID] = [][]string{toAppend}
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return toReturn, nil
|
|
|
-}
|
|
|
-
|
|
|
-// ClusterCostsForAllClusters gives the cluster costs averaged over a window of time for all clusters.
|
|
|
-func ClusterCostsForAllClusters(cli prometheus.Client, provider cloud.Provider, window, offset string) (map[string]*Totals, error) {
|
|
|
- localStorageQuery := provider.GetLocalStorageQuery(window, offset, true)
|
|
|
- if localStorageQuery != "" {
|
|
|
- localStorageQuery = fmt.Sprintf("+ %s", localStorageQuery)
|
|
|
- }
|
|
|
-
|
|
|
- fmtOffset := ""
|
|
|
- if offset != "" {
|
|
|
- fmtOffset = fmt.Sprintf("offset %s", offset)
|
|
|
- }
|
|
|
-
|
|
|
- qCores := fmt.Sprintf(queryClusterCores, window, fmtOffset, window, fmtOffset, window, fmtOffset)
|
|
|
- qRAM := fmt.Sprintf(queryClusterRAM, window, fmtOffset, window, fmtOffset)
|
|
|
- qStorage := fmt.Sprintf(queryStorage, window, fmtOffset, window, fmtOffset, localStorageQuery)
|
|
|
-
|
|
|
- klog.V(4).Infof("Running query %s", qCores)
|
|
|
- resultClusterCores, err := Query(cli, qCores)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qCores, err.Error())
|
|
|
- }
|
|
|
-
|
|
|
- klog.V(4).Infof("Running query %s", qRAM)
|
|
|
- resultClusterRAM, err := Query(cli, qRAM)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qRAM, err.Error())
|
|
|
- }
|
|
|
-
|
|
|
- klog.V(4).Infof("Running query %s", qRAM)
|
|
|
- resultStorage, err := Query(cli, qStorage)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qStorage, err.Error())
|
|
|
- }
|
|
|
-
|
|
|
- toReturn := make(map[string]*Totals)
|
|
|
-
|
|
|
- coreTotal, err := resultToTotal(resultClusterCores)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qCores, err.Error())
|
|
|
- }
|
|
|
- for clusterID, total := range coreTotal {
|
|
|
- if _, ok := toReturn[clusterID]; !ok {
|
|
|
- toReturn[clusterID] = &Totals{}
|
|
|
- }
|
|
|
- toReturn[clusterID].CPUCost = total
|
|
|
- }
|
|
|
-
|
|
|
- ramTotal, err := resultToTotal(resultClusterRAM)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qRAM, err.Error())
|
|
|
- }
|
|
|
- for clusterID, total := range ramTotal {
|
|
|
- if _, ok := toReturn[clusterID]; !ok {
|
|
|
- toReturn[clusterID] = &Totals{}
|
|
|
- }
|
|
|
- toReturn[clusterID].MemCost = total
|
|
|
- }
|
|
|
-
|
|
|
- storageTotal, err := resultToTotal(resultStorage)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("Error for query %s: %s", qStorage, err.Error())
|
|
|
- }
|
|
|
- for clusterID, total := range storageTotal {
|
|
|
- if _, ok := toReturn[clusterID]; !ok {
|
|
|
- toReturn[clusterID] = &Totals{}
|
|
|
- }
|
|
|
- toReturn[clusterID].StorageCost = total
|
|
|
- }
|
|
|
-
|
|
|
- return toReturn, nil
|
|
|
-}
|
|
|
-
|
|
|
-// AverageClusterTotals gives the current full cluster costs averaged over a window of time.
|
|
|
-// Used to be ClutserCosts, but has been deprecated for that use.
|
|
|
-func AverageClusterTotals(cli prometheus.Client, provider cloud.Provider, windowString, offset string) (*Totals, error) {
|
|
|
- // turn offsets of the format "[0-9+]h" into the format "offset [0-9+]h" for use in query templatess
|
|
|
- fmtOffset := ""
|
|
|
- if offset != "" {
|
|
|
- fmtOffset = fmt.Sprintf("offset %s", offset)
|
|
|
- }
|
|
|
-
|
|
|
- localStorageQuery := provider.GetLocalStorageQuery(windowString, offset, true)
|
|
|
- if localStorageQuery != "" {
|
|
|
- localStorageQuery = fmt.Sprintf("+ %s", localStorageQuery)
|
|
|
- }
|
|
|
-
|
|
|
- qCores := fmt.Sprintf(queryClusterCores, windowString, fmtOffset, windowString, fmtOffset, windowString, fmtOffset)
|
|
|
- qRAM := fmt.Sprintf(queryClusterRAM, windowString, fmtOffset, windowString, fmtOffset)
|
|
|
- qStorage := fmt.Sprintf(queryStorage, windowString, fmtOffset, windowString, fmtOffset, localStorageQuery)
|
|
|
- qTotal := fmt.Sprintf(queryTotal, localStorageQuery)
|
|
|
-
|
|
|
- resultClusterCores, err := Query(cli, qCores)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- resultClusterRAM, err := Query(cli, qRAM)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- resultStorage, err := Query(cli, qStorage)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- resultTotal, err := Query(cli, qTotal)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- coreTotal, err := resultToTotal(resultClusterCores)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- ramTotal, err := resultToTotal(resultClusterRAM)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- storageTotal, err := resultToTotal(resultStorage)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- clusterTotal, err := resultToTotal(resultTotal)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- defaultClusterID := os.Getenv(clusterIDKey)
|
|
|
-
|
|
|
- return &Totals{
|
|
|
- TotalCost: clusterTotal[defaultClusterID],
|
|
|
- CPUCost: coreTotal[defaultClusterID],
|
|
|
- MemCost: ramTotal[defaultClusterID],
|
|
|
- StorageCost: storageTotal[defaultClusterID],
|
|
|
- }, nil
|
|
|
-}
|
|
|
-
|
|
|
// ClusterCostsOverTime gives the full cluster costs over time
|
|
|
func ClusterCostsOverTime(cli prometheus.Client, provider cloud.Provider, startString, endString, windowString, offset string) (*Totals, error) {
|
|
|
localStorageQuery := provider.GetLocalStorageQuery(windowString, offset, true)
|
|
|
@@ -588,7 +410,6 @@ func ClusterCostsOverTime(cli prometheus.Client, provider cloud.Provider, startS
|
|
|
// causes the qTotal query to return no data. Instead, query only node costs.
|
|
|
// If that fails, return an error because something is actually wrong.
|
|
|
qNodes := fmt.Sprintf(queryNodes, localStorageQuery)
|
|
|
- klog.Infof("[Debug] ClusterCostsOverTime: nodes query: %s", qNodes)
|
|
|
|
|
|
resultNodes, err := QueryRange(cli, qNodes, start, end, window)
|
|
|
if err != nil {
|
|
|
@@ -608,5 +429,4 @@ func ClusterCostsOverTime(cli prometheus.Client, provider cloud.Provider, startS
|
|
|
MemCost: ramTotal,
|
|
|
StorageCost: storageTotal,
|
|
|
}, nil
|
|
|
-
|
|
|
}
|