in src/app/backend/integration/metric/sidecar/client.go [190:248]
func (self sidecarClient) allInOneDownload(selector sidecarSelector, metricName string) metricapi.MetricPromises {
result := metricapi.NewMetricPromises(len(selector.Resources))
go func() {
if len(selector.Resources) == 0 {
return
}
rawResults := metricapi.SidecarMetricResultList{}
err := self.unmarshalType(selector.Path+strings.Join(selector.Resources, ",")+"/metrics/"+metricName, &rawResults)
if err != nil {
result.PutMetrics(nil, err)
return
}
if len(result) != len(rawResults.Items) {
log.Printf(`received %d resources from sidecar instead of %d`, len(rawResults.Items), len(result))
}
// rawResult.Items have indefinite order.
// So it needs to be sorted by order of selector.Resources.
mappedResults := map[string]metricapi.SidecarMetric{}
for _, rawResult := range rawResults.Items {
if exists := len(rawResult.UIDs) > 0; exists {
mappedResults[rawResult.UIDs[0]] = rawResult
}
}
sortedResults := make([]metricapi.SidecarMetric, len(selector.Resources))
for i, resource := range selector.Resources {
if mappedResult, exists := mappedResults[resource]; exists {
sortedResults[i] = mappedResult
}
}
for i, rawResult := range sortedResults {
dataPoints := DataPointsFromMetricJSONFormat(rawResult.MetricPoints)
if rawResult.MetricName == "" && len(rawResult.UIDs) == 0 {
result[i].Metric <- nil
result[i].Error <- fmt.Errorf("can not get metrics for %s", selector.Resources[i])
continue
}
result[i].Metric <- &metricapi.Metric{
DataPoints: dataPoints,
MetricPoints: rawResult.MetricPoints,
MetricName: metricName,
Label: metricapi.Label{
selector.TargetResourceType: []types.UID{
selector.Label[selector.TargetResourceType][i],
},
},
}
result[i].Error <- nil
}
return
}()
return result
}