func()

in custom-metrics-stackdriver-adapter/pkg/adapter/translator/response_translator.go [78:108]


func (t *Translator) GetRespForExternalMetric(response *stackdriver.ListTimeSeriesResponse, metricName string) ([]external_metrics.ExternalMetricValue, error) {
	metricValues := []external_metrics.ExternalMetricValue{}
	for _, series := range response.TimeSeries {
		if len(series.Points) <= 0 {
			// This shouldn't happen with correct query to Stackdriver
			return nil, apierr.NewInternalError(fmt.Errorf("Empty time series returned from Stackdriver"))
		}
		// Points in a time series are returned in reverse time order
		point := series.Points[0]
		endTime, err := time.Parse(time.RFC3339, point.Interval.EndTime)
		if err != nil {
			return nil, apierr.NewInternalError(fmt.Errorf("Timeseries from Stackdriver has incorrect end time: %s", point.Interval.EndTime))
		}
		metricValue := external_metrics.ExternalMetricValue{
			Timestamp:    metav1.NewTime(endTime),
			MetricName:   metricName,
			MetricLabels: t.getMetricLabels(series),
		}
		value := *point.Value
		switch {
		case value.Int64Value != nil:
			metricValue.Value = *resource.NewQuantity(*value.Int64Value, resource.DecimalSI)
		case value.DoubleValue != nil:
			metricValue.Value = *resource.NewMilliQuantity(int64(*value.DoubleValue*1000), resource.DecimalSI)
		default:
			return nil, apierr.NewBadRequest(fmt.Sprintf("Expected metric of type DoubleValue or Int64Value, but received TypedValue: %v", value))
		}
		metricValues = append(metricValues, metricValue)
	}
	return metricValues, nil
}