diff --git a/lib/promscrape/scrapework.go b/lib/promscrape/scrapework.go index 95f068b807..98e564d8d1 100644 --- a/lib/promscrape/scrapework.go +++ b/lib/promscrape/scrapework.go @@ -904,14 +904,24 @@ func (sw *scrapeWork) addAutoTimeseries(wc *writeRequestCtx, name string, value func (sw *scrapeWork) addRowToTimeseries(wc *writeRequestCtx, r *parser.Row, timestamp int64, needRelabel bool) { metric := r.Metric - if needRelabel && isAutoMetric(metric) { - if !sw.Config.HonorLabels && len(r.Tags) == 0 { - bb := bbPool.Get() - bb.B = append(bb.B, "exported_"...) - bb.B = append(bb.B, metric...) - metric = bytesutil.InternBytes(bb.B) - bbPool.Put(bb) - } + + // Add `exported_` prefix to metrics, which clash with the automatically generated + // metric names only if the following conditions are met: + // + // - The `honor_labels` option isn't set to true in the scrape_config. + // If `honor_labels: true`, then the scraped metric name must remain unchanged + // because the user explicitly asked about it in the config. + // - The metric has no labels (tags). If it has labels, then the metric value + // will be written into a separate time series comparing to automatically generated time series. + // + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3557 + // and https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406 + if needRelabel && !sw.Config.HonorLabels && len(r.Tags) == 0 && isAutoMetric(metric) { + bb := bbPool.Get() + bb.B = append(bb.B, "exported_"...) + bb.B = append(bb.B, metric...) + metric = bytesutil.InternBytes(bb.B) + bbPool.Put(bb) } labelsLen := len(wc.labels) targetLabels := sw.Config.Labels.GetLabels()