in pkg/client/custom_api/client.go [146:202]
func (mc *metricsClient) GetMetricBySelector(namespace string, selector labels.Selector, info provider.CustomMetricInfo, metricSelector labels.Selector) (*custom_metrics.MetricValueList, error) {
var objects *customMetricsAPI.MetricValueList
var err error
kind, err := mc.mapper.ResourceSingularizer(info.GroupResource.Resource)
if err != nil {
return nil, fmt.Errorf("failed to singularize %s: %v", info.GroupResource.Resource, err)
}
mc.logger.V(1).Info("GetMetricBySelector", "metric_info", info.String())
mc.rwLock.Lock()
defer mc.rwLock.Unlock()
metricName, ok := mc.customMetricNamer.Get(info.Metric)
if !ok {
return nil, fmt.Errorf("metric name alias for custom metric %s/%s not found", namespace, info.Metric)
}
if info.Namespaced {
objects, err = mc.customMetricsClient.NamespacedMetrics(namespace).GetForObjects(
schema.GroupKind{
Group: info.GroupResource.Group,
Kind: kind,
},
selector, metricName, metricSelector,
)
} else {
objects, err = mc.customMetricsClient.RootScopedMetrics().GetForObjects(
schema.GroupKind{
Group: info.GroupResource.Group,
Kind: kind,
},
selector, metricName, metricSelector,
)
}
if err != nil {
return nil, fmt.Errorf("failed to get metric from backend: %v", err)
}
values := make([]custom_metrics.MetricValue, len(objects.Items))
for i, v := range objects.Items {
values[i] = custom_metrics.MetricValue{
DescribedObject: custom_metrics.ObjectReference{
Kind: v.DescribedObject.Kind,
Namespace: v.DescribedObject.Namespace,
Name: v.DescribedObject.Name,
APIVersion: v.DescribedObject.APIVersion,
ResourceVersion: v.DescribedObject.ResourceVersion,
},
Metric: custom_metrics.MetricIdentifier{
Name: v.Metric.Name,
Selector: v.Metric.Selector,
},
Timestamp: v.Timestamp,
WindowSeconds: v.WindowSeconds,
Value: v.Value,
}
}
return &custom_metrics.MetricValueList{
Items: values,
}, nil
}