@@ -25,6 +25,7 @@ import (
25
25
"net/url"
26
26
"regexp"
27
27
"strings"
28
+ "sync"
28
29
"time"
29
30
30
31
"github.com/go-openapi/runtime/middleware"
@@ -977,20 +978,28 @@ func getUsageWidgetsForDeployment(ctx context.Context, prometheusURL string, mAd
977
978
978
979
func unmarshalPrometheus (ctx context.Context , endpoint string , data interface {}) bool {
979
980
httpClnt := GetConsoleHTTPClient (endpoint )
980
- resp , err := httpClnt .Get (endpoint )
981
+
982
+ req , err := http .NewRequestWithContext (ctx , http .MethodGet , endpoint , nil )
983
+ if err != nil {
984
+ ErrorWithContext (ctx , fmt .Errorf ("Unable to create the request to fetch labels from prometheus: %w" , err ))
985
+ return true
986
+ }
987
+
988
+ resp , err := httpClnt .Do (req )
981
989
if err != nil {
982
- ErrorWithContext (ctx , fmt .Errorf ("Unable to fetch labels from prometheus (%s) " , resp . Status ))
990
+ ErrorWithContext (ctx , fmt .Errorf ("Unable to fetch labels from prometheus: %w " , err ))
983
991
return true
984
992
}
993
+
985
994
defer resp .Body .Close ()
986
995
987
- if resp .StatusCode != 200 {
988
- ErrorWithContext (ctx , fmt .Errorf ("Unexpected errors from prometheus (%s)" , resp .Status ))
996
+ if resp .StatusCode != http . StatusOK {
997
+ ErrorWithContext (ctx , fmt .Errorf ("Unexpected status code from prometheus (%s)" , resp .Status ))
989
998
return true
990
999
}
991
1000
992
1001
if err = json .NewDecoder (resp .Body ).Decode (data ); err != nil {
993
- ErrorWithContext (ctx , fmt .Errorf ("Unexpected errors from prometheus (%s) " , resp . Status ))
1002
+ ErrorWithContext (ctx , fmt .Errorf ("Unexpected error from prometheus: %w " , err ))
994
1003
return true
995
1004
}
996
1005
@@ -1081,10 +1090,17 @@ LabelsWaitLoop:
1081
1090
continue
1082
1091
}
1083
1092
1084
- targetResults := make (chan * models.ResultTarget )
1093
+ var (
1094
+ wg sync.WaitGroup
1095
+ targetResults = make ([]* models.ResultTarget , len (m .Targets ))
1096
+ )
1097
+
1085
1098
// for each target we will launch another goroutine to fetch the values
1086
- for _ , target := range m .Targets {
1087
- go func (target Target , inStep * int32 , inStart * int64 , inEnd * int64 ) {
1099
+ for idx , target := range m .Targets {
1100
+ wg .Add (1 )
1101
+ go func (idx int , target Target , inStep * int32 , inStart * int64 , inEnd * int64 ) {
1102
+ defer wg .Done ()
1103
+
1088
1104
apiType := "query_range"
1089
1105
now := time .Now ()
1090
1106
@@ -1145,10 +1161,12 @@ LabelsWaitLoop:
1145
1161
})
1146
1162
}
1147
1163
1148
- targetResults <- & targetResult
1149
- }(target , step , start , end )
1164
+ targetResults [ idx ] = & targetResult
1165
+ }(idx , target , step , start , end )
1150
1166
}
1151
1167
1168
+ wg .Wait ()
1169
+
1152
1170
wdgtResult := models.WidgetDetails {
1153
1171
ID : m .ID ,
1154
1172
Title : m .Title ,
@@ -1161,15 +1179,10 @@ LabelsWaitLoop:
1161
1179
},
1162
1180
}
1163
1181
}
1164
- // count how many targets we have received
1165
- targetsReceived := 0
1166
-
1167
- for res := range targetResults {
1168
- wdgtResult .Targets = append (wdgtResult .Targets , res )
1169
- targetsReceived ++
1170
- // upon receiving the total number of targets needed, we can close the channel to not lock the goroutine
1171
- if targetsReceived >= len (m .Targets ) {
1172
- close (targetResults )
1182
+
1183
+ for _ , res := range targetResults {
1184
+ if res != nil {
1185
+ wdgtResult .Targets = append (wdgtResult .Targets , res )
1173
1186
}
1174
1187
}
1175
1188
return & wdgtResult , nil
0 commit comments