diff --git a/app/vminsert/influx/request_handler.go b/app/vminsert/influx/request_handler.go index 1cf44929b1..838c0f86de 100644 --- a/app/vminsert/influx/request_handler.go +++ b/app/vminsert/influx/request_handler.go @@ -11,7 +11,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/relabel" "github.com/VictoriaMetrics/VictoriaMetrics/lib/auth" "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompb" parser "github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/influx" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/VictoriaMetrics/lib/tenantmetrics" @@ -95,9 +94,9 @@ func insertRows(at *auth.Token, db string, rows []parser.Row, mayOverrideAccount ctx.metricGroupBuf = append(ctx.metricGroupBuf, *measurementFieldSeparator...) } metricGroupPrefixLen := len(ctx.metricGroupBuf) - var labels []prompb.Label - if !hasRelabeling { - labels = ic.Labels + labels := ic.Labels + if hasRelabeling { + labels = nil } ic.MetricNameBuf = storage.MarshalMetricNameRaw(ic.MetricNameBuf[:0], atCopy.AccountID, atCopy.ProjectID, labels) metricNameBufLen := len(ic.MetricNameBuf) @@ -110,15 +109,14 @@ func insertRows(at *auth.Token, db string, rows []parser.Row, mayOverrideAccount metricGroup := bytesutil.ToUnsafeString(ctx.metricGroupBuf) ic.Labels = ic.Labels[:labelsLen] ic.AddLabel("", metricGroup) - if hasRelabeling { - ic.ApplyRelabeling() - labels = ic.Labels - if len(labels) == 0 { - // Skip metric without labels. - continue - } - } else { - labels = ic.Labels[labelsLen : labelsLen+1] + ic.ApplyRelabeling() // this must be called even if !hasRelabeling in order to remove labels with empty values + if len(ic.Labels) == 0 { + // Skip metric without labels. + continue + } + labels = ic.Labels + if !hasRelabeling { + labels = labels[labelsLen : labelsLen+1] } ic.MetricNameBuf = ic.MetricNameBuf[:metricNameBufLen] for i := range labels { diff --git a/app/vminsert/relabel/relabel.go b/app/vminsert/relabel/relabel.go index 0bcc2d4c68..62ce3afe5e 100644 --- a/app/vminsert/relabel/relabel.go +++ b/app/vminsert/relabel/relabel.go @@ -81,8 +81,29 @@ func (ctx *Ctx) Reset() { // // The returned labels are valid until the next call to ApplyRelabeling. func (ctx *Ctx) ApplyRelabeling(labels []prompb.Label) []prompb.Label { + // Remove labels with empty values, since such labels have no sense. + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/600 . + hasEmptyValues := false + for _, label := range labels { + if len(label.Value) == 0 { + hasEmptyValues = true + break + } + } + if hasEmptyValues { + dst := labels[:0] + for _, label := range labels { + if len(label.Value) == 0 { + continue + } + dst = append(dst, label) + } + labels = dst + } + prcs := prcsGlobal.Load().(*[]promrelabel.ParsedRelabelConfig) if len(*prcs) == 0 { + // There are no relabeling rules. return labels } // Convert src to prompbmarshal.Label format suitable for relabeling. diff --git a/lib/storage/index_db.go b/lib/storage/index_db.go index 777a2055ce..1d306ec4ba 100644 --- a/lib/storage/index_db.go +++ b/lib/storage/index_db.go @@ -761,6 +761,7 @@ func (db *indexDB) SearchTagKeys(accountID, projectID uint32, maxTagKeys int) ([ keys := make([]string, 0, len(tks)) for key := range tks { + // Do not skip empty keys, since they are converted to __name__ keys = append(keys, key) } @@ -828,6 +829,11 @@ func (db *indexDB) SearchTagValues(accountID, projectID uint32, tagKey []byte, m tagValues := make([]string, 0, len(tvs)) for tv := range tvs { + if len(tv) == 0 { + // Skip empty values, since they have no any meaning. + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/600 + continue + } tagValues = append(tagValues, tv) }