in custom-metrics-stackdriver-adapter/pkg/adapter/provider/provider.go [183:240]
func (p *StackdriverProvider) getNamespacedMetricByName(groupResource schema.GroupResource, namespace string, name string, escapedMetricName string, metricSelector labels.Selector) (*custom_metrics.MetricValue, error) {
if groupResource.Resource != podResource {
return nil, NewOperationNotSupportedError(fmt.Sprintf("Get namespaced metric by name for resource %q", groupResource.Resource))
}
matchingPod, err := p.kubeClient.Pods(namespace).Get(context.Background(), name, metav1.GetOptions{})
if err != nil {
return nil, err
}
metricName := getCustomMetricName(escapedMetricName)
metricKind, metricValueType, err := p.translator.GetMetricKind(metricName, metricSelector)
if err != nil {
return nil, err
}
queryBuilder := translator.NewQueryBuilder(p.translator, metricName)
pods := &v1.PodList{Items: []v1.Pod{*matchingPod}}
stackdriverRequest, err := queryBuilder.
WithPods(pods).
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
}
if p.fallbackForContainerMetrics && len(stackdriverResponse.TimeSeries) == 0 {
stackdriverRequest, err := queryBuilder.
AsContainerType().
WithPods(pods).
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
}
}
return p.translator.GetRespForSingleObject(stackdriverResponse, groupResource, escapedMetricName, metricSelector, namespace, name)
}