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
}