func()

in prometheus-to-sd/translator/prometheus.go [103:137]


func (p *PrometheusResponse) Build(ctx context.Context, config *config.CommonConfig, metricDescriptorCache *MetricDescriptorCache) (map[string]*dto.MetricFamily, error) {
	format := expfmt.ResponseFormat(p.header)
	if format.FormatType() == expfmt.TypeUnknown {
		return nil, fmt.Errorf("failed to parse format from header: %s", p.header.Get("Content-Type"))
	}
	decoder := expfmt.NewDecoder(bytes.NewReader(p.rawResponse), format)
	metrics := make(map[string]*dto.MetricFamily)
	for {
		metric := &dto.MetricFamily{}
		err := decoder.Decode(metric)
		if err == io.EOF {
			break
		}
		if err != nil {
			return nil, err
		}
		metrics[metric.GetName()] = metric
	}

	if config.OmitComponentName {
		metrics = OmitComponentName(metrics, config.SourceConfig.Component)
	}
	if config.DowncaseMetricNames {
		metrics = DowncaseMetricNames(metrics)
	}
	// Convert summary metrics into metric family types we can easily import, since summary types
	// map to multiple stackdriver metrics.
	metrics = FlattenSummaryMetricFamilies(metrics)
	if strings.HasPrefix(config.SourceConfig.MetricsPrefix, customMetricsPrefix) {
		metricDescriptorCache.UpdateMetricDescriptors(ctx, metrics, config.SourceConfig.Whitelisted)
	} else {
		metricDescriptorCache.ValidateMetricDescriptors(metrics, config.SourceConfig.Whitelisted)
	}
	return metrics, nil
}