func()

in custom-metrics-stackdriver-adapter/pkg/adapter/provider/provider.go [244:317]


func (p *StackdriverProvider) getNamespacedMetricBySelector(groupResource schema.GroupResource, namespace string, labelSelector labels.Selector, escapedMetricName string, metricSelector labels.Selector) (*custom_metrics.MetricValueList, error) {
	if groupResource.Resource != podResource {
		return nil, NewOperationNotSupportedError(fmt.Sprintf("Get namespaced metric by selector for resource %q", groupResource.Resource))
	}
	matchingPods, err := p.kubeClient.Pods(namespace).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector.String()})
	if err != nil {
		return nil, err
	}
	metricName := getCustomMetricName(escapedMetricName)
	klog.V(4).Infof("Querying for metric: %s", metricName)

	metricKind, metricValueType, err := p.translator.GetMetricKind(metricName, metricSelector)
	if err != nil {
		return nil, err
	}

	queryBuilder := translator.NewQueryBuilder(p.translator, metricName).
		WithMetricKind(metricKind).
		WithMetricSelector(metricSelector).
		WithMetricValueType(metricValueType).
		WithNamespace(namespace)

	result := []custom_metrics.MetricValue{}
	for i := 0; i < len(matchingPods.Items); i += translator.MaxNumOfArgsInOneOfFilter {
		sliceSegmentEnd := min(i+translator.MaxNumOfArgsInOneOfFilter, len(matchingPods.Items))
		podsSlice := &v1.PodList{Items: matchingPods.Items[i:sliceSegmentEnd]}
		stackdriverRequest, err := queryBuilder.WithPods(podsSlice).Build()
		if err != nil {
			return nil, err
		}
		stackdriverResponse, err := stackdriverRequest.Do()
		if err != nil {
			return nil, err
		}
		slice, err := p.translator.GetRespForMultipleObjects(stackdriverResponse, p.translator.GetPodItems(matchingPods), groupResource, escapedMetricName, metricSelector)
		if err != nil {
			return nil, err
		}
		result = append(result, slice...)
	}

	if p.fallbackForContainerMetrics && len(result) == 0 {
		for i := 0; i < len(matchingPods.Items); i += translator.MaxNumOfArgsInOneOfFilter {
			sliceSegmentEnd := min(i+translator.MaxNumOfArgsInOneOfFilter, len(matchingPods.Items))
			podsSlice := &v1.PodList{Items: matchingPods.Items[i:sliceSegmentEnd]}
			stackdriverRequest, err := translator.NewQueryBuilder(p.translator, metricName).
				AsContainerType().
				WithPods(podsSlice).
				WithMetricKind(metricKind).
				WithMetricValueType(metricValueType).
				WithMetricSelector(metricSelector).
				WithNamespace(namespace).
				Build()
			if err != nil {
				return nil, err
			}
			stackdriverResponse, err := stackdriverRequest.Do()
			if err != nil {
				return nil, err
			}
			err = p.translator.CheckMetricUniquenessForPod(stackdriverResponse, escapedMetricName)
			if err != nil {
				return nil, err
			}
			slice, err := p.translator.GetRespForMultipleObjects(stackdriverResponse, p.translator.GetPodItems(matchingPods), groupResource, escapedMetricName, metricSelector)
			if err != nil {
				return nil, err
			}
			result = append(result, slice...)
		}
	}

	return &custom_metrics.MetricValueList{Items: result}, nil
}