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
}