func()

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)
}