func()

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
}