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
}