in custom-metrics-stackdriver-adapter/pkg/adapter/provider/provider.go [139:179]
func (p *StackdriverProvider) getRootScopedMetricBySelector(groupResource schema.GroupResource, selector labels.Selector, escapedMetricName string, metricSelector labels.Selector) (*custom_metrics.MetricValueList, error) {
if !p.useNewResourceModel {
return nil, NewOperationNotSupportedError("Get root scoped metric by selector")
}
if groupResource.Resource != nodeResource {
return nil, NewOperationNotSupportedError(fmt.Sprintf("Get root scoped metric by selector for resource %q", groupResource.Resource))
}
matchingNodes, err := p.kubeClient.Nodes().List(context.Background(), metav1.ListOptions{LabelSelector: selector.String()})
if err != nil {
return nil, err
}
metricName := getCustomMetricName(escapedMetricName)
metricKind, metricValueType, err := p.translator.GetMetricKind(metricName, metricSelector)
if err != nil {
return nil, err
}
result := []custom_metrics.MetricValue{}
for i := 0; i < len(matchingNodes.Items); i += translator.MaxNumOfArgsInOneOfFilter {
sliceSegmentEnd := min(i+translator.MaxNumOfArgsInOneOfFilter, len(matchingNodes.Items))
nodesSlice := &v1.NodeList{Items: matchingNodes.Items[i:sliceSegmentEnd]}
stackdriverRequest, err := translator.NewQueryBuilder(p.translator, metricName).
WithNodes(nodesSlice).
WithMetricKind(metricKind).
WithMetricValueType(metricValueType).
WithMetricSelector(metricSelector).
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.GetNodeItems(matchingNodes), groupResource, escapedMetricName, metricSelector)
if err != nil {
return nil, err
}
result = append(result, slice...)
}
return &custom_metrics.MetricValueList{Items: result}, nil
}